Python Gremlin多列分组查询:排查开发者重复项目分配问题
问题1:统计同一起始日期分配多项目的开发者
错误原因
之前两种写法报错的核心原因是Gremlin的by()步骤单次仅支持传入一个键生成规则,不支持同时传入多个字段作为分组键。原始查询的逻辑也存在分组层级错误,导致无法同时保留开发者信息、重复日期和计数三个维度的结果。
正确查询语句
g.V().hasLabel('developer').as('dev') .outE('works_in').as('edge') .groupCount() .by( project('devId','devName','startDate') .by(select('dev').id()) .by(select('dev').values('name')) .by(select('edge').values('start_date')) ) .unfold() .filter(select(values).is(gt(1))) .project('devId','devName','startDate','count') .by(select(keys).select('devId')) .by(select(keys).select('devName')) .by(select(keys).select('startDate')) .by(select(values)) .toList()
返回结果说明
运行后会直接返回符合要求格式的结果,对应你的样本数据会输出两条记录:001 Akash 2021-06-01 2、003 Bruno 2021-07-01 2。
问题2:查询异常重复分配的边
Gremlin完全支持该场景的查询,核心逻辑是先筛选出同一开发者同一起始日期的多条边,再匹配后续项目的开始日期判断是否存在断档。
正确查询语句
g.V().hasLabel('developer').as('dev') .outE('works_in').as('e') // 按开发者分组收集所有关联边 .group().by(select('dev').id()) .unfold().select(values) // 单开发者维度按开始日期升序、结束日期降序排序 .order(local).by('start_date').by('end_date', desc) .flatMap( unfold().as('current') // 匹配同一起始日期的其他边 .sibling().as('sibling') .where(eq('current')).by('start_date') // 筛选出结束日期更早的短边作为候选异常边 .where(select('current').values('end_date').lt(select('sibling').values('end_date'))) // 校验该边结束后与下一个项目的间隔是否超过1天 .filter( select('current').as('abnormal_e') .select('dev').outE('works_in') .values('start_date').is(gt(select('abnormal_e').values('end_date'))) .min().is(gt(select('abnormal_e').values('end_date').plus(1))) ) .select('current') ) // 输出边的完整属性,包含id、label和所有自定义属性 .valueMap(true) .toList()
返回结果说明
针对你的样本数据,查询会精准返回{"id":"003_P003","label":"works_in","start_date":"2021-07-01","end_date":"2021-07-05"}这条异常边。
Gremlin学习资源推荐(非官方文档类)
- Gremlin实战 中文图书:覆盖基础语法、复杂查询、性能优化全场景,配套大量可落地的示例代码,适合国内开发者入门到进阶
- 主流云厂商图数据库官方最佳实践:包含大量生产环境验证过的查询模板和优化方案,贴合实际业务场景
- 开源Gremlin Recipes集合:收录了常见业务场景的标准查询实现,可直接参考复用
- 国内技术社区的实战分享:知乎、B站等平台有大量开发者结合实际项目输出的Gremlin教程,更适配国内使用习惯
内容的提问来源于stack exchange,提问作者user2026504
相关产品推荐
相关产品推荐

