Использование Neo4J 2.1.5.Очень медленный этот запрос cypher, есть ли какая-нибудь оптимизация?
данных:
2000 человек
Цель: Для каждого человека, рассчитать общее количество друзей, друзей, друзей друзей друзей друзей.
Результат выглядит следующим образом:
Person FullName | Всего друзей | Друзья-2 всего | Друзья-3 всего | глобально всего
MATCH (person:Person)
WITH person
OPTIONAL MATCH person-[:KNOWS]-(p2:Person)
WITH person, count(p2) as f1
OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..2]-(f2:Person))
WHERE length(path) = 2
WITH count(nodes(path)[-1]) AS f2, person, f1
OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..3]-(f3:Person))
WHERE length(path) = 3
WITH count(nodes(path)[-1]) AS f3, person, f2, f1
RETURN person._firstName + " " + person._lastName, f1, f2, f3, f1+f2+f3 AS total
Трюки во избежание неправильных расчетов с использованием циклического графика; поэтому я использую shortestPath
.
Однако этот запрос длится долго: 60 секунд! Любая оптимизация возможна?
f1 является правильным, но он не возвращает хороших результатов для f2 и f3. Я ожидаю 51 для f2, но он возвращает 73. – Mik378
Я не понимаю, что может быть неправильным в вашем запросе ... – Mik378
Добавление 'distinct':' COLLECT (distinct p2) 'помогает, но все равно 53 вместо 51. – Mik378