Подсчет Neo4j на основе одного отношения к узлу - PullRequest
0 голосов
/ 06 декабря 2018

Я хотел бы найти всех людей, которые участвовали во всех указанных фильмах, например, в 2 фильмах: «Терминатор», «Истинная ложь»

У меня есть следующий запрос:

MATCH (t:Title)-[:ACTS_IN]-(p:Principal)-[:ACTS_BY]->(n:Name) 
WHERE t.originalTitle IN ["The Terminator", "True Lies"] 
WITH n, collect(n) as names 
WHERE SIZE(names) >= 2 
RETURN n.primaryName

, который отлично работает, если каждый человек участвовал (:ACTS_BY отношения) только один раз в каждом фильме.Но согласно моей схеме базы данных, каждый человек может иметь отношения 0-N :ACTS_BY между узлами «Главный» и «Имя» (например, один и тот же человек может быть одновременно продюсером и актером фильма).

Проблема заключается в том, что упомянутый запрос Cypher также возвращает человека (узел Name) в случае, если этот человек участвовал 2+ раза в одном фильме и 0 раз в другом, но мне нужно только вернуть узел Name в случае, если человекучаствовал в каждом фильме.

Пожалуйста, помогите улучшить запрос для его достижения.

1 Ответ

0 голосов
/ 06 декабря 2018

Чтобы исправить это, вам нужно получить различные значения t, p, n, чтобы отсеять дубликаты, и только после этого выполнить подсчет:

MATCH (t:Title)-[:ACTS_IN]-(p:Principal)-[:ACTS_BY]->(n:Name) 
WHERE t.originalTitle IN ["The Terminator", "True Lies"] 
WITH DISTINCT t, p, n
WITH n, count(n) as occurrences 
WHERE occurrences >= 2 
RETURN n.primaryName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...