实例
推荐
假设我们有以下用户评分数据: 用户1对物品101评分为5 用户1对物品102评分为3 用户2对物品101评分为4 用户2对物品103评分为2 用户3对物品102评分为4 用户3对物品103评分为5 可以使用以下Cypher查询来创建这些节点和关系:
CREATE (u1:User {userId: 1})
CREATE (u2:User {userId: 2})
CREATE (u3:User {userId: 3})
CREATE (i101:Item {itemId: 101})
CREATE (i102:Item {itemId: 102})
CREATE (i103:Item {itemId: 103})
CREATE (u1)-[:RATED {rating: 5.0}]->(i101)
CREATE (u1)-[:RATED {rating: 3.0}]->(i102)
CREATE (u2)-[:RATED {rating: 4.0}]->(i101)
CREATE (u2)-[:RATED {rating: 2.0}]->(i103)
CREATE (u3)-[:RATED {rating: 4.0}]->(i102)
CREATE (u3)-[:RATED {rating: 5.0}]->(i103)
相似度计算
MATCH (u1:User)-[r1:RATED]->(i:Item)<-[r2:RATED]-(u2:User)
WITH u1, u2, collect(r1.rating * r2.rating) AS ratingsProduct,
sqrt(reduce(sum1 = 0.0, r IN collect(r1.rating) | sum1 + r^2)) AS u1Norm,
sqrt(reduce(sum2 = 0.0, r IN collect(r2.rating) | sum2 + r^2)) AS u2Norm
WITH u1, u2, reduce(sum = 0.0, r IN ratingsProduct | sum + r) / (u1Norm * u2Norm) AS similarity
MERGE (u1)-[s:SIMILARITY]-(u2)
SET s.similarity = similarity
推荐生产
这个查询会为 userId 为 1 的用户生成一个推荐列表,推荐列表中的物品是该用户尚未评分但与其相似用户评分较高的物品。
MATCH (u:User)-[s:SIMILARITY]-(similarUser:User)-[r:RATED]->(i:Item)
WHERE u.userId = 1 AND NOT EXISTS((u)-[:RATED]->(i))
WITH i, s.similarity AS similarity, r.rating AS rating
WITH i, sum(similarity * rating) AS score
RETURN i.itemId AS itemId, score
ORDER BY score DESC
LIMIT 10