Neo4j:匹配多个目标节点

时间:2014-09-19 17:40:07

标签: neo4j cypher

如何有效地构建表单查询:

匹配(a) - [:Foo] - >(b)WHERE(a) - [:Bar] - >(c)AND(a) - [:Bar] - >(d)返回a

的查询
       [Foo]----(b)
(a)---|
       [Bar]----(c)
      |
       [Bar]----(d)

但是我希望有一个可变数量的目标节点与关系Bar(不仅仅是c和d,而是任何节点列表)。

另一种说法:返回' a'如果它与[c,d,...]节点列表有条关系

目前我手动将WHERE子句连接在一起,但我觉得有一种更性感的方法可以做到这一点。

1 个答案:

答案 0 :(得分:3)

是的,有一种更性感的方式。有关Neo4j控制台中的最小设置,请参阅http://console.neo4j.org/r/8zx2l2。我使用了以下密码查询:

MATCH (a:A)-[:Foo]->(b)
WITH a
MATCH (a)-[:Bar]->(other)
WITH a, count(other) AS count
WHERE count=2
RETURN a

WHERE条件检查路径数是否等于您的要求(假设此处为2)。所以你只需要一个支票。这样性感吗?-)?

附录

如果您想确保other节点位于给定目标节点列表中:

MATCH (a:A)-[:Foo]->(b)
WITH a
MATCH (a)-[:Bar]->(other)
WITH a, count(other) AS count, collect(other) as others
WHERE all(x in [c,d,....] WHERE x in others) 
RETURN a

这可确保a与数组Bar中列出的所有节点之间具有[c,d,...]关系。