我一直在和gremlin
的sack()
步合作.当两个遍历合并时,我正在try 对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合并操作符.
我使用了以下查询,从顶点m2
和m3
同时开始遍历.
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]
,但它是m10=[3, 3]
.合并操作似乎未被触发.
我try 了相同的查询,但从顶点m1
.
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]
有了这个,我得到了预期的结果m10=[1, 1]
.正在触发合并运算符.
我并不是要用SACK来执行精确的操作.我用这个例子来描述我的问题.实际的SACK操作稍微复杂一点,但我能够重现同样的问题.
有没有其他东西需要包括在内才能让它发挥作用?
先谢谢你.