2017-05-25 5 views
0

J'ai une question extraordinairement basique sur Neo4j.Neo4j - Comment trouver le plus court chemin entre deux noeuds

J'ai importé un ensemble de données simple qui contient un certain nombre de nœuds comme 'example_nodes' comme ceci:

sourceId, targetId

Ainsi, ma base de données a une simple table à deux colonnes de sources et cibles. Comment trouver le chemin le plus court entre un sourceId arbitraire et targetId?

Ma première tentative est le long des lignes de:

MATCH (source:example_nodes),(target:example_nodes), 
p = shortestPath((source)--(target)) 
WHERE (source.sourceId) = 1234 AND (target.targetId) = 5678 
return p 

qui ne renvoie aucun enregistrement, quand je vois bien la première ligne dans ma base de données elle-même est un seul chemin:

{"sourceId":"1234","targetId":"5678"}

Qu'est-ce que je fais mal? Ai-je besoin de créer toutes les relations avant que je puisse exécuter une requête (comme tout ce que je l'ai fait jusqu'à présent est importé les noeuds et indices créés)

+0

Oui, pour une requête de chemin le plus court, vous devez d'abord emprunter des chemins. Ne tentez donc pas la requête avant d'avoir des relations dans le graphique. – InverseFalcon

Répondre

1

Vous devriez trouver les source et target d'abord, puis invoquer shortestpath:

MATCH (source:example_nodes),(target:example_nodes) 
WHERE source.sourceId = 1234 AND target.targetId = 5678 
MATCH p = shortestPath((source)-[*]-(target)) 
return p; 

Si cette requête dure trop longtemps, essayez de limiter la longueur de chemin maximale recherchée. Par exemple, utilisez [*..8] pour limiter la longueur à 8.

+0

En fait, une chose que j'ai réalisée est que la cible devrait être 'target.sourceId', n'est-ce pas? Cela dit, le modifier ne retourne toujours aucun enregistrement, est-ce parce que je n'ai pas créé les relations? – waffl

+0

Si vous n'avez pas de telles relations, alors, bien sûr, vous ne trouverez pas :-). – cybersam

+0

Veuillez préciser ce que vous entendez par "la cible devrait être target.sourceId". La requête dans ma réponse est valide, dans la mesure où je comprends votre cas d'utilisation. – cybersam