2016-08-08 6 views
3

В языке Гремлина (ребенок Groovy) меня немного смущает поведение и использование ;, &&.Что такое синтаксис для операторов последовательности в Gremlin?

Например, в GremlinClient РЕПЛ (работает Titan 1.0 здесь) я мог бы желать, чтобы добавить несколько узлов сразу:

gremlin> graph = TitanFactory.open("../conf/gremlin-server/titan-cassandra-server.properties") 
==>standardtitangraph[cassandra:[localhost]] 
gremlin> g = graph.traversal(standard()) 
==>graphtraversalsource[standardtitangraph[cassandra:[localhost]], standard] 
gremlin> g.V().count() 
==>0 
gremlin> g.addV(label, 'Subject', 'ident', '1') ; g.addV(label, 'Subject', 'ident', '2') 
==>v[4304] 
gremlin> g.V().count() 
==>1 

ОК, так ; не работал. Как насчет &&? Это не совсем имеет семантику я хочу, но я мог бы работать через него:

gremlin> g.V().count() 
==>0 
gremlin> g.addV(label, 'Subject', 'ident', '1') && g.addV(label, 'Subject', 'ident', '2') 
==>true 
gremlin> g.V().count() 
==>2 

... Ну вот вроде нормально. Теперь мне также нужно иметь возможность связывать переменные как часть последовательности команд. Как ни странно, точка с запятой работает здесь:

gremlin> g.V().count() 
==>0 
gremlin> g.E().count() 
==>0 
gremlin> g.addV(label, 'Subject', 'ident', '1') && g.addV(label, 'Subject', 'ident', '2') 
==>true 
gremlin> node3 = graph.addVertex(label, 'Subject', 'ident', '3') ; g.V().has('ident', '1').next().addEdge('dc:isPartOf', node3) ; node3.addEdge('dc:isPartOf', g.V().has('ident','2').next()) 
==>e[35z-6d4-2l91-9n4][8248-dc:isPartOf->12496] 
gremlin> g.V().count() 
==>3 
gremlin> g.E().count() 
==>2 

Теперь вот трюк. Как я могу выполнять обе эти операции в одной строке (на самом деле, один запрос на Websocket)? Я не могу даже дублировать вышеприведенную линию node3 = ... через ; и получить надлежащую функциональность.

ответ

4

Если вы говорите конкретно о Gremlin language variants, Gremlin является чистым Groovy, так как Gremlin - это DSL, а не язык как таковой. Технически, любой действительный Groovy является действительным Гремлином.

Что касается примеров, которые вы предоставили, я считаю, что вам нужно итератировать ваш обход через .iterate() (.next() будет работать, так как вы добавляете только один элемент).

g.addV(label, 'Subject', 'ident', '1').iterate() ; g.addV(label, 'Subject', 'ident', '2') 

Гремлин консоль автоматически перебирает последние обходы только, так явное .iterate() для этого второго утверждения не требуется. Это строго эквивалентно:

g.addV(label, 'Subject', 'ident', '1').iterate() ; g.addV(label, 'Subject', 'ident', '2').iterate() 

Если вы хотите выполнить несколько операций с помощью WebSocket, вы можете просто отправить многострочные скрипты. Следующий должны работать:

node3 = graph.addVertex(label, 'Subject', 'ident', '3') 
g.V().has('ident', '1').next().addEdge('dc:isPartOf', node3) 
node3.addEdge('dc:isPartOf', g.V().has('ident','2').next()) 

Обратите внимание, что с более новой версией TinkerPop (я помню v3.1 +), вы можете цепи .addV() шагов и добавить несколько вершин в пределах одного обхода.

g.addV(label, 'Subject', 'ident', '1').addV(label, 'Subject', 'ident', '2') 

Это еще не доступно в Titan с последней стабильной версии (v1.0.0) использует TinkerPop v3.0.1.

+2

«Итерация вашего обхода» каждый раз ловит людей. Также см .: http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration - обратите внимание, что Гремлин был «отличным» в TinkerPop 2.x. Я бы не стал больше налагать это ограничение на TinkerPop 3.x. –

+0

Большое вам спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^