Neo4j:匹配多个目标节点

4

如何高效构建以下形式的查询:

MATCH (a)-[:Foo]->(b) WHERE (a)-[:Bar]->(c) AND (a)-[:Bar]->(d) RETURN a

这是一个查询语句,用于查询

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

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

另一种表达方式:如果“a”与节点列表[c,d,...]有Bar关系,则返回“a”。

目前,我手动拼接WHERE子句,但我觉得还有更好的方法。

1个回答

6

是的,有一种更加性感的方法。请查看http://console.neo4j.org/r/8zx2l2,在Neo4j控制台中以最小的设置运行此方法。我使用了以下Cypher查询:

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与数组[c,d,...]中列出的所有节点具有Bar关系。


谢谢,但我需要特定的c、d节点匹配,而不仅仅是具有Bar关系的任何节点。换句话说,如果它与[c、d、...]节点列表具有Bar关系,则返回'a'。还有更多想法吗? - PQuinn
“WHERE all(... WHERE ...)” 语法正是我所需要的。谢谢! - PQuinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接