基于Neo4j实现类Tinder推荐逻辑的Cypher查询与触发器方案
满足需求的Cypher方案
先搞定评分更新的触发器,毕竟高吸引力用户的指标得实时更新对吧?每次有新的:LIKED关系创建时,自动更新被点赞用户的elo_score(按要求等于被点赞的总次数):
CREATE TRIGGER updateEloScoreOnLike WHEN CREATE (:User)-[:LIKED]->(target:User) CALL { WITH target MATCH ()-[:LIKED]->(target) SET target.elo_score = count(*) } AFTER COMMIT;
核心查询语句
下面的查询会返回20条结果,混合三类用户:已向你发起点赞的用户、高吸引力用户、普通未查看用户,且所有结果都是你还没建立:LIKED或:PASSED关系的潜在用户:
// 定义当前用户,替换$currentUserId为实际用户ID MATCH (current:User {id: $currentUserId}) // 收集三类目标用户 WITH current CALL { WITH current // 1. 已向当前用户发起LIKED的用户 MATCH (suitor:User)-[:LIKED]->(current) WHERE NOT (current)-[:LIKED|PASSED]->(suitor) RETURN suitor AS potentialUser, 3 AS priority // 优先级最高,优先展示 UNION ALL WITH current // 2. 高吸引力用户(取elo_score靠前的候选池) MATCH (popular:User) WHERE NOT (current)-[:LIKED|PASSED]->(popular) AND popular <> current RETURN popular AS potentialUser, 2 AS priority ORDER BY popular.elo_score DESC LIMIT 50 UNION ALL WITH current // 3. 普通未查看用户 MATCH (normal:User) WHERE NOT (current)-[:LIKED|PASSED]->(normal) AND normal <> current RETURN normal AS potentialUser, 1 AS priority LIMIT 100 } // 混合结果并分页 WITH DISTINCT potentialUser ORDER BY rand() // 随机打乱实现三类用户混合 LIMIT 20 // 返回用户信息,可按需调整字段 RETURN potentialUser.id AS userId, potentialUser.name AS userName, potentialUser.elo_score AS attractivenessScore
逻辑说明
- 触发器部分:每次新点赞关系创建后,自动统计被点赞用户的总点赞数并更新
elo_score,确保高吸引力用户的指标实时准确。 - 查询部分:
- 用
UNION ALL合并三类用户数据源,给不同类型设置优先级(可根据业务需求调整权重) - 通过
NOT (current)-[:LIKED|PASSED]->(user)过滤掉当前用户已查看的用户 - 最后用
rand()随机打乱结果,实现三类用户的自然混合,再取20条分页结果 - 各类用户的候选数量(比如高吸引力取前50、普通用户取前100)可按需调整,保证混合效果符合预期
- 用
内容的提问来源于stack exchange,提问作者atkayla
相关产品推荐
相关产品推荐

