Spring数据neo4j和用IN关键字查询

时间:2012-06-16 02:09:19

标签: spring neo4j cypher spring-data-neo4j

我有许多与关系相关的不同节点。在这些关系上,我使用了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属性,我认为应该可以工作,因为我有其他可以成功查询的String属性。使用'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的参数String[] visibility,但这根本不起作用。

3 个答案:

答案 0 :(得分:0)

您是否尝试仅针对数据库执行查询?使用neo4j-shell,neoclipse还是服务器?或者以编程方式进行单元测试?如果您的节点和关系存在以及它们具有哪些属性,还要检查数据库。

索引与您的查询无关。

枚举在属性中存储为字符串。

一些注意事项:

  • 你如何创建关系?
  • 实体的私有类可能会导致问题
  • 确保TYPE关系类型确实是您使用的

neo4j console中的这个例子表明它有效。您使用的是什么版本的Neo4j?

答案 1 :(得分:0)

Gillaume:

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

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

此致

拉​​塞

答案 2 :(得分:0)

@Guillaume,

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

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

此致

拉​​塞