如何匹配()累加值?

How to match() on an accumulated value?

给定这个超简单的图,A 和 Z 之间的顶点数量未知,每条边的距离为 (dist) 属性,我必须回答以下问题:

  1. 以下是否都成立:
  1. A->B + B->C 的累积距离是多少?

如果我忽略距离限制,我可以通过执行以下操作找到我需要的东西:

g.V().match(
            as("a").has("name", "A"), //A exists
            as("a").out()
                    .until(has("name", "B"))
                    .repeat(out())
                    .as("b"),       //A is eventually followed by B
            as("b").out()
                    .until(has("name", "C"))
                    .repeat(out())
                    .as("c"))       //B is eventually followed by C
            .select("a", "b", "c").by("name")

从这里,我可以简单地调用 hasNext() 来检查是否满足所有条件,并调用 next() 来获取实际匹配的顶点。到目前为止,一切都很好。但是现在如何添加距离限制

注意:我使用match()的一个原因是有一个无状态查询,与任何特定的图表分离,因为我有成千上万的图表和运行 对每个相同的查询。另一个是部分查询是动态生成的,声明式语法更适合这种用例。还有一个就是我完全不明白如何使用命令式遍历select匹配的顶点‍♂️

通过 sack() 追踪个人距离。还可以使用当前的 sack 值提前取消遍历(除非距离可以为负)。找到检查点后,将 sack 的值存储在全局副作用中。最终计算所有存储的距离之和,确定累计距离。

在代码中:

g.V().match(
            __.as("a").has("name", "A"),
            __.as("a").sack(assign).
                         by(constant(0)).
                       repeat(outE().sack(sum).by("dist").
                              filter(sack().is(lte(500))).inV()).
                         until(has("name", "B")).
                       group("dist").
                         by(constant("a-b")).
                         by(sack()).as("b"),
            __.as("b").sack(assign).
                         by(constant(0)).
                       repeat(outE().sack(sum).by("dist").
                              filter(sack().is(lte(1000))).inV()).
                         until(has("name", "C")).
                       group("dist").
                         by(constant("b-c")).
                         by(sack()).as("c")).
            select("a", "b", "c", "dist").
              by("name").
              by("name").
              by("name").
              by(select(values).sum(local))

如果距离可以有负值,您将需要删除 filter() 个步骤。