2016-09-20 85 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,完美地工作! –