Beachten Sie, dass das Format der Neo4j Abfrageausgabe für die Zeilen mit Spalten ausgelegt ist, nicht das gewünschte Ausgabeformat, so dass dies macht die Dinge ein wenig kompliziert.
Ich würde empfehlen, nur Ihre Lebensmittel in jeder Zeile auszugeben, mit booleschen Spalten für die Mitgliedschaft in jedem einzelnen einfachen Merkmal, dann in Ihrem Anwendungscode, fügen Sie die Lebensmittel-Objekte in Sätze für jedes Merkmal. Dann können Sie mithilfe der Anwendungslogik alle möglichen Kombinationen von Merkmalen, die Sie benötigen, berechnen und einen Schnittpunkt festlegen, um sie zu generieren.
Dies würde die Neo4j Abfrage sehr einfach machen:
MATCH (f:Food)
WITH f
RETURN f.name, EXISTS((f)-[:IS]->(:Trait{name:'tangy'})) AS tangy,
EXISTS((f)-[:IS]->(:Trait{name:'sweet'})) AS sweet,
EXISTS((f)-[:IS]->(:Trait{name:'sour'})) AS sour,
EXISTS((f)-[:IS]->(:Trait{name:'spicy'})) AS spicy
Das heißt, wenn man die ganze Sache mit einem Neo4j Abfrage zu tun entschlossen sind, es chaotisch sein wird, da Sie brauchen Verfolgen und generieren Sie alle Kombinationen, die Sie selbst benötigen. Für Kreuzungsoperationen sollten Sie die APOC procedures library installieren.
Es scheint mir, dass der beste Start ist, Sets von Essen Knoten nach jedem einzelnen Merkmal zu erstellen.
MATCH (f:Food)-[:IS]->(:Trait{name:'spicy'})
WITH COLLECT(f) AS spicyFood
MATCH (f:Food)-[:IS]->(:Trait{name:'sour'})
WITH COLLECT(f) AS sourFood, spicyFood
MATCH (f:Food)-[:IS]->(:Trait{name:'sweet'})
WITH COLLECT(f) AS sweetFood, sourFood, spicyFood
MATCH (f:Food)-[:IS]->(:Trait{name:'tangy'})
WITH COLLECT(f) AS tangyFood, sweetFood, sourFood, spicyFood
Jetzt, wo Sie diese haben, können Sie Ihre Kreuzungen tun mit jeder Kombination der Sie interessiert
CALL apoc.coll.intersection(tangyFood, sweetFood) YIELD value AS tangySweetFood
CALL apoc.coll.intersection(tangyFood, sourFood) YIELD value AS tangySourFood
CALL apoc.coll.intersection(tangyFood, spicyFood) YIELD value AS tangySpicyFood
CALL apoc.coll.intersection(tangySweetFood, sourFood) YIELD value AS tangySweetSourFood
CALL apoc.coll.intersection(tangySweetFood, spicyFood) YIELD value AS tangySweetSpicyFood
CALL apoc.coll.intersection(tangySourFood, spicyFood) YIELD value AS tangySourSpicyFood
CALL apoc.coll.intersection(tangySweetSourFood, spicyFood) YIELD value AS tangySweetSourSpicyFood
CALL apoc.coll.intersection(sweetFood, sourFood) YIELD value AS sweetSourFood
CALL apoc.coll.intersection(sweetFood, spicyFood) YIELD value AS sweetSpicyFood
CALL apoc.coll.intersection(sweetSourFood, spicyFood) YIELD value AS sweetSourSpicyFood
CALL apoc.coll.intersection(sourFood, spicyFood) YIELD value AS sourSpicyFood
RETURN tangyFood, sweetFood, sourFood, spicyFood,
tangySweetFood, tangySourFood, tangySpicyFood,
tangySweetSourFood, tangySweetSpicyFood, tangySourSpicyFood,
tangySweetSourSpicyFood,
sweetSourFood, sweetSpicyFood,
sweetSourSpicyFood,
sourSpicyFood
So zu klären, Züge sind Knoten, und es gibt eine Beziehung zwischen Lebensmitteln an ihren Eigenschaften? So etwas wie (: Essen {Name: 'F1'}) - [: IS] -> (: Merkmal {Name: 'Spicy'})? – InverseFalcon