2016-09-02 6 views
0

Ich habe eine Stammbaum-Grafik. Es gibt ein paar Leute, die mich interessieren und sehen, wer ihre unmittelbare Familie ist. Ich habe eine schöne Abfrage, die die Geschwister von einer Person von Interesse zurück:Kombinieren der Ergebnisse von zwei verschiedenen Abfragen in Neo4j

MATCH (p:Person)-[]-(parent:Person)-[]->(parents_kids:Person) 
WHERE p.`person_of_interest` = 'y' 
RETURN p, parent, parents_kids 
; 

Ich kann auch die Kinder einer Person von Interesse zurück:

MATCH (p:Person)-[]->(children:Person) 
WHERE p.`person_of_interest` = 'y' 
RETURN p, children 
; 

Diese Abfragen funktionieren getrennt, aber wie gebe ich die Ergebnisse zusammen zurück?

Das Problem ist, dass Leute von Interesse manchmal keine Kinder in der Datenbank haben. Auf der anderen Seite haben Leute von Interesse manchmal ihre Eltern nicht in der Datenbank. Daher kann ich keine Abfrage schreiben, um beide Fälle zu berücksichtigen.

Ich bin zu wollen, um eine einfache Tabelle zu erhalten ... Ich bin so etwas wie dieses zu denken, wo es NULL Werte gegebenenfalls:

| person_of_interest | silblings | children | 
|--------------------|-----------|----------| 
|     |   |   | 
|     |   |   | 

Wenn dies unklar ist, ich kann natürlich diese ändern Frage mit einem minimal reproduzierbaren Beispiel. Vielen Dank! parents, siblings und children: Diese Abfrage soll die Person von Interesse und (möglicherweise leeren) Sammlungen seiner Rückkehr

+0

Ich werde in Ihrem ersten Match zwischen p und Eltern annehmen, dass die Richtung der Beziehung von Eltern zu Kind nach unten ist? Bei einer ungerichteten Beziehung stimmen Sie Eltern mit den Eltern und Kindern von p überein (oder mit allen anderen Beziehungen, auf die eine Person verweist). – InverseFalcon

+0

Möchten Sie auch eine Spalte, in der Eltern gesammelt werden, und eine separate Spalte, in der die Kinder gesammelt werden? Oder möchten Sie eine einzelne Spalte, die sowohl die Eltern als auch alle Kinder (falls vorhanden) enthält? Oder etwas anderes? Wenn Sie Ihre gewünschte Abfrage-Ausgabe bereitstellen, würde es uns helfen, eine nützlichere Lösung bereitzustellen. – InverseFalcon

+0

# 1 Ja, ich könnte den Pfeil nach oben setzen, um die Richtung klarer zu machen. In meinem Fall ändert es nichts daran, wie meine Grafik aufgebaut ist, aber danke für die Beobachtung. –

Antwort

2

.

MATCH (p:Person {person_of_interest: 'y'}) 
OPTIONAL MATCH (p)<-[:HAS_CHILD]-(parent:Person) 
OPTIONAL MATCH (parent:Person)-[:HAS_CHILD]->(sib:Person) 
    WHERE sib <> p 
OPTIONAL MATCH (p)-[:HAS_CHILD]->(kid:Person) 
RETURN 
    p, 
    COLLECT(DISTINCT parent) AS parents, 
    COLLECT(DISTINCT sib) AS siblings, 
    COLLECT(kid) AS children; 

Die Abfrage geht davon aus, dass der HAS_CHILD Beziehungstyp die Eltern-Kind-Beziehung zu bezeichnen, verwendet wird.

Um das Finden der Person von Interesse zu beschleunigen, sollten Sie eine index oder unique constraint auf :Person(person_of_interest) erstellen.

+0

Ihr letzter Schnitt hat wirklich alles zusammengebracht. Die Ausgabe ist jetzt eine Liste von Schlüsselpaaren. Das ist fantastisch. Ich werde das von nun an als Basis für viele meiner Arbeiten verwenden. Ich danke dir sehr!! –

Verwandte Themen