2017-07-20 5 views
0

Ich habe die folgenden Beziehungen, die (person1)-[:LIKES]->(person2) beschreiben.Cypher: übereinstimmende Knoten, die sowohl Kind A als auch Kind B haben

X1 LIKES Alice, Bob, Carol 
X2 LIKES Alice 
X3 LIKES Bob, Carol, 
X4 LIKES Alice, Bob 

Was ist die Cypher Abfrage, ob ich alle Personen suchen, die sowohl Alice UND Bob mag? (sollte X1 und X4 zurückgeben)

Ich habe versucht MATCH (p1)-[:LIKES]-(p2) WHERE p2.name IN ['Alice', 'Bob'] RETURN p1, p2. Dies gibt jedoch X1, X2, X3 und X4 zurück, die wie Alice Bob sind.

Antwort

0

Wir haben einen Artikel in der Neo4j Knowledge Base zum Schreiben von Abfragen, die perform match intersection, wie Sie hier versuchen, zu tun.

Anwendung die erste Lösung zu diesem Fall eine Abfrage, die Sie verwenden konnten, ist:

MATCH (p1)-[:LIKES]-(p2:Person) 
WHERE p2.name IN ['Alice', 'Bob'] 
WITH p1, count(DISTINCT p2) as likesCount 
WHERE likesCount = 2 
RETURN p1 

Es gibt einige bemerkenswerten Änderungen hier.

Zuerst verwenden wir ein Label: Person auf p2, und ich nehme an, Sie haben einen Index oder eindeutige Einschränkung auf :Person(name), so dass die Suche nach Namen schnell ist.

Wenn für jeden übereinstimmenden Knoten p1 die Anzahl der übereinstimmenden Knoten p2 2 ist, bedeutet dies, dass sowohl Alice als auch Bob vom selben p1 Knoten abgeglichen wurden.

Wenn wir diesen Ansatz verallgemeinern wollten, zum Beispiel, wenn wir einen Listenparameter von Namen unbekannter Größe akzeptierten, würden wir die Zählung stattdessen mit der Größe der Eingabeliste vergleichen.

Verwandte Themen