Neptune Gremlin Java多跳遍历:标签与实体聚合分数查询
Gremlin 查询方案(适配Neptune标签-实体关系模型)
基于你的模型(顶点为标签,边包含hash(实体哈希)、score等属性),以下是三个场景的Gremlin 3.5查询方案:
场景3:标签-实体(最大跳数0,直接关联)
需求:计算标签ID123454与实体哈希key1直接关联的总分(无中间标签)
Gremlin 查询:
g.V('123454') .bothE() // 遍历该标签的所有入边和出边 .has('hash', 'key1') // 筛选出关联实体key1的边 .values('score') // 提取边的分数值 .sum() // 对分数求和
说明:直接定位目标标签顶点,筛选所有关联目标实体的边,通过Gremlin内置的sum()直接计算总分,无需手动求和。
场景2:标签-标签(最大跳数1)
需求:计算标签ID123454与435677在最大跳数1下的总分(两个标签直接相连)
Gremlin 查询:
g.V('123454') .bothE().as('edge') // 遍历标签的所有边并标记 .otherV() // 跳转到边的另一端标签顶点 .hasId('435677') // 筛选出目标标签 .select('edge') // 回到之前标记的边 .values('score') // 提取分数 .sum() // 求和
说明:跳数1意味着两个标签直接通过一条边连接,查询会匹配所有连接两个标签的边(无论方向),并对这些边的分数求和。
场景1:实体-实体(最大跳数2)
需求:计算实体哈希key1与key2在最大跳数2下的总分(允许经过最多2个标签节点跳转)
方案1:仅统计关联实体的边的分数
g.E() .has('hash', 'key1') // 先找到所有关联key1的边 .bothV().as('startTag') // 跳转到这些边连接的标签顶点 .repeat(bothE().otherV()) // 重复遍历标签间的边(跳转标签) .times(2) // 最多跳转2次(对应最大跳数2) .bothE() // 遍历最终标签的所有边 .has('hash', 'key2') // 筛选出关联key2的边 .dedup() // 去重(避免同一条边被多次匹配) .values('score') // 提取分数 .sum() // 求和
方案2:统计路径中所有边的分数(含中间标签间的边)
如果需要把路径中关联key1的边、中间标签连接边、关联key2的边的分数全部求和,用以下查询:
g.E() .has('hash', 'key1').as('e1') .bothV().as('t1') .repeat(bothE().as('midE').otherV()) .times(2) .bothE().has('hash', 'key2').as('e2') .select('e1', 'midE', 'e2') .unfold() .values('score') .sum()
说明:
- 跳数2覆盖三种情况:同一标签同时关联key1和key2(跳数0)、经过1个中间标签(跳数1)、经过2个中间标签(跳数2);
dedup()用于避免同一条边被不同路径重复匹配,保证分数统计准确。
内容的提问来源于stack exchange,提问作者popcoder
相关产品推荐
相关产品推荐

