使用Cypher在可变长度关系的所有节点上指定约束

时间:2014-01-18 10:10:27

标签: neo4j

我在Neo4j数据库中有java类和模块作为节点。它们之间有两种类型的关系:类可以依赖于其他类,模块可以包含类。我想创建一个查询,它在模块中检索一个类的所有传递依赖。

我正在尝试此查询:

MATCH (startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
      (c:Class)<-[:CONTAINS]-(:Module { name :"container"}) return c;

问题是它检索container中的类,可以从container开始通过x.y.Foo之外的类来访问这些类。这不仅是不正确的,而且也很痛苦。是否有可能在Cypher中说出我想要的内容?

节点数为11575,关系为65215,我使用的是Neo4j 2.0.0。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

MATCH p=(startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
      (c:Class)<-[:CONTAINS]-(m:Module { name :"container"}) 
WHERE ALL( n IN nodes(p)[1..-2] WHERE (n)<-[:CONTAINS]-(m))
RETURN c;

另一个选择是用模块标记它们作为标签,然后检查会更有效。

MATCH p=(startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
      (c:Class:`module:container`)<-[:CONTAINS]-(m:Module { name :"container"}) 
WHERE ALL( n IN nodes(p)[1..-2] WHERE (n:`module:container`))
RETURN c;

如果您对此工作感兴趣,请查看此blog post