【问题标题】:What is the syntax to sequence statements in Gremlin?Gremlin 中对语句进行排序的语法是什么?
【发布时间】:2016-12-14 20:13:44
【问题描述】:

在 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 = ... 行并获得适当的功能。

【问题讨论】:

    标签: groovy titan gremlin tinkerpop


    【解决方案1】:

    除非您专门讨论 Gremlin language variants,否则 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 中尚不可用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多