Neo4j медленное сопоставление и прохождение, даже с индексами - PullRequest
0 голосов
/ 12 мая 2018

У меня есть график ~ 49M узлов и ~ 37M отношений (~ 7ГБ), и я выполняю следующий запрос:

MATCH (n:NAME {name: "dummy name"})-[:ID*1..2]-(similar_names:NAME {type:"name"}) RETURN DISTINCT(similar_names)

где запрос должен начинаться с узла, который имеет определенный атрибут имени "фиктивное имя" (который является уникальным), и получить все узлы с меткой "NAME" со значением атрибута типа "name", до тех пор, пока они связаны ребром типа ID. Этот запрос хорошо работает с точки зрения результатов, но занимает более 850 мс. Хотя изначально это не проблема, это только с глубиной до 2, и моя цель - бесконечная глубина прохождения. С - [: ID *] запрос не завершается (в течение 5 минут).

Я проиндексировал атрибуты для меток, используемых в этом запросе (которые должны адресовать ответы на другие вопросы SO, такие как this . Запросы были выполнены через браузер настольного компьютера neo4j, и я настроил 10 ГБ памяти на ' убедитесь, что «конфигурация памяти не является узким местом».

Есть идеи, как это можно оптимизировать? Или что я могу делать не так?

1 Ответ

0 голосов
/ 13 мая 2018

Сопоставление и обход в шифре оптимизированы для поиска всех возможных путей, которые соответствуют согласованному шаблону.К сожалению, это не лучший подход, когда все, что вам нужно, это отдельные узлы в конце пути, и вам не нужны пути, используемые для поиска этих конечных узлов.

Процедуры APOC имеют путьпоиск процедур , которые оптимизированы для этого случая, в частности apoc.path.subgraphNodes().

. Вот как это можно использовать:

MATCH (n:NAME {name: "dummy name"})
CALL apoc.path.subgraphNodes(n, {maxLevel:2, relationshipFilter:'ID'}) YIELD node as similar_name
WITH similar_name
WHERE similar_name.type = 'name' AND n <> similar_name
RETURN similar_name

Вы можете попробовать это, увеличив maxLevel и удалив maxLevelкогда вы чувствуете, что он может работать на неограниченной глубине.

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