2017-04-07 4 views
0

TraversalDescription을 사용하여 두 노드 간의 모든 최단 경로를 모두 찾아야합니다.TraversalDescription을 사용하여 최단 경로 찾기

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 
} 

난 단지 한 경로를 가져올 수 :

은 ( Neo4J: shortest paths with specific relation types sequence constrain 나는 사이퍼 절차 allShortestPaths을() 나는 몇 가지 구체적인 평가 나중에 추가 할 필요가 있기 때문에 사용할 수 없습니다).

하지만 사이퍼 쿼리를 실행하는 경우 :

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

동일은 StartNode 및 말단 노드에 대한 발견 두 개 이상의 경로가 있습니다.

모든 (가장 짧은) 경로를 찾기 위해 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

루트는 "prune"입니다. endPoint를 사용하여 첫 번째 경로를 찾으면 통과를 중지합니다. 따라서 다음을 시도하십시오.

TraversalDescription td = graphDb.traversalDescription() 
    .breadthFirst() 
    .evaluator(Evaluators.endNodeIs(Evaluation.INCLUDE_AND_CONTINUE, 
            Evaluation.EXCLUDE_AND_CONTINUE, 
            endNode)); 
관련 문제