Gremlin при сохранении GremlinGroovyPipeline и вызове для него .count()

Это работает так, как ожидалось:

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.


person gak    schedule 31.10.2012    source источник


Ответы (2)


Конвейер является итератором, поэтому, когда конвейер исчерпан, он становится «пустым». Консоль 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
person stephen mallette    schedule 17.08.2013

Одно решение, которое я обнаружил, состоит в том, чтобы сначала преобразовать его в список, но оно не кажется идеальным и на самом деле не говорит мне, почему эта переменная ведет себя по-другому:

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
person gak    schedule 31.10.2012