next() 在 TinkerPop 中意味着什么
What next() means in TinkerPop
我目前正在阅读 TinkerPop3 Documentation
我很困惑的是我找不到关于next()
的任何解释。
例如,w/ next() 或 w/o next() returns 相同顶点
gremlin> g.V().has('name', 'marko')
==>v[1]
gremlin> g.V().has('name', 'marko').next()
==>v[1]
但是,class 名称彼此不同。
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
手册中还有许多其他例子让我感到困惑。
希望marko和他的朋友们能帮帮我。
简短的回答是 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
你现在知道 marko
是一个 Iterator
,所以当你再次计算它时,控制台会尝试迭代它。当然,控制台已经在上一行对其进行了迭代,因此当它再次尝试这样做时,没有任何额外的迭代。这是一个示例,可以更清楚地了解正在发生的事情:
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
。为什么?因为我的脚本 returns null
而不是 x
。
现在应该清楚您的 clock
示例在做什么...调用 next()
的第一行正在测量遍历的执行,第二行正在测量执行Traversal
结构。为什么在这种情况下需要调用 next()
?因为 Traversal
在闭包内部 - 请记住,控制台仅迭代函数的 return 值,而不是脚本中的每个 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
我目前正在阅读 TinkerPop3 Documentation
我很困惑的是我找不到关于next()
的任何解释。
例如,w/ next() 或 w/o next() returns 相同顶点
gremlin> g.V().has('name', 'marko')
==>v[1]
gremlin> g.V().has('name', 'marko').next()
==>v[1]
但是,class 名称彼此不同。
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
手册中还有许多其他例子让我感到困惑。
希望marko和他的朋友们能帮帮我。
简短的回答是 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
你现在知道 marko
是一个 Iterator
,所以当你再次计算它时,控制台会尝试迭代它。当然,控制台已经在上一行对其进行了迭代,因此当它再次尝试这样做时,没有任何额外的迭代。这是一个示例,可以更清楚地了解正在发生的事情:
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
。为什么?因为我的脚本 returns null
而不是 x
。
现在应该清楚您的 clock
示例在做什么...调用 next()
的第一行正在测量遍历的执行,第二行正在测量执行Traversal
结构。为什么在这种情况下需要调用 next()
?因为 Traversal
在闭包内部 - 请记住,控制台仅迭代函数的 return 值,而不是脚本中的每个 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