2017-06-06 3 views
0

Salut J'expérimente avec le routage en utilisant neo4j mais je suis aux prises avec l'adaptation de apoc.algo.dijkstra. Je ne veux pas simplement passer de A à B, mais passer de A à B via C, tout en tenant compte d'une pondération sur le lien.Neo4j - apoc.algo.dijkstra - chemin le plus court de a à b, mais via c, d, e etc

La requête AB est ...

MATCH (startNode:road_node {id:'59030214550942348742a27d'}), (endNode:road_node {id:'59030215550942348742a610'}) 
call apoc.algo.dijkstra(startNode, endNode, 'ROADLINK', 'min_travel_time') YIELD path, weight 
return path, weight/60 

J'ai essayé quelques façons d'inclure une via c mais ne peut le faire fonctionner ... par exemple

MATCH (startNode:road_node {id:'59030214550942348742a27d'}), (endNode:road_node {id:'59030215550942348742a610'}) 
call apoc.algo.dijkstra(startNode, endNode, 'ROADLINK', 'min_travel_time') 
with path, weight 
MATCH (startNode)-[*]-(via:road_node {id:'59030215550942348742a666'})-[*]-(endNode) 
return path, weight 

Toutes les idées ou des suggestions sur la façon d'acheminer de A à B via C, tout en prenant en compte une pondération sur les liens, serait très utile.

Répondre

1

Vous pouvez simplement appeler l'algorithme Dijkstra deux fois, en utilisant via comme noeud final dans le premier appel, puis comme noeud de début dans le second. Le résultat aura 2 sous-chemins et 2 sous-poids (divisé par 60).

MATCH (start:road_node {id:'59030214550942348742a27d'}), (end:road_node {id:'59030215550942348742a610'}), (via:road_node {id:'59030215550942348742a666'}) 
CALL apoc.algo.dijkstra(start, via, 'ROADLINK', 'min_travel_time') YIELD path, weight 
WITH end, via, path AS p1, weight/60 AS w1 
CALL apoc.algo.dijkstra(via, end, 'ROADLINK', 'min_travel_time') YIELD path, weight 
return p1, path AS p2, w1, weight/60 AS w2; 
+0

très soigné, merci. Fonctionne bien – SAB

+0

Génial. N'oubliez pas de [Accepter] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) la réponse qui vous aide le mieux à poser une question. – cybersam