我有许多与关系相关的不同节点。在这些关系上,我使用了一些 Enum 类型的属性,并且我尝试使用 Cyper 语言查询这些关系,并且只返回那些具有 Enum 属性的数组。此外,我试图查询的关系是另一个具有我要查询的属性的关系的子类。这是一个例子:
@RelationshipEntity
public class Mother {
@Indexed(level=Level.INSTANCE) Visibility visibility;
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
}
public class Child extends Mother {
@StartNode StartNode start;
@EndNode EndNode end;
}
想象一下,可见性是一个可以是私有、网络或公共的枚举。然后在存储库中我尝试了以下查询,但它总是返回所有内容或引发错误:
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r")
Iterable<Child> findChildren(StartNode start);
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=\"Private\" return r")
Iterable<Child> findChildren(StartNode start);
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=Private return r")
Iterable<Child> findChildren(StartNode start);
我真正想使用的是“IN”运算符,但这会引发错误,就像它不知道 IN 是什么一样。
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in ['Private', 'Network'] return r")
Iterable<Child> findChildren(StartNode start);
我的可见性没有被索引吗?还是我不应该这样做?我没有尝试通过字符串更改 Visibility 属性,我认为这应该可以工作,因为我有其他可以成功查询的字符串属性。使用“IN”运算符是一个奖励!
编辑 1:我正在使用 spring-data-neo4j 2.0.1.RELEASE。我正在尝试在单元测试中使用 执行此操作org.neo4j.test.ImpermanentGraphDatabase
,但我刚刚意识到查询@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r")
在运行服务器时使用默认配置时有效,但在单元测试中仍然无效。此外,即使在运行服务器时,“IN”子句仍然会引发错误。这与我使用的版本有关吗?我记得尝试使用更新的版本,但依赖项失败了,也许我应该再试一次。
编辑2:所以我将spring-data-neo4j的版本更新为2.1.0.BUILD-SNAPSHOT,也将neo4j版本升级为1.7。现在,“IN”关键字没有错误,但我不知道应该使用什么语法来传递要搜索的值。所以有
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in [{1}] return r")
Iterable<Child> findChildren(StartNode start, String visibility);
Public
如果我传递一个简单的字符串Public, Private
(Public
如 我也尝试更改String visibility
a的参数String[] visibility
,但这根本不起作用。