2014-10-03 18 views
1

我有一个用户评级电影的电影数据库。我想找到用户1的前5名最相似的用户(第一次MATCH可以正常工作),并向他推荐那些由类似用户观看但用户1没有观看的最受欢迎的电影。即使我拥有多次相同的电影在我的查询中“distinct”。我究竟做错了什么?多个MATCH查询中的不同节点

MATCH (target_user:User {id : 1})-[:RATED]->(m:Movie) 
     <-[:RATED]-(other_user:User) 
WITH other_user, count(distinct m.title) AS num_common_movies, target_user 
ORDER BY num_common_movies DESC 
LIMIT 5 
MATCH other_user-[rat_other_user:RATED]->(m2:Movie) 
WHERE NOT (target_user-[:RATED]->m2) 
WITH distinct m2.title as movietitle, rat_other_user.note AS rating, 
     other_user.id AS watched_by 
RETURN movietitle, rating, watched_by 
ORDER BY rating DESC 

回答

2

您的数据集可能有许多用户观看过并评级过相同的电影。当你执行DISTINCT语句时,它将返回一个不同的行,而不是一个独特的电影标题。不同的用户将对不同的电影进行不同的评级,并且名称不同。

你将不得不调整该为您的特定使用案例,但你可以从开始:

MATCH (target_user:User { uid : 1 })-[:RATED]->(m:Movie)<-[:RATED]-(other_user:User) 
WITH other_user, count(DISTINCT m.title) AS num_common_movies, target_user 
ORDER BY num_common_movies DESC 
LIMIT 5 
MATCH other_user-[rat_other_user:RATED]->(m2:Movie) 
WHERE NOT (target_user-[:RATED]->m2) 
RETURN DISTINCT m2.name AS movietitle, COLLECT(rat_other_user.note) AS ratings, 
MAX(rat_other_user.note) AS maxi, AVG(rat_other_user.note) as aver, COLLECT(other_user.name) AS users 
ORDER BY aver DESC 

我添加了一个控制台演示here

重要的是,你现在正按照电影标题汇总你的结果。

+0

谢谢你彻底解释它。我以为我回到了真正的不同的电影,而不是用户对电影的每一个不同的评价。我希望我能给你演示的奖励积分! – FloIancu 2014-10-04 16:23:33