2017-01-23 8 views
1

Я пытаюсь найти лучший путь между двумя узлами. Я выполняю два способаNeo4j - shortestPath на каждом уровне до N-уровней

  1. найти кратчайший путь, используя shortestPath метод()
  2. найти все пути и выбирать лучший путь, используя уменьшить функцию

В первом способе shortestPath() возвращает путь с меньшей степенью разделения. Второй путь возвращает путь, который меньше в агрегированном значении.

Example 1: 
MATCH (a:Person),(b:Person) 
MATCH path=shortestPath((a)-[r*]-(b)) 
RETURN path 


Example 2:  
MATCH (a:Person),(b:Person) 
MATCH path=(a)-[r*]-(b) 
WITH path, REDUCE(distance=0, r IN relationships(path)|distance+r.distance) AS WEIGHT  
RETURN path ORDER BY WEIGHT 

Но в любом случае я не могу найти лучший путь на каждом уровне. То есть
Для разделения 1-й степени - один путь
Разделение второй степени - один путь
Разделение третьей степени - один путь Как мудрый.

Как я могу это достичь?

ответ

2

Итак, для каждой длины пути (ов) вы хотите знать, что представляет собой самый низкий взвешенный путь?

это даст ли вам, что вы хотите:

// Match on all pairs of Person nodes 
MATCH (a:Person),(b:Person) 
// Find all paths in the graph 
MATCH path=(a)-[r*]-(b) 
// Get length of path and reduce to calculate weighted distance for each path 
WITH length(path) AS len, path, REDUCE(distance=0, r IN relationships(path)|distance+r.distance) AS WEIGHT ORDER BY WEIGHT 
// group by length of path and return lowest weighted path for each length 
RETURN len, collect(path)[0] AS paths ORDER BY len 

Редактировать

Как Габор отмечает в своем комментарии, вышеупомянутый подход очень неэффективен и не масштабируется до больших графов. Для больших графиков вы должны использовать алгоритм поиска графа, такой как Dijkstra, который доступен от Cypher с Neo4j's APOC procedueres. Например:

MATCH (from:Person{name:'A'}), (to:Person{name:'D'}) 
CALL apoc.algo.dijkstra(from, to, 'KNOWS', 'distance') yield path as path, weight as weight 
RETURN path, weight 
+0

Это решение работает для небольших графов, но если вы хотите разумную производительность, рекомендуется использовать [алгоритмов на графах АПБО] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/# _graph_algorithms_work_in_progress). –