【问题标题】:What next() means in TinkerPop在 TinkerPop 中 next() 是什么意思
【发布时间】:2016-03-05 03:50:02
【问题描述】:

我目前正在阅读 TinkerPop3 Documentation

令我困惑的是,我找不到任何关于 next() 的解释。

例如,w/next() 或 w/o next() 返回相同的顶点

gremlin> g.V().has('name', 'marko')
==>v[1]
gremlin> g.V().has('name', 'marko').next()
==>v[1]

但是,类名彼此不同。

gremlin> g.V().has('name', 'marko').getClass()
==>class org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
gremlin> g.V().has('name', 'marko').next().getClass()
==>class org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex

如果没有'next()',分配的变量就没有值。

gremlin> marko = g.V().has('name', 'marko')
==>v[1]
gremlin> marko

即使是clockWithResult(),输出也完全不同。

gremlin> clockWithResult(1){g.V().both().barrier().both().barrier().both().barrier().count().next()}
==>1.079524
==>72
gremlin> clockWithResult(1){g.V().both().barrier().both().barrier().both().barrier().count()}
==>0.11863599999999999
==>[GraphStep([],vertex), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), CountGlobalStep]

或者这个例子:

gremlin> g.V(1).out('knows').values('name').fold()
==>[vadas, josh]
gremlin> g.V(1).out('knows').values('name').fold().next()
==>vadas
==>josh

在手册中,还有很多其他的例子让我感到困惑。

我希望马可和他的朋友们能帮助我。

【问题讨论】:

    标签: titan tinkerpop3


    【解决方案1】:

    简短的回答是 Gremlin 控制台会自动为您迭代结果。

    x = g.V().has('name', 'marko')
    

    在上面的例子中,x 将是一个Traversal 实例,它是Iterator 的一种类型。当控制台遇到Iterator 时,它会自动展开它,以便您可以看到结果。在这种情况下:

    x = g.V().has('name', 'marko').next()
    

    添加next() 只是表示您想调用Iterator.next() - 换句话说,您想从Iterator 中取出第一项。因此,在上述情况下,x 将是 Vertex

    对于这种情况:

    gremlin> marko = g.V().has('name', 'marko')
    ==>v[1]
    gremlin> marko
    

    您现在知道markoIterator,因此当您再次评估它时,控制台会尝试对其进行迭代。当然,控制台已经在上一行迭代了它,所以当它再次尝试这样做时,没有任何额外的迭代。下面是一个示例,可以更清楚地了解正在发生的事情:

    gremlin> x = g.V();null
    ==>null
    gremlin> x.next()
    ==>v[1]
    gremlin> x.next()
    ==>v[2]
    gremlin> x
    ==>v[3]
    ==>v[4]
    ==>v[5]
    ==>v[6]
    

    注意在第一行使用;null,这会阻止控制台迭代x。为什么?因为我的脚本返回null 而不是x

    现在应该清楚您的clock 示例正在做什么...调用next() 的第一行是测量遍历的执行,第二行是测量Traversal 构造的执行.在这种情况下,为什么需要拨打next()?因为 Traversal 在闭包内 - 请记住,控制台仅迭代函数的返回值,而不是脚本中的每个 Iterator

    最后:

    gremlin> g.V(1).out('knows').values('name').fold()
    ==>[vadas, josh]
    gremlin> g.V(1).out('knows').values('name').fold().next()
    ==>vadas
    ==>josh
    

    希望我在上面讨论的所有其他内容都可以让您了解为什么 next() 会产生这种行为,但以防万一,这就是控制台本质上所做的事情:

    gremlin> x = g.V(1).out('knows').values('name').fold();null
    ==>null
    gremlin> y = x.next();null
    ==>null
    gremlin> y
    ==>vadas
    ==>josh
    

    【讨论】:

    • 每个 gremlin sn-ps 都摘自 TinkerPop3 Documentation 所以,“为什么在这种情况下需要调用 next()?” => 手册名为next() ;)
    • 请回答this question好吗?如果可以的话,我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2010-12-28
    相关资源
    最近更新 更多