У вас есть опечатка, поскольку Cypher не позволяет двунаправленной связи: <-[:IS_GENRE]->
.
Принимая догадку в модели данных, это может работать для вас:
START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)-[:IS_GENRE]->genres
RETURN movies.title LIMIT 5;
Примечание: приведенный выше запрос может возвращать повторяющиеся результаты, так как несколько пользователей могут наблюдать одни и те же фильмы. Если это вызывает беспокойство, вы можете использовать квалификатор DISTINCT
, чтобы предотвратить это. Например:
START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)-[:IS_GENRE]->genres
RETURN DISTINCT movies.title LIMIT 5;
[Изменено]
Если вы хотите, чтобы вернуться только фильмы, которые (по крайней мере) все те же жанры, как inputMovie
, вы можете сделать следующее.
START inputMovie=node(1)
MATCH (inputGenre)<-[:IS_GENRE]-(inputMovie)
WITH inputMovie, COLLECT(inputGenre) AS inputGenres
MATCH (inputMovie)<-[r:RATED]-(User)-[o:RATED]->(movie)-[:IS_GENRE]->(genre)
WITH inputGenres, movie, COLLECT(genre) AS genres
WHERE ALL(x IN inputGenres WHERE x IN genres)
RETURN movie.title LIMIT 5;
Примечание:
- Я переименован несколько идентификаторов, для ясности (т.е.
movies
и genres
).
- Отборщик
DISTINCT
больше не нужен, поскольку агрегация над узлом movie
(во втором WITH
) неявно делает каждый экземпляр movie
уникальным.
спасибо. Проблема была в моей опечатке. Хотя теперь у меня есть запрос, я получаю нечетные результаты, например, Sixth Sense будет соответствовать Up (pixar), потому что оба они делятся драматическим жанром. Вы знаете способ сочетаться со всеми жанрами, а не с одним? – f7n
Вы пытаетесь получить фильмы, имеющие (по крайней мере) все те же жанры, что и «inputMovie»? – cybersam
Да, я. некоторые фильмы были классифицированы как более чем один жанр. – f7n