我一直在和gremlinsack()步合作.当两个遍历合并时,我正在try 对SACK执行一些操作.但由于某些原因,合并似乎并没有像预期的那样奏效.为了描述我的问题,我创建了一个示例图表.

enter image description here

重现图表的步骤

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合并操作符.

我使用了以下查询,从顶点m2m3同时开始遍历.

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操作稍微复杂一点,但我能够重现同样的问题.

有没有其他东西需要包括在内才能让它发挥作用?

先谢谢你.

推荐答案

看起来,m~2+m~3的Start示例和仅M1的Start之间有一个关键区别.

当您仅从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();

只有1个遍历器进入Repeat,在这种情况下,当两条路径都到达M9时,合并发生在Repeat内.此时,两个SACS的值都为3,减go 该值后,每个SACS的值为0.然后,当它们移动到m10时,它们都递增,这就是[1,1].

在2个起点的示例中:

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();

有两个不同的导线进入重复.这些Repeat调用中的每一个都是独立运行的,并且它们之间不存在合并/合并.在这种情况下,Repeat的"m2"调用完全运行,发现从m2到m10的距离是3.然后,"m3"调用运行,发现从m3到m10的距离也是3.然后,这两个SAC都被访问并分组形成[3,3].通过在重复后添加barrier()步,可以强制退出重复的2个m10遍历块.在重复之后,这将23英尺高的S合并为0英尺高的S.

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

在我看来,预计不会在重复的单独迭代中进行组合/合并.在Gremlin中,子遍历的每次执行通常都是彼此独立的.

Java相关问答推荐

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

将具有多个未知字段的SON映射到Java POJO

根据对象和值的参数将映射<;T、值&>转换为列表<;T&>

是否保证在事务性块的末尾标记违反约束?

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

Java-动态绑定-问题-了解

Arrays.hashcode(int[])为不同的元素提供相同的散列

如何在我的世界中为互动增加冷却时间?

Cordova Android Gradle内部版本组件不兼容

try 在两个不同数组的数字之间求平均值

如何使用MapStrCut转换双向链接

如何处理两个几乎相同的XSD文件?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

如何通过gradle命令行从build.gradle获得Java targetCompatibility

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

Cucumber中第二个网页的类对象未初始化

如何使用命令行为Java应用程序生成烟雾测试用例

在对象列表上调用提取后,如何判断没有值为空?