Какой лучший способ узнать, есть ли путь между 2 узлами в Neo4j? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть проект Neo4j с 100k узлами и отношениями 5м.Моя проблема: алгоритм типа «кратчайший путь» занимает 2-4 мс, чтобы найти кратчайший путь.

MATCH p = shortestPath((p1:Person{nickname:"sievers_amara"})-
[:follows*..5]->(p2:Person{nickname:"burghardt_giulia"}))
WHERE p1 <> p2
RETURN p

Но мой алгоритм, чтобы выяснить, существует ли путь между 2 узлами, занимает около 200 мс ...найти кратчайший путь будет сложнее, чем выяснить, существует ли путь или нет ... Это мой код, чтобы узнать, существует ли путь:

MATCH p=(p1:Person{nickname:"sievers_amara"})-[r:follows*1..5]->(p2:Person{nickname:"burghardt_giulia"})
WHERE p1 <> p2
RETURN p LIMIT 1

Что я могу улучшить?

Редактировать: Помещение PROFILE перед моим запросом "есть ли путь" приводит к: enter image description here

1 Ответ

0 голосов
/ 22 октября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...