Как ускорить прохождение многоуровневого пути в Neo4j - PullRequest
0 голосов
/ 07 января 2019

Я хочу найти все пути от конечного узла (E) до корневого узла (A). (Не для какого-либо конкретного узла, поэтому здесь нет идентификатора или фильтра)

Модель данных показана на рисунке.

Я использовал базовый запрос Cypher, чтобы найти пути (от A до E):

MATCH path=(:A)-[:USE*]->(:E) RETURN path

Он продолжает работать и никогда не заканчивается.

Я пытался получить пути от C до E, используя:

MATCH path=(:C)-[:USE*]->(:E) RETURN path

Этот запрос может занять до 18 секунд, чтобы вернуть 18 тыс. Путей. Я попытался использовать сканирование, но никаких улучшений за это время.

Как я могу улучшить этот обход, чтобы возвращать результаты за меньшее время? Мне нужно получить результаты за 4-5 секунд.

Конфигурации системы:

Системная память 32 ГБ

Хранение: SSD

Текущий Neo4j Conf:

Размер кучи: начально-12GB макс-12GB

кэш: 12 ГБ

Размер базы данных: 1,6 ГБ

Data Model

Query Profile

1 Ответ

0 голосов
/ 08 января 2019

Если ваши пути к БД имеют большую изменчивость (например, за C узлами не всегда следуют D узлы), но вы знаете, что вам всегда нужен конкретный шаблон пути (например, A->B->C->D->E), тогда указание явного шаблона должно быть намного быстрее:

MATCH path=(:A)-[:USE]->(:B)-[:USE]->(:C)-[:USE]->(:D)-[:USE]->(:E)
RETURN path

Шаблоны путей переменной длины дороги, поскольку имеют экспоненциальную сложность (в зависимости от глубины пути).

[UPDATE]

Даже когда интересующие вас пути к БД не имеют никакой изменчивости (например, путь от A до E всегда выглядит как A->B->C->D->E), но существуют более длинные пути, которые включают эти пути (например, если E узлы имеют длинные исходящие USE пути), то шаблон пути переменной длины без верхней границы заставит neo4j протестировать все эти исходящие пути. В этом случае, если вы все еще хотите использовать шаблон пути переменной длины, вам следует указать фиксированную верхнюю границу, поскольку вы знаете точную длину путей, представляющих интерес (4, в этом примере):

MATCH path=(:A)-[:USE*..4]->(:E) RETURN path
...