如何解决如何匹配累积值?
鉴于这个超简单的图,A 和 Z 之间的顶点数未知,并且每条边都有距离 (dist
) 属性,我必须回答以下问题:
- 以下是否都成立:
- 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 举报,一经查实,本站将立刻删除。