2013-08-06 24 views
5

Jak mogę uzyskać stopień każdego pojedynczego węzła na Neo4j, a następnie dowiedzieć się, który węzeł ma największy stopień na bardzo dużym wykresie (2 miliony węzłów i 5 milionów relacji)?Zapytanie o stopień węzła na Neo4j z ogromnym wykresem (milion węzłów i łączy)

wiem, że mogę używać Cypher lub Gremlin, aby to osiągnąć, jak:

start n = node(*) 
match (n)--(c) 
return n, count(*) as connections 
order by connections dsec 

lub

g.V.bothE 

ale RAM mój komputer jest tylko 2G ~ 4G, zawsze czekać na długo i uzyskać "undefined", gdy wydaje kwerendę powyżej ..

czy ktoś ma pewne doświadczenie w kwerendy taki ogromny wykres na neo4j z gremlin lub cypher?

Odpowiedz

2

W największym stopniu powinieneś również ograniczyć wynik, aby cypher mógł zachować tylko 10 najlepszych wyników.

START n = node(*) 
MATCH (n)--(c) 
RETURN n, count(*) as connections 
ORDER BY connections DESC 
LIMIT 10 

Albo można zrobić:

START n = node(*) 
RETURN n, length((n)--(c)) as connections 
ORDER BY connections DESC 
LIMIT 10 

przeciwnym razie zgadzam się ze Stefanem.

+0

Dziękuję Michael, całkowicie zapominam "LIMIT". W każdym razie, bardzo dziękuję. – Arvin

+0

Nawiasem mówiąc, chcę wiedzieć, czy jest jakiś węzeł bez linku, jaki byłby wynik, jeśli zamówię przez wznoszenie? Czy pokaże "0" lub po prostu go pominąć? – Arvin

+0

W drugim poleceniu dostaję błąd składni w linii 2 w pobliżu '(c)', działa, jeśli zastąpisz go '()'. Nie potrzebujesz tego imienia – saeedgnu

1

To jest bardzo kosztowna, globalna operacja. W takim przypadku możesz lepiej skorzystać z unmanaged extension, który używa GlobalGraphOperations.getAllRelationships. Podczas iterowania wszystkich relacji budujesz mapę i zwiększasz licznik dla węzła początkowego i końcowego każdej relacji. Ostatnim krokiem jest znalezienie maksimum na mapie.