You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gremlin中sack()步骤的Merge Operator未按预期工作求助

Gremlin sack()合并操作未按预期生效的问题

我在使用Gremlin的sack()步骤时,遇到了遍历器合并时sack操作未触发的问题。为复现问题,我创建了如下示例图:

图创建脚本

g.addE("causes").from(coalesce(V().has("Name","m1"),addV().property("Name","m1"))).to(coalesce(V().has("Name","m2"),addV().property("Name","m2")));
g.addE("causes").from(coalesce(V().has("Name","m1"),addV().property("Name","m1"))).to(coalesce(V().has("Name","m3"),addV().property("Name","m3")));
g.addE("causes").from(coalesce(V().has("Name","m1"),addV().property("Name","m1"))).to(coalesce(V().has("Name","m4"),addV().property("Name","m4")));
g.addE("causes").from(coalesce(V().has("Name","m2"),addV().property("Name","m2"))).to(coalesce(V().has("Name","m5"),addV().property("Name","m5")));
g.addE("causes").from(coalesce(V().has("Name","m2"),addV().property("Name","m2"))).to(coalesce(V().has("Name","m6"),addV().property("Name","m6")));
g.addE("causes").from(coalesce(V().has("Name","m3"),addV().property("Name","m3"))).to(coalesce(V().has("Name","m7"),addV().property("Name","m7")));
g.addE("causes").from(coalesce(V().has("Name","m3"),addV().property("Name","m3"))).to(coalesce(V().has("Name","m8"),addV().property("Name","m8")));
g.addE("causes").from(coalesce(V().has("Name","m6"),addV().property("Name","m6"))).to(coalesce(V().has("Name","m9"),addV().property("Name","m9")));
g.addE("causes").from(coalesce(V().has("Name","m7"),addV().property("Name","m7"))).to(coalesce(V().has("Name","m9"),addV().property("Name","m9")));
g.addE("causes").from(coalesce(V().has("Name","m9"),addV().property("Name","m9"))).to(coalesce(V().has("Name","m10"),addV().property("Name","m10")));

我用sack统计遍历深度,设置minus作为遍历器相遇时的sack合并操作符。

问题场景1:从m2和m3同时遍历

先获取顶点ID:

gremlin> g.V().has("Name","m2").id();
==>4200
gremlin> g.V().has("Name","m3").id();
==>4208

执行查询:

gremlin> g.withSack(0,minus).V(4200,4208).repeat(optional(outE().sack(sum).by(constant(1)).inV())).as('endnode').times(10).sack().group().by(select('endnode').values('Name')).unfold();
==>m5=[1]
==>m8=[1]
==>m10=[3, 3]

预期结果中m10应为[1, 1],但实际得到[3, 3],合并操作未触发。

问题场景2:从m1遍历

获取顶点ID:

gremlin> g.V().has("Name","m1").id();
==>4256

执行相同逻辑的查询:

gremlin> g.withSack(0,minus).V(4256).repeat(optional(outE().sack(sum).by(constant(1)).inV())).as('endnode').times(10).sack().group().by(select('endnode').values('Name')).unfold();
==>m4=[1]
==>m5=[2]
==>m8=[2]
==>m10=[1, 1]

此次得到预期结果,合并操作正常触发。

我只是用这个示例复现问题,实际的sack操作更复杂,但遇到同样的异常。请问需要添加什么配置才能让第一个场景正常工作?

内容的提问来源于stack exchange,提问作者Naveen Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:30:27