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
相关产品推荐
相关产品推荐

