基于Gremlin实现单候选人与其他候选人的技能匹配查询
Gremlin 候选人共同技能匹配查询实现
Schema可通过指定链接查看。
需求说明
- 以指定imProfileId的候选人为基准(记为c1),对比其余所有候选人的技能集合
- 仅返回与c1存在至少1项匹配技能的候选人
- 返回字段包含:c1的userId、匹配候选人userId、双方匹配技能明细、匹配技能总数量
- 最终结果按匹配技能总数量降序排序
原有参考查询问题
原有查询仅实现了匹配数量的统计,缺少c1 userId返回、匹配技能明细输出,也未做基准候选人自身的过滤。
优化后查询代码
g.V().has('Candidate','imProfileId','1000363') .as('c1') .out('HAS_SKILL') .aggregate('c1Skills') .in('HAS_SKILL') .where(neq('c1')) .group() .by(values('userId')) .by(__.out('HAS_SKILL').where(within('c1Skills')).values('skillName').fold()) .unfold() .project('c1UserId','matchUserId','matchedSkills','matchCount') .by(select('c1').values('userId')) .by(select(keys)) .by(select(values)) .by(select(values).count(local)) .order().by('matchCount', desc)
查询逻辑说明
- 首先定位到imProfileId为
1000363的基准候选人,标记别名为c1,方便后续读取其属性 - 遍历c1关联的所有技能节点,聚合存入
c1Skills集合作为匹配基准 - 沿HAS_SKILL边反向遍历,找到所有持有c1技能的候选人,通过
neq('c1')过滤掉基准候选人本人 - 按候选人userId分组,分组时遍历每个候选人的自有技能,筛选出属于c1技能集合的条目,收集为匹配技能明细列表
- 展开分组结果,投影出要求的四个返回字段
- 最后按匹配技能数量降序排序,无匹配技能的候选人不会进入遍历结果,天然满足「至少1项匹配」的过滤要求
内容的提问来源于stack exchange,提问作者user19442466
相关产品推荐
相关产品推荐

