2016-08-08 61 views
3

Innerhalb der Gremlin-Sprache (ein Groovy Kind) bin ich ein wenig verwirrt durch das Verhalten und die Verwendung von ;, &&.Wie lautet die Syntax für Sequenzanweisungen in Gremlin?

Zum Beispiel in GremlinClient REPL (1,0 hier Titan läuft) Ich könnte ein paar Knoten auf einmal hinzuzufügen wünschen:

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 

OK, arbeiten, so hat ; nicht. Wie wäre es mit &&? Es ist nicht ganz haben die Semantik ich will, aber ich konnte durch sie arbeiten:

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

Nun ... das ist irgendwie ok. Jetzt muss ich auch in der Lage sein, Variablen als Teil der Befehlsfolge zu binden. Seltsamerweise funktioniert das Semikolon hier:

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 

Jetzt ist hier der Trick. Wie kann ich beide Vorgänge in einer Zeile ausführen (in der Praxis eine Websocket-Anfrage)? Ich kann nicht scheinen, sogar die oben genannte node3 = ... Linie über ; zu duplizieren und korrekte Funktionalität zu erhalten.

Antwort

4

Es sei denn, Sie sprechen speziell über Gremlin language variants, Gremlin ist pure Groovy seit Gremlin ist ein DSL und keine Sprache per se. Technisch ist jeder gültige Groovy gültig Gremlin.

In Bezug auf die Beispiele, die Sie zur Verfügung gestellt, glaube ich, müssen Sie Ihre Traversal über .iterate() iterieren (.next() würde funktionieren, da Sie nur ein Element hinzufügen).

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

Die Gremlin Konsole iteriert automatisch die letzten Traversierungen nur, so eine explizite .iterate() für die zweite Anweisung nicht erforderlich ist. Dies ist absolut gleichwertig:

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

Wenn Sie mehrere Operationen über WebSocket ausführen möchten, können Sie einfach mehrzeilige Skripte senden. Folgendes sollte funktionieren:

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()) 

Beachten Sie, dass mit einer neueren Version von TinkerPop (I v3.1 + erinnern), können Sie Kette .addV() Schritte und mehrere Scheitelpunkte innerhalb des gleichen Traversal hinzuzufügen.

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

Dies Titan noch nicht verfügbar ist, da die letzte stabile Version (v1.0.0) verwendet TinkerPop v3.0.1.

+2

"Iterieren Sie Ihre Traversal" fängt Menschen jedes Mal. Siehe auch: http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration - beachte, dass Gremlin in TinkerPop 2.x ein "grooviges" war. Ich würde diese Einschränkung für TinkerPop 3.x nicht mehr wirklich festlegen. –

+0

Vielen Dank! –