2017-10-19 111 views
1

我很喜欢Cypher查询,我列出了一个列表,比如说人(['Peter', 'Stacy', 'Olli'])。 我正在寻找所有人,其中有一些3作为他们唯一的朋友。 所以基本上我试图match (p:Person)-[:HAS_FRIEND]->(q:Person) WHERE q.name in ['Peter', 'Stacy', 'Olli']但我想排除那些在列表中有一个朋友不在列表中。Cypher匹配节点与任何不在列表中的节点没有关系

例如鲍勃朋友是彼得和斯泰西。这意味着他应该匹配。 Jans的朋友是Stacy,Olli和Bob。由于鲍勃不在名单上,他不应该被匹配。

我该怎么做?

回答

1

一个稍微复杂的方法应该被淘汰:拥有比与之匹配的所需朋友更多朋友的人。

MATCH (p:Person)-[:HAS_FRIEND]->(friend:Person) 
WHERE friend.name in $friendNames 
WITH p, count(p) as friendHits 
WHERE size((p)-[:HAS_FRIEND]->()) = friendHits 
RETURN p 

friendHits在这种情况下,最大值为$ friendNames集合参数的大小。他们至少和friendHits一样多。如果他们有更多的人,那么他们的朋友不是在输入集合中指定的朋友,而是被过滤掉。

这里的好处是,我们开始从输入集合中与朋友相关联的Person节点扩展,而不必扫描所有:人员和他们的数据库中的朋友,因此您正在查询一个更小的段的分贝。

2

您可以使用ALL功能做到这一点:

MATCH (p:Person)-[:HAS_FRIEND]->(q:Person) 
WITH p, collect(q) as friends 
WHERE ALL(friend in friends WHERE friend.name IN ['Peter', 'Stacy', 'Olli']) 
RETURN p 

这暗号查询将返回:Person节点,所有的朋友都在好友列表中。

+0

按预期工作。谢谢 – Urr4

相关问题