Neo4j проходит через узлы для повышения производительности запросов - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над проектом на Neo4j.У меня около 1 миллиона узлов и 4 миллиона взаимосвязей.

Когда я пытаюсь выполнить запрос, мне требуется около 15 секунд, чтобы получить результат.Я также установил индексы на email.createdAt

Запрос выглядит следующим образом:

MATCH (email:Email) 
WITH email 
ORDER BY email.createdAt 
WHERE email.body CONTAINS "word" 
RETURN email 
SKIP 0 
LIMIT 10

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

Пока у меня есть идея, но я не знаю, возможно ли это.

Я думаю, что запрос должен быть таким:

  • Принесите все электронные письма, упорядоченные по дате. DESC
  • Цикл по каждому из узлов электронной почты (desc), ищущих «слово» в email.body
  • Когда он получает 10 совпадений,он останавливается и возвращает только эти 10 электронных писем.

Основная идея состоит не в том, чтобы пройтись по всем узлам, а только в том, чтобы найти первые 10 совпадений.Может быть, используя Unwind, For Each, я не знаю.

У кого-нибудь есть идеи о том, как написать этот запрос?Спасибо, ребята!

1 Ответ

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

По большей части вы должны сделать свой запрос максимально коротким и простым.Планировщик Neo4j Cypher ДЕЙСТВИТЕЛЬНО мощен, и, пытаясь управлять им на микроуровне, вы мешаете ему использовать лучший план.

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

Aлучше Cypher будет выглядеть так:

Match (email:Email) 
Where email.body Contains "word" 
Return email Order by email.createdAt Skip 0 Limit 10

В основном то же самое, но без микроуправляемой части WITH.WHERE - единственная часть, которая изменяет загружаемые узлы, поэтому, выполнив это следующим образом, планировщик может остановиться после того, как найдет 10 узлов, которые соответствуют критериям при сканировании индекса createdAt.

В общем,если вы не хотите стать экспертом по БД Neo4j, лучшим шифром, как правило, является самый простой, который вы можете написать, с индексами для ключевых полей.

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