2016-09-20 87 views
2

我想查找其搜索標籤包含我觀看的電影標籤的電影。以下是我的查詢,但它沒有產生預期的結果,任何人都可以讓我知道這個查詢有什麼問題嗎?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) 
+0

我想你的意思是「** **不是由我看了」(這是你似乎在查詢做什麼反正)。 「動態標籤ID」是什麼意思:你想參數化查詢中使用的標籤ID嗎?電影至少應該有一個標籤還是全部? –

+0

感謝@FrankPavageau,動態我的意思是在查詢['16','19','21','22','23','24','25']中靜態的tagId數組 –

回答

3
// 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 
+0

感謝Man,完美地工作! –