Этот запрос Cypher должен работать для вашего варианта использования ( "Пользователь может искать mov ie, например: Titani c, для рекомендации других похожих фильмов результат должен содержать фильмы того же жанра, фильмы того же режиссера. "):
MATCH (m:movie)
WHERE m.name = $title
MATCH (m)-[:Belong_To]->()<-[:Belong_To]-(x)
WITH m, COLLECT(x) AS xs
MATCH (m)<-[:Directed]-()-[:Directed]->(y)
WITH m, xs, COLLECT(y) AS ys
UNWIND (xs + ys) AS otherMovie
RETURN m, COLLECT(DISTINCT otherMovie) AS recommendations
Я предполагаю, что отношение Belong_To
указывает на жанр. Я также предполагаю, что у всех фильмов есть по крайней мере один жанр и один режиссер; если это не так, то соответствующий MATCH
должен быть OPTIONAL MATCH
.
. В этом запросе используется агрегирующая функция COLLECT
для раздельного сбора фильмов с одинаковыми жанрами ( xs
) и те же директора (ys
). Затем UNWIND s сочетает xs
и ys
, так что он может использовать COLLECT(DISTINCT ...)
для получения списка отдельных фильмов.