【问题标题】:Is possible in gremlin to count something inside a choose and then go back to a previous step?在 gremlin 中是否可以在选择中计算某些内容然后返回上一步?
【发布时间】:2020-07-20 02:49:46
【问题描述】:

是否可以在 gremlin 中对 choose() 中的内容进行计数,然后返回到遍历中的上一步?:

g.V()
.hasLabel("user1")
.as("firstStep")
.V()
.as("secondStep")
.fold()
.choose(
    count(local).is(gt(1)),
    select('firstStep'),
    select('secondStep')
)

执行了 select('firstStep') 行,但没有返回任何内容,因为此时 .as("firstStep") 存储的所有内容都被 fold() 删除了

当然我总是可以以牺牲性能为代价解决这种问题,搜索2次重复成本:

g.V()
.hasLabel("user1")
.choose(
    V().fold().count(local).is(lt(2)),
    V().fold()
)

我正在寻找比这更好的解决方案。

这就像我去商店付钱一样,因为我必须计算零钱,我忘记了如何回到我的软管,电影中的小精灵比这更聪明。我希望有一个我忽略的解决方案。

编辑: 有一个答案建议将 as() 替换为 store() 但这不是一个通用的解决方案,在大多数情况下都不起作用,因为这些工具非常不同,例如这个查询有同样的问题并将 as() 替换为store() 给出了不同的结果:

g.V()
.hasLabel('user')
.project("user")
.by(
    as("singleUser")
    .V()
    .fold()
    .choose(
        count(local).is(gt(1)),
        select('singleUser'),
        unfold()
    )
)

【问题讨论】:

    标签: gremlin tinkerpop tinkerpop3 gremlin-server


    【解决方案1】:

    在此模式中,您可以使用store 步骤,这样“firstStep”将在fold 之后保存。

    g.V().hasLabel('user1').store('firstStep').
      V().
      fold().choose(
        count(local).is(gt(1)),
        select('firstStep').unfold(),
        select('secondStep')
      )
    

    示例:https://gremlify.com/mg7noyf1cdq

    【讨论】:

    • 我不认为这个答案是完整或有用的,因为 store() 是一个非常不同的工具,在几乎所有情况下都不是要替换 as(),因为 as() 称为 2第二次使用相同的字符串覆盖第一次但 store() 将第二次添加到列表中,因此它的行为不同,例如在 project().by() 中看到这两个查询是相同的,除了一个使用 as( ) 和另一个 store(),输出不同: 1. gremlify.com/cmv4m0kd5v9 2. gremlify.com/bo94m3m3tcf/1 顺便说一句,存储步骤是无证的。我将编辑我的帖子以包含此
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多