在 Neo4j 里做推荐,本质上是利用图结构 + 关系路径 + 图算法来发现“人或物品之间的关联”。下面从思路 → 常见方法 → 示例 → 实战建议逐步说明。
传统推荐(协同过滤、矩阵分解)擅长“打分”,但不擅长表达:
Neo4j 的优势:
✅ 关系天然可见
✅ 多跳关系容易表达
✅ 可结合规则 + 图算法
✅ 解释性强(为什么推荐)
例子:好友喜欢的东西
MATCH (u:User {id:'user1'})-[:FRIEND]->(f:User)-[:LIKED]->(item:Item)
WHERE NOT (u)-[:LIKED]->(item)
RETURN item, count(*) AS score
ORDER BY score DESC
LIMIT 10
✅ 适合:社交推荐
✅ 可解释:你朋友喜欢
例子:买过相同商品的人还买了什么
MATCH (u:User {id:'user1'})-[:BOUGHT]->(i:Item)<-[:BOUGHT]-(other:User)
MATCH (other)-[:BOUGHT]->(rec:Item)
WHERE NOT (u)-[:BOUGHT]->(rec)
RETURN rec, count(*) AS score
ORDER BY score DESC
LIMIT 10
✅ 类似“买了又买”
例子:同品类 + 同品牌
MATCH (u:User {id:'user1'})-[:BOUGHT]->(:Item)-[:IN_CATEGORY]->(c:Category)
MATCH (c)<-[:IN_CATEGORY]-(rec:Item)
WHERE NOT (u)-[:BOUGHT]->(rec)
RETURN rec, count(*) AS score
ORDER BY score DESC
CALL gds.nodeSimilarity.stream('user-item-graph')
YIELD node1, node2, similarity
RETURN node1, node2, similarity
ORDER BY similarity DESC
适合:
CALL gds.pageRank.stream('item-graph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name, score
ORDER BY score DESC
CALL gds.pageRank.stream('graph', {
sourceNodes: ['user1']
})
✅ 强烈推荐:电商、内容平台
CALL gds.louvain.stream('graph')
YIELD nodeId, communityId
同社区用户互相推荐内容
(User)-[:BOUGHT]->(Item)
(Item)-[:IN_CATEGORY]->(Category)
(User)-[:FRIEND]->(User)
score = 0.4 * friendScore
+ 0.3 * categoryScore
+ 0.3 * similarityScore
✅ 小规模:Cypher 直接算
✅ 中大规模:用 GDS 投影图
✅ 实时推荐:预计算 + 缓存
✅ 可解释:返回“推荐原因”
✅ 社交推荐
✅ 知识图谱推荐
✅ 内容/商品关联
✅ 冷启动友好(靠关系)
❌ 不适合:
如果你愿意,可以告诉我:
我可以直接帮你写一套可落地的推荐方案 + Cypher。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。