0

我有许多与关系相关的不同节点。在这些关系上,我使用了一些 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, PrivatePublic如 我也尝试更改String visibilitya的参数String[] visibility,但这根本不起作用。

4

3 回答 3

0

Have you tried to execute the queries just standalone against the db? Either with the neo4j-shell, neoclipse or the server? Or programmatically in a unit-test? And also check the db, if your nodes and relationships are there and which properties they have.

Indexing is not related to your query.

Enums are stored as strings in properties.

Some notes:

  • how do you create the relationships?
  • private classes for entities can probably cause problems
  • make sure that the TYPE relationship-type is really what you use

This example in the neo4j console shows that it works. What version of Neo4j are you using?

于 2012-06-18T10:54:59.630 回答
0

@纪尧姆,

完成:https ://jira.springsource.org/browse/DATAGRAPH-281

它在构建快照中可用,并将在 SDN 2.1.RC4/GA 中

问候,

拉斯

于 2012-09-04T08:33:31.733 回答
0

吉劳姆:

你找到了一个弱点;我提出了一个问题,这将很快得到解决。你可以在这里追踪它:

https://jira.springsource.org/browse/DATAGRAPH-281

问候,

拉斯

于 2012-08-09T14:45:51.613 回答