为什么不能将 Gremlin GraphTraversal 捕获为 Groovy 变量?

Dmi*_*sky 1 groovy gremlin tinkerpop tinkerpop3

我正在试验TinkerPop3 文档中的遍历示例。在Gremlin shell 中使用,加载了经典图形g = TinkerFactory.createClassic()

gremlin> marko = g.v(1)
==>v[1]
gremlin> marko
==>v[1]
Run Code Online (Sandbox Code Playgroud)

然而:

gremlin> marko = g.V().has('name', 'marko')
==>v[1]
gremlin> marko
gremlin>
Run Code Online (Sandbox Code Playgroud)

为什么第二种形式没有捕获v[1]


鉴于第二种形式,尝试使用该变量会导致错误:

gremlin> marko.out('knows')
The traversal strategies are complete and the traversal can no longer have steps added to it
Display stack trace? [yN] 
Run Code Online (Sandbox Code Playgroud)

ste*_*tte 6

您正在处理来自每个结果的不同类类型。考虑我的控制台会话如下:

gremlin> g = TinkerFactory.createClassic()
==>tinkergraph[vertices:6 edges:6]
gremlin> marko = g.v(1)
==>v[1]
gremlin> marko.class
==>class com.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex
Run Code Online (Sandbox Code Playgroud)

上面产生了一个Vertex但是你可以在下面看到:

gremlin> marko = g.V().has('name','marko')
==>v[1]
gremlin> marko.class
==>class com.tinkerpop.gremlin.tinkergraph.process.graph.TinkerGraphTraversal
Run Code Online (Sandbox Code Playgroud)

你得到一个Traversal实例。您会看到控制台的输出,v[1]因为控制台已自动为您迭代结果。既然你已经迭代了,marko就变空了:

gremlin> marko.hasNext()
==>false
Run Code Online (Sandbox Code Playgroud)

如果要手动迭代,请执行以下操作:

gremlin> marko = g.V().has('name','marko');null
==>null
gremlin> marko.hasNext()
==>true
gremlin> marko
==>v[1]
Run Code Online (Sandbox Code Playgroud)