Для школьного проекта мне нужно найти пути из точки 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 секунду, но первый запрос занимает слишком много времени, чтобы его завершить.
Я ценю любую помощь:)