Gremlin如何统计公共顶点数、排序结果并返回公共技能列表
Schema与需求说明
- 节点类型:
Student:主键为idSkill:主键为SkillName
- 关联关系:
Student通过出边HAS_SKILL关联到自己掌握的Skill节点 - 查询目标:给定学生ID,返回技能匹配度最高的相似学生、双方公共技能数量、公共技能明细列表
原有查询的缺陷
你写的查询仅聚合了HAS_SKILL边做数量统计,遍历过程中没有留存公共技能的属性数据,因此无法返回技能列表;另外缺少排除目标用户自身的逻辑,会把查询目标本人作为匹配度最高的结果返回,属于无效数据。
改造后的查询代码
g.V().has('Student','id','test1').as('target'). out('HAS_SKILL').as('commonSkill'). in('HAS_SKILL'). where(neq('target')). group(). by(values('id')). by(select('commonSkill').values('SkillName').fold()). unfold(). project('similarStudentId', 'commonSkillCount', 'commonSkillList'). by(select(keys)). by(select(values).count(local)). by(select(values)). order(). by('commonSkillCount', desc)
注:如果你的Student节点存储用户唯一标识的字段为
userId而非id,将分组逻辑里的by(values('id'))替换为by(values('userId'))即可。
改造逻辑说明
- 给起始查询的目标学生打
target标签,后续通过where(neq('target'))过滤掉学生本人,避免无效结果 - 遍历到目标学生掌握的技能节点时,打
commonSkill标签留存技能节点 - 调整分组聚合逻辑:不再收集关联边,而是直接收集每条匹配路径上的公共技能名称,聚合为列表
- 结果投影阶段,直接取分组聚合得到的技能列表作为公共技能明细输出,对该列表做本地计数即可得到公共技能数量,和原有计数逻辑结果完全一致
- 最终按公共技能数量倒序排序,排名最靠前的就是技能匹配度最高的相似用户
内容的提问来源于stack exchange,提问作者Mounika Mandadi
相关产品推荐
相关产品推荐

