2017-06-06 12 views
0

こんにちは、neo4jを使ったルーティングを試していますが、私はapoc.algo.dijkstraを採用するのに苦労しています。私はちょうどAからBに行きたいとは思っていませんが、リンク上の重み付けを考慮に入れながら、実際にAからBを経由してCを経由します。Neo4j - apoc.algo.dijkstra - aからbへの最短経路ですが、c、d、eなどを経由します。

ABクエリが...

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 

である私は、c経由を含むのいくつかの方法を試してみましたが、それは仕事を得ることができない...例えば

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 

任意のアイデアまたはCを経由してAからBへの経路をどのようにしていくかについての提案は、リンク上の重み付けをカウントすることに非常に役立ちます。

答えて

1

Dijkstraアルゴリズムを呼び出すには、viaを最初の呼び出しのエンドノードとして使用し、次に2番目の呼び出しの開始ノードとして呼び出します。結果には、2つのサブパスと2つのサブウェイト(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

非常にきれいな、ありがとう。うまく動作します – SAB

+0

素晴らしい。あなたが聞いた質問に最も役立つ回答を[同意する](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)することを覚えておいてください。 – cybersam

関連する問題