微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何匹配累积值?

如何解决如何匹配累积值?

enter image description here

鉴于这个超简单的图,A 和 Z 之间的顶点数未知,并且每条边都有距离 (dist) 属性,我必须回答以下问题:

  1. 以下是否都成立:
  • 一个顶点叫做A
  • A 最终(而不是直接)后面跟着一个最大距离为 500 的名为 B 的顶点
  • B 最终后面是 C,最大距离为 200?
  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()一个原因是有一个无状态查询,与任何特定图形分离,因为我有数千个图形并在每个图形上运行相同的查询。另一个查询的部分是动态生成的,声明式语法更适合这个用例。还有一个是我完全不明白如何使用命令式遍历来选择匹配的顶点?‍♂️

解决方法

通过 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() 步。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。