这可以按预期工作:
gremlin> root.out.outE.has('size', 4).count()
==>3
gremlin> result = root.out.outE.has('size', 4).count()
==>3
gremlin> result
==>3
gremlin> root.out.outE.has('count', 4).getClass()
==>class com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline
当我将 GremlinGroovyPipeline
存储到变量中时,我不能再 count()
了:
gremlin> result = root.out.outE.has('size', 4)
==>e[359:200:36028797018964014][200-sizes->40]
==>e[669:404:36028797018964014][404-sizes->400]
==>e[855:516:36028797018964014][516-sizes->524]
gremlin> result.count()
==>0
gremlin> result.getClass()
==>class com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline
这对我来说很奇怪。看来一旦分配了变量,结果就消失了。
我在BDB上使用Titan。
管道是迭代器,因此一旦管道用尽了,它是"空"。Gremlin控制台会自动为您迭代管道,因此即使您将管道存储到变量中,它也可以有效地耗尽列表。
考虑此示例的清晰度
gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> pipeline=g.v(1).out
==>v[2]
==>v[4]
==>v[3]
gremlin> pipeline.next()
com.tinkerpop.pipes.util.FastNoSuchElementException
Display stack trace? [yN] n
gremlin> pipeline.count()
==>0
请注意,就像您的示例中一样,管道中没有任何东西。所以...如果要在变量中"存储"非艾觉管道以进行以后评估,则需要防止控制台自动识别它:
gremlin> pipeline=g.v(1).out;null
==>null
gremlin> pipeline.count()
==>3
当然,一旦您迭代它。...它是空的:
gremlin> pipeline.count()
==>0
,您必须再次初始化该管道:
gremlin> pipeline=g.v(1).out;null
==>null
gremlin> pipeline.next()
==>v[2]
gremlin> pipeline.next()
==>v[4]
gremlin> pipeline.next()
==>v[3]
gremlin> pipeline.next()
com.tinkerpop.pipes.util.FastNoSuchElementException
Display stack trace? [yN] n
gremlin> pipeline.count()
==>0
因此,如果您想继续使用结果,可以做的最好的事情就是迭代列表,就像您对自己的回应一样。
gremlin> l=[];g.v(1).out.fill(l)
==>v[2]
==>v[4]
==>v[3]
gremlin> l.size()
==>3
我发现的一种解决方案是首先将其转换为列表,但似乎并不理想,并且并没有真正告诉我为什么此变量的行为不同:
gremlin> result = root.out.outE.has('size', 4).toList()
==>e[359:200:36028797018964014][200-sizes->40]
==>e[669:404:36028797018964014][404-sizes->400]
==>e[855:516:36028797018964014][516-sizes->524]
gremlin> result.size()
==>3