如何匹配()累加值?
How to match() on an accumulated value?
给定这个超简单的图,A 和 Z 之间的顶点数量未知,每条边的距离为 (dist
) 属性,我必须回答以下问题:
- 以下是否都成立:
- 有一个名为 A 的顶点
- A 最终(与直接相反)后跟一个名为 B 的顶点,最大距离为 500
- B 最终 后跟 C,最大距离为 200?
- 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()
个步骤。
给定这个超简单的图,A 和 Z 之间的顶点数量未知,每条边的距离为 (dist
) 属性,我必须回答以下问题:
- 以下是否都成立:
- 有一个名为 A 的顶点
- A 最终(与直接相反)后跟一个名为 B 的顶点,最大距离为 500
- B 最终 后跟 C,最大距离为 200?
- 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()
个步骤。