2015-02-23 11 views
5

Ich benutze Neo4j 2.1.7 und Node.js, um eine REST API zu erstellen. Die Daten - rund 70.000 Knoten und 100.000 Beziehungen - enthalten sehr viele kleine zusammenhängende Teilgraphen.Finde Knoten und ihre verbundenen Untergraphen mit Neo4j + Cypher

Ein API-Aufruf, z. B. localhost:8000/search?name=Bussum, sollte alle Knoten mit dem Namen Bussum und die verbundene Komponente zurückgeben, zu der sie gehören.

Illustration:

Connected components

(Bild von Wikipedia)

ich alle Daten bekommen kann ich mit einer Abfrage wie folgt benötigen:

MATCH (a {name: "Bussum" })-[r*]-(b) 
UNWIND rels AS rel 
RETURN distinct startNode(rel) AS a, type(rel), endNode(rel) AS b 

Aber eine solche Abfrage einfach zurückgeben alle Tripel (a)-[r]-(b) (nicht gruppiert pro Komponente/Untergraph). Natürlich konnte ich das Diagramm in Node.js rekonstruieren und die Untergraphen selbst finden, aber das ist nicht die beste Lösung. Ist es möglich, die zurückgegebenen Daten in einem Array/einer Sammlung von Untergraphen/Komponenten zu gruppieren? Welche Cypher-Abfragen würden besser zu meinem Anwendungsfall passen? Oder sollte ich stattdessen die Neo4j Java API verwenden?

Danke! Bert

+0

Wie klein sind die Untergraphen? MACHEN die in der Abbildung die kleinsten bis größten? –

+0

Einige enthalten einen Scheitelpunkt, einige 100, aber die Mehrzahl zwischen 5 und 10. – Bert

+0

Haben die Knoten in jedem einzelnen Untergraphen eine eindeutige Kennung für diesen Untergraphen? –

Antwort

3

Sie sollten immer noch Ihren ursprünglichen Startpunkt als Gruppierungsknoten haben.

MATCH (root {name: "Bussum" })-[rels*]-(b) 
UNWIND rels AS rel 
RETURN root, 
     collect({start: startNode(rel), 
       type:  type(rel), 
        end: endNode(rel)}) as component 
+0

Gruppierung nach 'root' würde eine Sammlung mit allen Relationen aus allen Pfaden zurückgeben. Stattdessen denke ich, dass die Gruppierung "rels" erfolgen sollte. – zaboco

+0

Gibt es einen Namen für diese Operation? (Den größten Teilgraphen finden, der einen bestimmten Knoten enthält) –

1
MATCH (a {name: "Bossum"})-[*0..]-(b) 
WITH DISTINCT a, collect(DISTINCT b) AS sets 
RETURN DISTINCT sets 

Diese Abfrage wird zurückkehren (möglicherweise) viele Zeilen, wobei jede Zeile ist eine Sammlung von Knoten, die ein vollständiges Subgraphen solche machen, dass jeder Subgraphen so groß wie möglich ist, und mindestens einen Knoten mit dem Namen " Bossum ". Jede Zeile (Untergrafik) ist garantiert eindeutig in der Ergebnismenge.

* Ich sollte beachten, ich weiß nicht über die Leistung dieser Methode.

Verwandte Themen