使用 Neo4j 做推荐系统是非常自然的,因为推荐问题本质上是“图关系”问题(用户–商品–行为–标签等)。下面我从核心思路、常见推荐模式、Cypher 示例、工程实践四个方面讲清楚。
在 Neo4j 中:
推荐本质:
在图中找到“与目标节点最相关”的其他节点
常见推荐思路:
场景:朋友买过、相似用户喜欢
MATCH (u:User {id: 'user1'})-[:FRIEND]-(f:User)
MATCH (f)-[:BOUGHT]->(p:Product)
WHERE NOT (u)-[:BOUGHT]->(p)
RETURN p, count(*) AS score
ORDER BY score DESC
LIMIT 10
✅ 适合社交推荐
场景:你买过 A,别人也买过 A,又买了 B
MATCH (u:User {id: 'user1'})-[:BOUGHT]->(p1:Product)
MATCH (p1)<-[:BOUGHT]-(other:User)-[:BOUGHT]->(p2:Product)
WHERE p1 <> p2
AND NOT (u)-[:BOUGHT]->(p2)
RETURN p2, count(*) AS score
ORDER BY score DESC
LIMIT 10
✅ 经典“买了又买”
场景:用户偏好“科幻 + 高分”
MATCH (u:User {id: 'user1'})-[:LIKE]->(t:Tag)
MATCH (p:Product)-[:HAS_TAG]->(t)
WHERE NOT (u)-[:BOUGHT]->(p)
RETURN p, count(t) AS score
ORDER BY score DESC
LIMIT 10
✅ 可解释性强
CALL gds.nodeSimilarity.stream('graph')
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).id, gds.util.asNode(node2).id, similarity
ORDER BY similarity DESC
LIMIT 10
CALL gds.pageRank.stream('graph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name, score
ORDER BY score DESC
(User)-[:BOUGHT]->(Product)
(User)-[:FRIEND]->(User)
(Product)-[:HAS_TAG]->(Tag)
(Product)-[:BELONG_TO]->(Category)
还可以加:
:BOUGHT {time}:LIKE {weight}✅ 强关系(社交、知识图谱)
✅ 可解释推荐
✅ 冷启动友好
❌ 超大规模实时深度排序(不擅长)
如果你愿意,我可以:
你现在是想做哪类推荐系统?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。