2016-08-01 13 views
0

Ich habe eine komplexe Abfrage, die ich versuche, mit OPTIONAL MATCH Aussagen zu tun. Es sieht wie folgt aus:Neo4j Cypher - Spalten zusammenführen und eindeutige Werte aus allen bekommen

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
RETURN DISTINCT target1,target2,target3,target4 

Was ich will ist, die Ergebnisse zu tun bekommen, als ob sie eine einzige Säule waren target genannt, anstatt sich target1, target2, target3 und target4 zurück als separate Spalten.

Gibt es eine Möglichkeit, die vier möglichen Zielspalten zu sammeln/abzuwickeln, um sie als einspaltige Ergebnismenge zurückzugeben?

Ich weiß, ich könnte das gewünschte Ergebnis mit einem UNION von vier separaten Abfragen erhalten, die einen Wert namens target zurückgeben, aber ich fragte mich, ob es einen besseren Weg gab.

Danke.

Antwort

0

Ja, das ist möglich, und Sie sind auf dem richtigen Weg. Hier ist ein Beispiel sammeln und entspannen Sie mit diesem tun:

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
WITH p, COLLECT(target1) as target1s 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
WITH p, target1s, COLLECT(target2) as target2s 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
WITH p, target1s, target2s, COLLECT(target3) as target3s 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
WITH target1s + target2s + target3s + COLLECT(target4) AS targets 
UNWIND targets AS target 
RETURN DISTINCT target 

Beachten Sie, dass Sie sollten die zum Einsturz der Lage sein: managt und: Stützt optional Streichhölzer in einem einzigen [: Leitet | STÜTZT] Beziehung, wie der Rest der Pfad ist der gleiche.

+0

Das ist genau das Beispiel, das ich brauchte, um 'collect' und' with' in den Griff zu bekommen. Vielen Dank. –