2017-04-07 2 views
0

Je dois trouver tous les chemins les plus courts entre deux nœuds en utilisant TraversalDescription.Trouver tous les chemins les plus courts en utilisant TraversalDescription

(je ne peux pas utiliser allShortestPaths procédure Cypher() parce que je dois ajouter un peu plus tard: évaluateur spécifique 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 
} 

Je reçois seulement 1 chemin.

Mais si je lance la requête Cypher:

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

Il y a plus d'un des chemins trouvés pour la même startNode et nœud terminal. Comment configurer la TraversalDescription pour trouver tous les chemins (les plus courts)?

Répondre

0

Quelques suggestions:

  1. un coup d'oeil sur la façon dont shortestpath et allshortestpths sont actually implemented. Vous pouvez être en mesure de modifier une copie du code pour faire ce que vous voulez. TraversaDescription n'est pas utilisé du tout.

  2. Il y a aussi un « expérimental » BidirectionalTraversalDescription qui semble être plus proche de la conception des implémentations shortestpath et allshortestpths. Vous pourriez peut-être utiliser cela à la place.

+0

Merci pour le conseil. J'ai essayé d'utiliser le 'BidirectionalTraversalDescription', et j'ai même obtenu le résultat, mais j'ai souffert de problèmes de performance significatifs: http://stackoverflow.com/questions/43526585/neo4j-set-up-bidirectionaltraversaldescription-for-shortest-paths-search – Kit

0

la racine de votre problème est "élaguer". Vous arrêtez de parcourir lorsque vous trouvez un premier chemin avec endPoint. Donc, essayez ceci:

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