Neo4j - получить рекомендации по фильмам на основе тегов

Я хочу найти фильмы, поисковый тег которых содержит теги фильма, просмотренного мной. Ниже приведен мой запрос, но он не дает ожидаемого результата. Может кто-нибудь сообщить мне, что не так с этим запросом?

MATCH (m:Movie)-[:HAS_TAG]->(t:Tag)
    WHERE NOT (:Person {personId : '50'})-[:WATCHED]->(m)
    AND (m)-[:HAS_TAG]->(t)
    RETURN DISTINCT(m.movieId) as movieId,
    COLLECT(t.tagId) as Tag

Я пробовал этот запрос, и он работает, но я не знаю, как сделать его динамическим tagid? Я новичок в neo4j, я прочитал утверждение WITH в neo4j, но не уверен, как его использовать и будет ли он работать или нет.

MATCH (m:Movie)-[:HAS_TAG]->(t:Tag)
WHERE NOT (:Person {personId : '50'})-[:WATCHED]->(m)
AND t.tagId in ['16','19','21','22','23','24','25'] 
RETURN DISTINCT(m.movieId)

1 ответ

Решение
// Collect all films and tags that apply to films that are watched by:
//
MATCH (p:Person {personId : '50'})
WITH p
MATCH (p)-[:WATCHED]->(m:Movie)-[:HAS_TAG]->(t:Tag)
WITH p, collect(distinct m) AS movies, collect(distinct t) AS tags
//
// And get recommendation:
//
MATCH (m:Movie)-[:HAS_TAG]->(t:Tag) 
WHERE NOT m IN movies AND t IN tags
RETURN distinct m AS movies

Или вариант с рисунком:

MATCH (p:Person {personId : '50'})
WITH p
MATCH (p)-[:WATCHED]->(wm:Movie)-[:HAS_TAG]->(t:Tag)<-[:HAS_TAG]-(rm:Movie)
WHERE NOT (p)-[:WATCHED]->(rm)
RETURN distinct rm AS movies
Другие вопросы по тегам