在Gremlin中排序语句的语法是什么?



在Gremlin语言(Groovy的子语言)中,我对;, &&的行为和使用有点困惑。

例如,在GremlinClient REPL(这里运行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 = ...行并获得适当的功能。

除非您专门讨论Gremlin语言变体,否则Gremlin是纯Groovy,因为Gremlin是DSL而不是语言本身。从技术上讲,任何有效的Groovy都是有效的Gremlin。

关于你提供的例子,我相信你需要通过.iterate()来迭代你的遍历(.next()将工作,因为你只添加一个元素)。

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

Gremlin控制台只自动迭代最后一个遍历,因此不需要为第二个语句显式地设置.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')

由于最新的稳定版本(v1.0.0)使用的是TinkerPop v3.0.1,因此在Titan中尚未提供此功能。

最新更新