2016-06-05 8 views
1

Ein Knoten A hat 3 verbundene Knoten B1, B2, B3. Diese Bx-Knoten haben wieder die Knoten C1, C2, C3 und C4 verbunden. Auch Knoten A haben 2 verbundene Knoten C5 und C6.Finden Sie verbundene Gruppen über Ebenen

Beginnend mit Knoten A möchte ich alle C-Knoten sammeln. Ich habe eine Abfrage für den A-Knoten durchgeführt, sammle die zwei C-Knoten, dann eine Abfrage für die B-Knoten, sammle wieder alle C-Knoten und führe beide Arrays zusammen. Arbeit, ist aber nicht sehr schlau.

Ich versuchte (Pseudocode)

MATCH (g)<-[:IS_SUBGROUP_OF*1]-(i)-[:HAS_C_NODES]->(c) WHERE g = A.uuid RETURN C_NODES 

Aber ich bekomme entweder alle c-Knoten für A oder für die B-Knoten

Wie würde ich tun, um eine Abfrage, die alle C-Knoten beginnen sammelt mit Knoten A?

* bearbeitet * Hier ist ein Beispiel Daten:

CREATE (a:A), (b1:B1), (b2:B2), (b3:B3), (c1:C1), (c2:C2), (c3:C3), (c4:C4), (a)-[r:HAS]->(c4), (a)-[r1:HAS]->(b1), (a)-[r2:HAS]->(b2), (a)-[r3:HAS]->(b3), (b1)-[r4:HAS]->(c1), (b1)-[r5:HAS]->(c2), (b2)-[r6:HAS]->(c3) 

Eine Abfrage, um alle Knoten mit C zurückkehren sollte beginnen, um ganz gleich, welcher Knoten sie verbunden sind (A oder B).

+0

Es wäre besser, wenn Sie ein Beispiel von Eingabedaten zeigen, das gewünschte Ergebnis und wie versuchen Sie es zu bekommen. –

Antwort

1

Sie können für jeden Knoten mehrere Beschriftungen hinzufügen. Sie sollten dies zu Ihrem Vorteil nutzen und alle B- und C-Knoten in ein zweites Label trennen.

ZB:

CREATE (a:A), (b1:B1:BType), (b2:B2:BType), (b3:B3:BType), (c1:C1:CType), (c2:C2:CType), (c3:C3:CType), (c4:C4:CType), (a)-[r:HAS]->(c4), (a)-[r1:HAS]->(b1), (a)-[r2:HAS]->(b2), (a)-[r3:HAS]->(b3), (b1)-[r4:HAS]->(c1), (b1)-[r5:HAS]->(c2), (b2)-[r6:HAS]->(c3) 

Ich habe Ihre Aussage zur Gruppierung modifiziert, um die alle B-Knoten als: BType Label und alle C-Knoten als: CType Label.

Sie können einfach das optionale Schlüsselwort match verwenden, um selektiv durch die Beziehungen zu traversieren, sofern sie vorhanden sind und die gewünschten Ergebnisse erhalten.

Wenn Sie möchten, dass beide Gruppen von Knoten zusammen gruppiert werden, können Sie stattdessen diese Anweisung versuchen, die collect() verwendet.

match (a:A)-[:HAS]->(b:BType)-[:HAS]->(c:CType) with a,collect (distinct c) as set1 optional match (a:A)-[:HAS]->(xc:CType) return set1 + collect (distinct xc) as output 
+0

Vielen Dank - das war sehr hilfreich! – user3003715

+0

Froh ich könnte helfen :) – Anomaly211

Verwandte Themen