2017-10-19 150 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

相關問題