Ich versuche, mit Cypher eine Abfrage zu erstellen, die fehlende Zutaten, die ein Koch möglicherweise hat, "findet". Mein Diagramm ist folgendermaßen eingerichtet:
(ingredient_value)-[:is_part_of]->(ingredient)
(ingredient)
hätte einen Schlüssel / Wert von name = "Farbstofffarben". (ingredient_value)
könnte einen Schlüssel / Wert von value = "red" haben und "is part of" the (ingredient, name="dye colors")
.
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
Ich verwende diese Abfrage, um alle ingredients
, aber nicht die tatsächlichen Werte zu erhalten, die ein Rezept erfordert, aber ich möchte, dass nur die zurückgegeben werden ingredients
, die der Küchenchef nicht hat, anstelle aller Zutaten, die jedes Rezept benötigt. Ich habe es versucht
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef
aber das gab nichts zurück.
Ist dies etwas, das von cypher / neo4j erreicht werden kann, oder ist dies etwas, das am besten gehandhabt werden kann, indem alle Zutaten zurückgegeben und selbst sortiert werden?
Bonus: Es gibt auch eine Möglichkeit, mit Chiffre alle Werte, die ein Koch hat, mit allen Werten abzugleichen, die ein Rezept benötigt. Bisher habe ich nur alle Teilübereinstimmungen zurückgegeben, die von a zurückgegeben werden, chef-[:has_value]->ingredient_value<-[:requires_value]-recipe
und die Ergebnisse selbst aggregiert.
exists
in einerWHERE
Klausel (auch negieren) auch neo4j.com/developer/subqueries/#existential-subqueries für weitere Informationen verwenden.Antworten:
Update 10.01.2013:
Ist in der Neo4j 2.0- Referenz darauf gestoßen :
Versuchen Sie, keine optionalen Beziehungen zu verwenden. Über alles,
benutze sie nicht so:
MATCH a-[r?:LOVES]->() WHERE r IS NULL
wo Sie nur sicherstellen, dass sie nicht existieren.Tun Sie dies stattdessen so:
Verwenden von cypher zum Überprüfen, ob keine Beziehung besteht:
Das ? mark macht die Beziehung optional.
ODER
In neo4j 2 mache ich:
Jetzt können Sie nach nicht vorhandenen (Null-) Beziehungen suchen.
quelle
MATCH a...
Beispiel sollte jetzt seinMATCH (a) WHERE NOT (a)-[:LOVES]->()
Zum Abrufen von Knoten ohne Beziehung
Dies ist die gute Option, um zu überprüfen, ob eine Beziehung besteht oder nicht
Sie können auch mehrere Bedingungen dafür überprüfen. Es werden alle Knoten zurückgegeben, die keine Beziehung "gespielt" oder "nicht gespielt" haben.
Knoten abrufen, die keine Beziehung haben
Es wird überprüft, ob der Knoten keine eingehende / ausgehende Beziehung hat.
quelle
MATCH (player) WHERE NOT (player)-[r]-() RETURN player
gibt Variable r nicht definierten Fehler. Wie kann ich r definieren?(player -[:rel]- ()
) oder lassen Sie sie für eine Beziehung leer(player -[]- ()
MATCH (player) WHERE NOT (player)-[]-() RETURN player
- Es funktioniert gutWenn Sie eine "bedingte Ausschluss" -Semantik benötigen, können Sie dies auf diese Weise erreichen.
Ab neo4j 2.2.1 können Sie
OPTIONAL MATCH
Klausel verwenden und die nicht übereinstimmenden (NULL
) Knoten herausfiltern .Es ist auch wichtig, eine
WITH
Klausel zwischen den KlauselnOPTIONAL MATCH
und zu verwendenWHERE
, damit die ersteWHERE
eine Bedingung für die optionale Übereinstimmung definiert und die zweiteWHERE
sich wie ein Filter verhält.Angenommen, wir haben zwei Arten von Knoten:
Person
undCommunication
. Wenn ich alle Personen erhalten möchte, die noch nie telefonisch kommuniziert haben, aber möglicherweise auf andere Weise kommuniziert haben, würde ich folgende Abfrage stellen:Das Übereinstimmungsmuster stimmt alle Personen mit ihrer Kommunikation überein, wo
c
diesNULL
für nicht-telefonische Kommunikation vorgesehen ist. Dann filtert der Filter (WHERE
nachherWITH
) die Telefonkommunikation heraus und lässt alle anderen übrig.Verweise:
http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional
quelle
Ich habe eine Zusammenfassung geschrieben, die zeigt, wie dies mit Cypher 2.0 ganz natürlich gemacht werden kann
http://gist.neo4j.org/?9171581
Der entscheidende Punkt ist, die optionale Übereinstimmung mit verfügbaren Zutaten zu verwenden und diese dann mit dem Filter für fehlende (Null-) Zutaten oder Zutaten mit dem falschen Wert zu vergleichen.
Beachten Sie, dass der Begriff deklarativ ist und keinen Algorithmus beschreiben muss. Schreiben Sie einfach auf, was Sie benötigen.
quelle
Ich habe diese Aufgabe mit Gremlin erledigt. Ich tat
Dies gab die Wege aller fehlenden Zutaten zurück. Ich konnte dies zumindest für Version 1.7 nicht in der Chiffriersprache formulieren.
quelle
Die letzte Abfrage sollte lauten:
Dieses Muster:
(ingredient)<-[:has_ingredient*0..0]-chef
Ist der Grund, warum es nichts zurückgegeben hat.
*0..0
bedeutet, dass die Länge der Beziehungen Null sein muss, was bedeutet, dass Zutat und Koch derselbe Knoten sein müssen, der sie nicht sind.quelle