Gremlin - 同时限制遍历迭代并搜索边 属性
Gremlin - simultaneously limit traverse iterations and search for edge property
我有一段(损坏的)gremlin 代码来生成从给定顶点到具有参数 test_parameter
的顶点的最短路径。如果在边上找不到该参数,则不应 return 编辑任何路径。
s.V(377524408).repeat(bothE().has('date', between(1554076800, 1556668800)).otherV()) /* date filter on edges */
.until(or(__.bothE().has('test_property', gt(0)),
loops().is(4))) /* broken logic! */
.path()
.local(unfold().filter(__.has('entity_id')).fold()) /* remove edges from output paths*/
中断的行是 .until(or(__.outE().has('test_property', gt(0)), loops().is(4)))
。
目前 - 原因是有道理的 - 它给出了距起始顶点 4 跳的所有路径。
我正在尝试调整它,以便如果遍历是 4 次迭代,并且如果 属性 test_property
是 而不是 找到,那么它应该没有 return 任何路径。如果找到 test_property
,它应该 return 只有到该顶点的路径。
我试图在 times(4)
条件中加入并删除 loops()
条件,但不知道如何同时拥有 times(4)
和 .has('test_property', gt(0))
约束。
这应该有效:
s.V(377524408).
repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().as('v')).
times(4).
filter(bothE().has('test_property', gt(0))).
select(all, 'v')
另请注意,我用更简单的东西替换了您的 local(unfold().filter(__.has('entity_id')).fold())
(假设唯一目的是从路径中移除边缘)。
Daniel 的回答几乎没有问题(请参阅评论)。
此查询 returns 正确结果:
g.V(377524408)
.repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().simplePath().as("v"))
.until(and(bothE().has('tp', gt(0)), loops().is(lte(4))))
.select(all, "v")
.limit(1)
simplePath()
是必须的,所以我们不会来回绕圈子。
重复循环直到满足条件并且我们还没有达到最大跳数。
limit(1)
return 只有第一条(最短)路径。省略获取所有路径。
请注意,如果图形是有向的,最好使用 outE()
而不是 bothE()
。
我有一段(损坏的)gremlin 代码来生成从给定顶点到具有参数 test_parameter
的顶点的最短路径。如果在边上找不到该参数,则不应 return 编辑任何路径。
s.V(377524408).repeat(bothE().has('date', between(1554076800, 1556668800)).otherV()) /* date filter on edges */
.until(or(__.bothE().has('test_property', gt(0)),
loops().is(4))) /* broken logic! */
.path()
.local(unfold().filter(__.has('entity_id')).fold()) /* remove edges from output paths*/
中断的行是 .until(or(__.outE().has('test_property', gt(0)), loops().is(4)))
。
目前 - 原因是有道理的 - 它给出了距起始顶点 4 跳的所有路径。
我正在尝试调整它,以便如果遍历是 4 次迭代,并且如果 属性 test_property
是 而不是 找到,那么它应该没有 return 任何路径。如果找到 test_property
,它应该 return 只有到该顶点的路径。
我试图在 times(4)
条件中加入并删除 loops()
条件,但不知道如何同时拥有 times(4)
和 .has('test_property', gt(0))
约束。
这应该有效:
s.V(377524408).
repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().as('v')).
times(4).
filter(bothE().has('test_property', gt(0))).
select(all, 'v')
另请注意,我用更简单的东西替换了您的 local(unfold().filter(__.has('entity_id')).fold())
(假设唯一目的是从路径中移除边缘)。
Daniel 的回答几乎没有问题(请参阅评论)。 此查询 returns 正确结果:
g.V(377524408)
.repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().simplePath().as("v"))
.until(and(bothE().has('tp', gt(0)), loops().is(lte(4))))
.select(all, "v")
.limit(1)
simplePath()
是必须的,所以我们不会来回绕圈子。
重复循环直到满足条件并且我们还没有达到最大跳数。
limit(1)
return 只有第一条(最短)路径。省略获取所有路径。
请注意,如果图形是有向的,最好使用 outE()
而不是 bothE()
。