【问题标题】:The provided traversal does not map to a value提供的遍历未映射到值
【发布时间】:2020-06-24 10:36:16
【问题描述】:

我正在尝试执行数学查询。

gts.V()
.hasLabel("account")
.has("id",42)
.both("account_label1").as("label1")
.and(__.identity()
        .project("a","b")
        .by(__.identity()
                .both("label1_label2")
                .both("label2_label3")
                .values("createTime"))
        .by(__.identity()
                .both("label1_label4")
                .both("label4_label5")
                .values("launchTime"))
        .math("floor((a-b)/(86400))").is(100))
.select("label1")
.toList()

以上查询失败并出现错误

The provided traverser does not map to a value: v[137]->[IdentityStep, VertexStep(BOTH,[label1_label2],vertex), VertexStep(BOTH,[label2_label3],vertex), NoOpBarrierStep(2500), PropertiesStep([createTime],value)]
  1. 为什么 gremlin 注入 NoOpBarrierStep?
  2. NoOpBarrierStep(2500) 是什么意思?
  3. 什么是相同的正确 gremlin 查询?

【问题讨论】:

    标签: gremlin tinkerpop tinkerpop3


    【解决方案1】:

    当您使用project() 时,它期望每个by() 调制器都有一个值,并且该值不应产生一个空的Iterator。这是一个简单的例子:

    gremlin> g = TinkerFactory.createModern().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
    gremlin> g.V().project('x').by(out())
    ==>[x:v[3]]
    The provided traverser does not map to a value: v[2]->[VertexStep(OUT,vertex)]
    Type ':help' or ':h' for help.
    Display stack trace? [yN]
    

    第一个顶点能够遍历out(),但project() 处理的下一个顶点没有出边,因此会产生此错误。在您的情况下,这仅意味着并非所有遍历器都可以遍历both().both(),或者如果可以,您希望确保它们都具有“createTime”属性值。这些情况中的任何一种都可能导致问题。

    您可以通过多种方式解决此问题。显然,如果这是一个数据问题,您可以简单地修复您的数据并始终假设遍历路径是正确的。如果不是这种情况,如果遍历路径不可用,您需要编写 Gremlin 以使其更加宽容。就我而言,我可以这样做:

    gremlin> g.V().project('x').by(out().fold())
    ==>[x:[v[3],v[2],v[4]]]
    ==>[x:[]]
    ==>[x:[]]
    ==>[x:[v[5],v[3]]]
    ==>[x:[]]
    ==>[x:[v[3]]]
    

    也许在你的情况下你可能会这样做:

    by(coalesce(both("label1_label2").both("label2_label3").values("createTime"),
                constant('n/a')))
    

    请注意,您无需指定 identity() 来开始匿名遍历。

    最后,在回答您关于 NoOpBarrierStep 的问题时,该步骤被注入到 Gremlin 认为可以利用 bulking optimization 的遍历中。您也可以使用barrier() 步骤自己添加它们。下面是从 TinkerPop 参考文档中对“bulking”的简要描述:

    “批量优化”背后的理论很简单。如果顶点 1 有 100 万个遍历器,则不需要计算 100 万个 both() 计算。相反,将这 100 万个遍历器表示为一个 Traverser.bulk() 等于 100 万个遍历器,并执行一次 both()。

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2019-02-26
      • 2018-07-31
      相关资源
      最近更新 更多