2016-08-05 29 views
-1

Ich möchte für verschiedene Dinge abfragen und eine Kombination von Beziehungen zurückgegeben. Im folgenden Beispiel möchte ich alle Personen mit dem Namen Joe, die auf der Main Street leben, zurückgeben. Ich möchte die Beziehungen has_address und has_state zurückgeben.Zurück Neo4J Kombinierte Beziehungen bei der Suche über mehrere Beziehungstypen

MATCH (p:Person), 
    (p)-[r:has_address]-(a:Address), 
    (a)-[r1:has_state]-(s:State) 
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*" 
RETURN r, r1; 

Aber wenn ich diese Abfrage in der Neo4j Browser laufen und sehen Sie unter „Text“ Blick scheint es, r und r1 als Spalten in einer Tabelle (so etwas wie diese) zu setzen:

│r │r1 │ 
╞═══╪═══| 
│{} │{} │ 

anstatt wie bei jeder Beziehung auf einer anderen Zeilen gewünscht wird, wie:

Joe Smith | has_address | 1 Main Street 
1 Main Street | has_state | NY 
Joe Richards | has_address | 22 Main Street 

mag ich an anderer Stelle für die Filterung diese als CSV-Datei zum Download bereit. Wie schreibe ich die Abfrage in Neo4J neu, um das gewünschte Ergebnis zu erhalten?

Antwort

0

Sie können sich die Cypher cheat sheet, insbesondere die Relationship-Funktionen ansehen.

Das heißt, Sie haben Variablen auf allen Knoten, die Sie benötigen. Sie können alle Daten, die Sie benötigen, für jede Zeile ausgeben.

MATCH (p:Person), 
    (p)-[r:has_address]-(a:Address), 
    (a)-[r1:has_state]-(s:State) 
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*" 
RETURN p.name AS name, a.street AS address, s.name AS state 

Das sollte genug sein.

Was Sie nach oben zu fragen scheinen, ist ein Weg zu union r und r1, aber so, dass sie sich abwechseln, eine Zeile ist r und die nächste ist die entsprechende r1. Dies ist eine ziemlich untypische Art von Abfrage, und daher gibt es nicht viel Unterstützung für die einfache Erstellung dieser Art von Ausgabe.

Wenn es Ihnen nichts ausmacht, dass Zeilen nicht in Ordnung sind, ist es einfach zu machen, aber Ihre Start- und Endknoten für jede Beziehung sind nicht mehr die gleiche Art von Sache.

MATCH (p:Person), 
    (p)-[r:has_address]-(a:Address), 
    (a)-[r1:has_state]-(s:State) 
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*" 
WITH COLLECT(r) + COLLECT(r1) as rels 
UNWIND rels AS rel 
RETURN startNode(rel) AS start, type(rel) AS type, endNode(rel) as end