почему DISTINCT необходим в этом запросе Cypher? - PullRequest
0 голосов
/ 12 февраля 2020

Следующий запрос взят из neo4j mov ie просмотр песочницы набора данных:

MATCH (u:User {name: "Some User"})-[r:RATED]->(m:Movie)
WITH u, avg(r.rating) AS mean

MATCH (u)-[r:RATED]->(m:Movie)-[:IN_GENRE]->(g:Genre)
WHERE r.rating > mean

WITH u, g, COUNT(*) AS score

MATCH (g)<-[:IN_GENRE]-(rec:Movie)
WHERE NOT EXISTS((u)-[:RATED]->(rec))

RETURN rec.title AS recommendation, rec.year AS year, COLLECT(DISTINCT g.name) AS genres, SUM(score) AS sscore
ORDER BY sscore DESC LIMIT 10

, что я не могу понять: почему ключевое слово DISTINCT требуется в операторе возврата запроса ?. Поскольку ожидаемые результаты последнего оператора MATCH выглядят примерно так:

g1,x
g1,y
...
g2,z
g2,v
g2,m
...
gn,m
gn,b
gn,x

, где g1,g2,..gn - набор жанров, а x,y,z,v,m,b... - набор фильмов (кроме того, есть пользователь и столбец оценки удален для удобства чтения).

Итак, насколько я понимаю, что возвращает этот запрос: Для каждого mov ie вернуть его жанры и сумму их оценок.

1 Ответ

1 голос
/ 12 февраля 2020

Допущения:

  • Каждый Movie имеет уникальный title. (Это необходимо для того, чтобы запрос работал как есть.)
  • Каждый Genre имеет уникальный name.
  • Каждый Movie имеет максимум одну IN_GENRE связь с каждым Отличный Genre.

Учитывая вышеизложенные предположения, вы правы, что DISTINCT не является необходимым. Это связано с тем, что в предложении RETURN используется rec.title в качестве одного из ключей группировки агрегации .

...