如何有效地构建表单查询:
匹配(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子句连接在一起,但我觉得有一种更性感的方法可以做到这一点。
答案 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,...]
关系。