2015-02-23 27 views
5

Używam Neo4j 2.1.7 i Node.js do zbudowania interfejsu API REST. Dane - około 70 000 węzłów i 100 000 relacji - zawierają bardzo wiele małych połączonych podgraphów.Znajdź węzły i powiązane z nimi podgrafy za pomocą Neo4j + Cypher

Jedno wywołanie API, na przykład localhost:8000/search?name=Bussum, powinno zwrócić wszystkie węzły o nazwach Bussum i połączony komponent, do którego należą.

Ilustracja:

Connected components

(zdjęcie z Wikipedia)

mogę uzyskać wszystkie dane muszę z zapytaniem jak to:

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

ale taka kwerenda po prostu zwróć wszystkie potrójne (a)-[r]-(b) (nie zgrupowane na składnik/podgraph). Oczywiście mogłem zrekonstruować wykres w Node.js i samemu znaleźć podgramy, ale to wcale nie jest najlepsze rozwiązanie. Czy można zgrupować zwrócone dane w tablicy/kolekcji podgrafów/komponentów? Które zapytania Cyphera lepiej pasują do mojego przypadku użycia? Czy powinienem zamiast tego rozważyć użycie Neo4j Java API?

Dzięki! Bert

+0

jak "małe" są podrysami? CZY te na ilustracji reprezentują najmniejszy lub największy? –

+0

Niektóre zawierają jeden wierzchołek, około 100, ale większość między 5 a 10. – Bert

+0

czy węzły w poszczególnych podstrach mają niepowtarzalny identyfikator do tego subaru? –

Odpowiedz

3

Powinieneś nadal mieć swój oryginalny punkt początkowy jako węzeł grupowania.

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

Grupowanie według 'root' zwróci jedną kolekcję ze wszystkimi relacjami ze wszystkich ścieżek. Zamiast tego, myślę, że grupowanie powinno być wykonane przez 'rels'. – zaboco

+0

Czy jest nazwa tej operacji? (znalezienie największego podgraphu zawierającego określony węzeł) –

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

Zapytanie powróci (ewentualnie) wiele rzędów, przy czym każdy rząd jest zbiorem węzłów, które stanowią całość podgrafu tak, że każda subgraph jest tak duża jak to możliwe, i zawiera co najmniej jeden węzeł " Bossum ". Każdy wiersz (subgraph) gwarantuje, że będzie unikalny w zestawie wyników.

* Należy zauważyć, że nie wiem o wydajności tej metody.