2013-08-06 16 views
5

Come posso ottenere il grado di ogni singolo nodo su Neo4j, e quindi scoprire quale nodo ha il più grande grado in un enorme grafico (2 milioni di nodi e 5 milioni di relazioni)?query di livello nodo su Neo4j con un grafico enorme (milioni di nodi e collegamenti)

So che posso usare Cypher o Gremlin per ottenere che, come:

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

o

g.V.bothE 

ma la RAM il mio computer ha solo 2G ~ 4G, ho sempre aspettare per un molto tempo e diventa "indefinito" quando invio la query sopra ..

qualcuno ha qualche esperienza di interrogare un grafico così grande su neo4j con gremlin o cypher?

risposta

2

Per la maggior parte, si dovrebbe anche limitare il risultato, quindi Cypher dovrà solo mantenere i primi 10 risultati.

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

Oppure si potrebbe fare:

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

caso contrario, io sono d'accordo con Stefan.

+0

Grazie Michael, ho totalmente dimenticato "LIMIT". Comunque, grazie mille. – Arvin

+0

A proposito, voglio sapere se c'è qualche nodo senza link, quindi quale sarebbe il risultato se ordino per ascend? Mostrerebbe '0' o semplicemente lo salterà? – Arvin

+0

Nel secondo comando, ottengo l'errore di sintassi nella riga 2 vicino a '(c)', funziona se lo sostituisci con '()'. Non hai bisogno del suo nome – saeedgnu

1

Questa è in effetti un'operazione globale molto costosa. In questo caso, è preferibile utilizzare lo unmanaged extension che utilizza GlobalGraphOperations.getAllRelationships. Durante l'iterazione di tutte le relazioni, si crea una mappa e si incrementa il contatore per il nodo iniziale e finale di ogni relazione. Il passo finale è trovare il massimo all'interno della tua mappa.