Ich habe eine Diagrammdatenbank, in der sich Benutzer- und Interessenknoten befinden, die durch IS_INTERESTED Beziehung verbunden sind. Ich möchte Interessen finden, die nicht von einem Benutzer ausgewählt werden. Ich diese Abfrage geschrieben und es funktioniert nichtCypher Query gibt keine nicht vorhandenen Beziehungen zurück
OPTIONAL MATCH (u:User{userId : 1})-[r:IS_INTERESTED] -(i:Interest)
WHERE r is NULL
Return i.name as interest
Nach Antworten auf ähnliche Fragen auf SO (wie this eins), wird die obige Abfrage work.However soll, in diesem Fall es gibt null zurück. Aber wenn Sie die folgende Abfrage ausgeführt funktioniert es wie erwartet:
MATCH (u:User{userId : 1}), (i:Interest)
WHERE NOT (u) -[:IS_INTERESTED] -(i)
return i.name as interest
Der Grund, warum ich will nicht die obige Abfrage auszuführen ist, weil Neo4j eine Warnung gibt:
Diese Abfrage erstellt ein kartesisches Produkt zwischen getrennten Mustern.
Wenn ein Teil einer Abfrage mehrere nicht verbundene Muster enthält, wird ein kartesisches Produkt zwischen all diesen Teilen erstellen. Dies kann eine große Menge an Daten produzieren und Abfrageverarbeitung verlangsamen. Während gelegentlich gedacht, ist es oft möglich sein kann, die Abfrage neu zu formulieren, die die Verwendung dieses Kreuzproduktes vermeidet, vielleicht durch eine Beziehung zwischen den verschiedenen Teilen Hinzufügen oder durch optionales MATCH mit (Kennung: (i))
Was mache ich falsch in der ersten Abfrage, wo ich OPTIONAL MATCH zu nicht vorhandenen Beziehungen zu finden?
Das ist ein kluger Weg! Es funktioniert jetzt. Vielen Dank! – avidProgrammer