2017-10-19 16 views
1

Je suis aux prises avec une requête Cypher où j'ai une liste, disons de People (['Peter', 'Stacy', 'Olli']). Je cherche toutes les personnes, qui ont certains de ces 3 comme leurs seuls amis. Donc, fondamentalement, j'essaie de match (p:Person)-[:HAS_FRIEND]->(q:Person) WHERE q.name in ['Peter', 'Stacy', 'Olli'] mais je veux exclure ceux qui ont au moins un ami qui n'est pas dans la liste. Par exemple, les amis de Bob sont Peter et Stacy. Cela signifie qu'il devrait être jumelé. Les amis Jans sont Stacy, Olli et Bob. Il ne devrait pas être jumelé puisque Bob n'est pas sur la liste.Cypher Correspond à un nœud qui n'a aucune relation avec un nœud qui n'est pas dans une liste

Comment puis-je faire cela?

Répondre

1

Une approche un peu plus complexe devrait éliminer: Les personnes qui ont plus d'amis que les amis qui leur correspondent. dans ce cas

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 a un maximum de la taille du paramètre de collection friendNames $. Ils ont au moins autant d'amis que friendHits. S'ils en ont plus, ils ont d'autres amis que ceux spécifiés dans la collection d'entrée, et sont filtrés. L'avantage ici est que nous commençons à développer à partir des nœuds: Person associés aux amis dans la collection d'entrée, plutôt que d'avoir à tout analyser: Les personnes et leurs amis dans la base de données, donc vous interrogez un segment beaucoup plus petit de la db.

2

Vous pouvez le faire en utilisant la fonction 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 

Cette requête Cypher retourne :Person nœuds que tous les amis sont dans la liste d'amis.

+0

Fonctionne comme prévu. Je vous remercie – Urr4