2013-02-11 13 views
9

Sto lavorando a un progetto in cui devo trattare con i grafici ... Sto utilizzando un grafico per ottenere percorsi in autobus e in bicicletta tra due fermate.Ottieni tutti gli itinerari tra due nodi neo4j

Il fatto è che tutta la mia relazione contiene il tempo necessario per passare dal punto di partenza della relazione e alla fine.

Per ottenere il percorso più breve tra il nodo, sto utilizzando la funzione di percorso più breve di cypher. Ma qualcosa, il percorso più breve non è il più veloce ....

C'è un modo per ottenere tutti i percorsi tra due nodi non collegati da una relazione?

Grazie

EDIT:

Infatti cambio il mio grafico, per rendere più facile. Quindi ho ancora tutti i miei nodi. Ora il tipo di relazione corrisponde al tempo necessario per passare da un nodo a un altro.

La funzione ShortestPath di cypher fornisce il percorso che contiene meno relazioni. Mi piacerebbe che restituisse il percorso in cui l'aggiunta di tutti i tipi (l'ora) è la più piccola .. È possibile?

Grazie

+0

È necessario utilizzare Cypher? Posso pensare ad alcuni script gremlin che stamperanno questo aspetto che dovrebbe essere abbastanza carino. – Nicholas

+0

Infatti sto usando nodeJs .. E ho una libreria per interrogare il mio grafo neo4j che mi permette di fare qualche query in cript ... e non gremlin query ... –

risposta

11

In cifra, per ottenere tutti i percorsi tra due nodi non collegati da una relazione, e ordina per un totale di un peso, è possibile utilizzare la funzione di ridurre introdotta in 1.9:

start a=node(...), b=node(...) // get your start nodes 
match p=a-[r*2..5]->b // match paths (best to provide maximum lengths to prevent queries from running away) 
where not(a-->b) // where a is not directly connected to b 
with p, relationships(p) as rcoll // just for readability, alias rcoll 
return p, reduce(totalTime=0, x in rcoll: totalTime + x.time) as totalTime 
order by totalTime 

si può buttare un limite 1 alla fine, se è necessario solo il più breve.

+0

Cosa intendi con "ottenere tutti i percorsi tra due nodi non collegati da una relazione"? Come può essere formato un percorso tra i nodi se non sono collegati dalle relazioni? –

+0

Non collegato direttamente, intendevo. (nota anche, questa è piuttosto vecchia ... la sintassi non funzionerà nemmeno in questi giorni). Si prega di consultare Apoc in 3.0 per alcuni modi migliori per farlo. –

4

È possibile utilizzare l'algoritmo di Dijkstra/Astar, che sembra essere una misura perfetta per voi. Date un'occhiata a http://api.neo4j.org/1.8.1/org/neo4j/graphalgo/GraphAlgoFactory.html

Purtroppo non è possibile utilizzare quelli di Cypher.

+0

Sì, ho pensato di farlo .. Ho solo volevo sapere se c'era un modo per ottenere tutto il percorso tra due nodi con Cypher perché dopo aver ottenuto tutto il percorso possibile, potevo analizzarli e ottenere quello più veloce .. e usare Cypher per ottenere quelli sarebbe più facile per me perché io m usando neo4j con nodejs. –

+1

Anche se per prima cosa ottenere tutti i percorsi tra due nodi e poi filtrare è potenzialmente molto più lento, perché l'algoritmo non può essere intelligente e selezionare subito i percorsi migliori, cioè prendere "scorciatoie" –

+6

Noi probabilmente dovrebbe esporre un po 'più di quegli algoritmi per cifrare in qualche modo. –

Problemi correlati