2014-10-03 49 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