Найти путь с удельным весом в Neo4J - PullRequest
0 голосов
/ 08 апреля 2019

Для школьного проекта мне нужно найти пути из точки A в точку B с весом X. До сих пор я вставлял все узлы и отношения в базу данных Neo4J.Как вы будете искать этот путь в разумные сроки?

База данных Neo4J содержит около 2,8 миллиона узлов и примерно такое же количество связей.Они вставляются в базу данных с помощью написанной мной программы Go, считывающей данные из файла OSM.

Узлы имеют следующие свойства: nodeId, lat, lon.

Соотношение«РАССТОЯНИЕ» имеет свойство расстояние, которое вычисляется по формуле Винсента .

До сих пор я пробовал ответ, который нашел в этом вопросе stackoverflow: Подходит ли neo4j для поискадорожки определенной длины .Проблема с запросом заключается в том, что увеличение количества переходов занимает огромное количество времени.

Я также пытался использовать алгоритм dijkstra из apoc, но, к сожалению, это всего лишь кратчайший путь.

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

MATCH
  (startNode:Node {nodeId:"597212967"}),
  (endNode:Node {nodeId:"1037604076"}),
  path = (startNode)-[:DISTANCE*45..51]-(endNode)
  WITH path, REDUCE(s = 0, r IN RELATIONSHIPS(path) | s + r.distance) AS weight
  WHERE weight >= 8500 AND weight <= 8600
RETURN path, weight
ORDER BY weight
LIMIT 1;

И это используемый мной запрос apoc dijkstra:

MATCH
  (startNode:Node {nodeId:"597212967"}),
  (endNode:Node {nodeId:"1037604076"})
CALL apoc.algo.dijkstra(startNode, endNode, 'DISTANCE', 'distance') YIELD path AS path, weight AS weight
RETURN path, weight

Я бы хотел получить результат в течение 5 секунд или меньше.С помощью алгоритма dijkstra я получаю путь примерно за 1 секунду, но первый запрос занимает слишком много времени, чтобы его завершить.

Я ценю любую помощь:)

...