簡單的協(xié)同過濾
MATCH (u:User {name: "Cynthia Freeman"})-[:RATED]->(:Movie)<-[:RATED]-(o:User)
MATCH (o)-[:RATED]->(rec:Movie)
WHERE NOT EXISTS( (u)-[:RATED]->(rec) )
RETURN rec.title, rec.year, rec.plot
LIMIT 25
上面的簡單的過濾方法其實存在很多問題,例如不基于流行度來進行規(guī)范或不考慮評級。
只考慮用戶喜歡的類型
許多推薦系統(tǒng)融合了協(xié)同過濾和基于內容的方法,對于特定用戶,哪些類型的評分高于平均水平?用它來評分類似的電影:
MATCH (u:User {name: "Andrew Freeman"})-[r:RATED]->(m:Movie)
WITH u, avg(r.rating) AS mean
MATCH (u)-[r:RATED]->(m:Movie)-[:IN_GENRE]->(g:Genre)
WHERE r.rating > mean
WITH u, g, COUNT(*) AS score
MATCH (g)<-[:IN_GENRE]-(rec:Movie)
WHERE NOT EXISTS((u)-[:RATED]->(rec))
RETURN rec.title AS recommendation, rec.year AS year, COLLECT(DISTINCT g.name) AS genres, SUM(score) AS sscore
ORDER BY sscore DESC LIMIT 10
分析:
1. 用戶u評過的電影的平均分
2. 找出用戶u評過的高于平均分的電影的分類,并對分類計數(shù)
3. 找出這些分類的相關的電影,并且這些電影是用戶u沒有評過分的
4. 找出電影分類中影片數(shù)最多的前10部電影
Neo4j 做推薦 (4)—— 基于內容的過濾(續(xù))
Neo4j 做推薦 (8)—— 協(xié)同過濾(利用電影評級)
Neo4j 做推薦 (9)—— 協(xié)同過濾(人群的智慧)
Neo4j 做推薦 (10)—— 協(xié)同過濾(皮爾遜相似性)