[ОБНОВЛЕНО]
Если это реальный сценарий (скажем, выявление подозреваемых, которые могут быть в сговоре с известными плохими парнями), то вам, вероятно, наплевать на людей, которые имеют большой "Степень отделения "от плохих парней.В противном случае вы можете столкнуться с подозрением в отношении большей части населения.Таким образом, вы, вероятно, захотите установить разумную верхнюю границу для глубины поиска.
Просто так получилось, что время (и память), необходимое для поиска пути переменной длины, экспоненциально увеличивается с глубинойпоиск, поэтому, чтобы ускорить поиск, вы также захотите установить разумную верхнюю границу для глубины поиска.
Поэтому попробуйте использовать разумную верхнюю границу (скажем, 6).Вот запрос, чтобы определить людей, которые сами не являются целями и связаны (на глубину до 6) с менее чем 2 целями.Чтобы ускорить поиск, я также ограничиваю поиск только использованием KNOWS
отношений (при условии, что это единственный тип отношений, который вас интересует).И обратите внимание, что я считаю DISTINCT
целей, так как несколько путей могут содержать одну и ту же цель.
MATCH (n:Person) WHERE NOT n:Target
OPTIONAL MATCH (n)-[:KNOWS*..6]-(t:Target)
WITH n, COUNT(DISTINCT t) AS nb_targets
WHERE nb_targets < 2
RETURN n
Чтобы исключить всех людей, которые не являются потенциальными подозреваемыми (включая тех, у кого более 6 прыжков из любогоцель), затем вы можете сначала идентифицировать всех подозреваемых и удалить людей, которые не являются ни целями, ни подозреваемыми:
MATCH (n:Person) WHERE NOT n:Target
OPTIONAL MATCH (n)-[:KNOWS*..6]-(t:Target)
WITH n, COUNT(DISTINCT t) AS nb_targets
WHERE nb_targets >= 2
WITH COLLECT(n) AS suspects
MATCH (m:Person)
WHERE NOT m:Target AND NOT m IN suspects
DETACH DELETE m