2017-04-07 16 views
0

TraversalDescriptionを使用して2つのノード間のすべての最短パスを見つける必要があります。TraversalDescriptionを使用して最短パスを見つける

(私は後でいくつかの具体的な評価を追加する必要があるので、私は)(サイファー手順allShortestPathsを使用することはできません。 Neo4J: shortest paths with specific relation types sequence constrain

Node startNode = ...; 
Node endNode = ...; 
TraversalDescription td = graphDb.traversalDescription() 
    .breadthFirst() 
    .evaluator(Evaluators.endNodeIs(Evaluation.INCLUDE_AND_PRUNE, 
            Evaluation.EXCLUDE_AND_CONTINUE, 
            endNode)); 

for (Path path : td.traverse(startNode)) { 
    // only 1 path found 
} 

私は1つだけのパスを取得します。

しかし、私はサイファークエリを実行する場合:

MATCH (startNode{...}) 
MATCH (endNode{...}) 
MATCH path = allShortestPaths((startNode)-[*]-(endNode)) 
RETURN path; 

同じstartNodeとエンドノードが見つかりもっとそして1つのパスがあります。

すべての(最短の)パスを見つけるためにTraversalDescriptionを設定するにはどうすればよいですか?

答えて

0

ヒント:

  1. shortestpathallshortestpthsactually implementedあるかを見てみましょう。コードのコピーを変更して、必要な作業を行うことができます。 TraversaDescriptionはまったく使用されていません。

  2. shortestpathallshortestpths実装の設計に近づくように思われるBidirectionalTraversalDescription「実験」があります。あなたは代わりにそれを使用できるかもしれません。

+0

ありがとうございました。私は 'BidirectionalTraversalDescription'を使用しようとしましたが、結果を得ましたが、重大なパフォーマンスの問題が発生しました: http://stackoverflow.com/questions/43526585/neo4j-set-up-bidirectionaltraversaldescription-for-shortest-paths-search – Kit

0

あなたの問題の根本は「プルーン」です。 endPointを使用して最初のパスを見つけたら、移動を停止します。だからこれを試してください:

TraversalDescription td = graphDb.traversalDescription() 
    .breadthFirst() 
    .evaluator(Evaluators.endNodeIs(Evaluation.INCLUDE_AND_CONTINUE, 
            Evaluation.EXCLUDE_AND_CONTINUE, 
            endNode)); 
関連する問題