Ваш запрос очень неэффективен. Вы заявили, что data
имеет 3000 строк (назовем это число D
).
- Итак, ваш первый
UNWIND
создает промежуточный результат из D
строк. - Ваш второй
UNWIND
создает промежуточный результат из D**2
(то есть, 9 миллионов) строк. - Если ваше предложение
MATCH (e1:Entity)-[r1:RELATED_TO]-(e2)
находит N результатов, то генерируется промежуточный результат до N * (D ** 2) строки. - Поскольку в предложении
MATCH
указан шаблон ненаправленного отношения, он находит одну и ту же пару узлов дважды (в обратном порядке). Итак, N
на самом деле в два раза больше, чем нужно.
Вот улучшенная версия вашего запроса, которая должна быть намного быстрее (с N / 2 промежуточными строками):
WITH apoc.map.groupBy(value.aggregations.ent.terms.buckets, 'key') as lookup
MATCH (e1:Entity)-[r1:RELATED_TO]->(e2)
WHERE e1.uuid = $entityId AND lookup[e1.uuid] IS NOT NULL AND lookup[e2.uuid] IS NOT NULL
RETURN e1.uuid, lookup[e1.uuid].doc_count AS count1, r1.uuid, e2.uuid, lookup[e2.uuid].doc_count AS count2
ORDER BY count2 DESC
LIMIT 50
Хитрость в том, что запрос использует apo c .map.groupBy для преобразования вашего buckets
(списка карт) в единую объединенную lookup
карту, которая использует значения key
в качестве имен своих свойств. Это позволяет остальной части запроса буквально «искать» данные uuid
на объединенной карте.