Gremlin-同时限制遍历迭代和搜索边属性

Gremlin-同时限制遍历迭代和搜索边属性,gremlin,janusgraph,gremlin-server,gremlinpython,Gremlin,Janusgraph,Gremlin Server,Gremlinpython,我有一段小精灵代码,用于生成从给定顶点到具有参数test_的顶点的最短路径。如果在边上找不到该参数,则不应返回任何路径 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)

我有一段小精灵代码,用于生成从给定顶点到具有参数test_的顶点的最短路径。如果在边上找不到该参数,则不应返回任何路径

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*/
断开的线是.untillor_uuuu.outE.具有'test_property',gt0,loops.is4

目前,它给出了距离起始顶点4跳的所有路径,这是有道理的

我试图对其进行调整,以便如果遍历在4次迭代中,并且如果没有找到属性test_属性,那么它不应该返回任何路径。如果找到test_属性,它应该只返回到该顶点的路径

我试图在中添加times4约束并删除循环条件,但不知道如何同时使用times4 this和.has'test_property',gt0约束

这应该有效:

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')
另外请注意,我替换了localunfold.filter\uuuu.has'entity\u id'。使用更简单的方法折叠,假设唯一的目的是从路径中删除边。

这应该可以:

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')

还要注意的是,我替换了localunfold.filter\uuuu.has'entity\u id'。使用更简单的方法折叠,假设唯一的目的是从路径中删除边。

Daniel的回答没有什么问题,请参见注释。 此查询返回正确的结果:

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是必需的,因此我们不会来回走动,避免出现圆圈

重复循环直到满足条件并且我们没有达到最大跳数

limit1只返回第一条最短路径。忽略获取所有路径


请注意,如果图形是有方向的,则最好使用outE,而不是两者都使用。

丹尼尔的回答几乎没有问题,请参见注释。 此查询返回正确的结果:

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是必需的,因此我们不会来回走动,避免出现圆圈

重复循环直到满足条件并且我们没有达到最大跳数

limit1只返回第一条最短路径。忽略获取所有路径


请注意,如果图形是定向的,则最好使用outE,而不是两者都使用。

您只要求test_属性位于与最终顶点相关的任何外边缘上?不是在每一条经过的边上?正确。我想得到test_属性的最短路径,它可能存在于任何边上,也可能不存在于任何边上,但前提是test_属性存在于x=4次迭代中,否则不要返回任何路径,因为不存在。您只要求test_属性位于与最终顶点相关的任何外边上?不是在每一条经过的边上?正确。我想获得测试_属性的最短路径,该路径可能存在于任何边上,也可能不存在于任何边上,但前提是测试_属性在x=4次迭代中存在,否则不要返回任何路径,因为不存在任何路径。谢谢Daniel,当我有机会测试该路径并返回给您。答案不正确。它会来回弹跳,只返回长度为4的路径。感谢大牛,当我有机会测试这个,然后再回复你。这个答案是不正确的。它将来回反弹,只返回长度为4的路径。