Neo4j var-length Поиск пути медленный - PullRequest
0 голосов
/ 26 марта 2019

Я намерен извлечь все входящие узлы, ближайшее расстояние которых меньше N, к конкретному узлу через match (c:Column {schema:'a.b', name:'c'})<-[cd:CD*1..3]-(c_up:Column) return c, cd, c_up, это фактически занимает ок.8s, чтобы вернуть все результаты.Я попытался профилировать его с помощью profile {sql} и вот что он возвращает:

https://i.ibb.co/fYbD2vn/WX20190326-145433-2x.png (вставка изображения в stackoverflow падает в моем текущем случае, поэтому я вставил на другой хост)

Я создал индекс с помощью CREATE INDEX ON :Column(schema, name), но это никак не помогает плану выполнения поиска пути var-length.Есть какие-нибудь идеи по оптимизации огромных дБ в VarLengthExpand и Filter?Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я думаю, что ваша проблема не столько в запросе, который выглядит довольно крошечным , а в:

  1. возврате 6000 узлов в визуализацию браузера neo4j (и многих других отношений * 1006)*
  2. используйте выделенный клиент для извлечения данных или проверьте cypher-shell
  3. проверьте конфигурацию вашей памяти, возможно, она должна извлекать данные с диска (настройки кэша страниц и кучи)
0 голосов
/ 26 марта 2019

Я создал индекс с помощью CREATE INDEX ON: Столбец (схема, имя), но это никак не помогает плану выполнения поиска пути var-length.

Ваш индекс напрямую не помогает varlengthexpand, но на самом деле помогает значительно ускорить ваш запрос. (Посмотрите на первую операцию, NodeIndexSeeker, она возвращает только 2 совпадения)

Для вашего случая использования:

Я собираюсь получить все входящие узлы, ближайшее расстояние которых меньше N,

Я думаю, что return cd - пустая трата времени, и вы можете использовать distinct, чтобы избежать возврата узла c_up дважды.

На главной странице есть пример: DISTINCT узлов из путей переменной длины

MATCH (c:Column {schema:'a.b', name:'c'})<-[cd:CD*1..3]-(c_up:Column) 
RETURN DISTINCT c, c_up
...