我在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。
答案 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。