ForEach 在 Gremlin 上的步骤

ForEach step on Gremlin

我有一个像这样的 neo4j 查询:

        ...
        "WITH DISTINCT k " +
        // classic for each loop for the new rankings information
        "FOREACH (app in $apps | " +
        // upsert the app
        " MERGE (a:App{appId:app.appId}) " +
        ...
        // end of loop
        ") " +

我正在使用 gremlin-java。在这里,我想给 $apps 作为自定义参数。我刚刚检查了 gremlin 文档,但找不到 foreach 步骤。有什么建议吗?

graph.foreach(apps: map)...

解决方法:

...constant($apps).unfold().as(app)...

如您所述,您可以使用 constant 步骤将值注入查询。但是,您也可以使用 inject 步骤以类似方式插入值集合。这里有几个简单的示例 - 您可以根据需要扩展这些模式以包含 id、label 和多个 属性 值。

gremlin> g.inject([[id:1],[id:2],[id:3],[id:4]]).
           unfold().as('a').
           addV('test').
             property('SpecialId',select('a').select('id'))
==>v[61367]
==>v[61369]
==>v[61371]
==>v[61373]

gremlin> g.V().hasLabel('test').valueMap(true)
==>[id:61367,label:test,SpecialId:[1]]
==>[id:61369,label:test,SpecialId:[2]]
==>[id:61371,label:test,SpecialId:[3]]
==>[id:61373,label:test,SpecialId:[4]]



gremlin> g.inject(1,2,3,4).as('a').
           addV('test2').
             property('SpecialId',select('a'))
==>v[61375]
==>v[61377]
==>v[61379]
==>v[61381]

gremlin> g.V().hasLabel('test2').valueMap(true)
==>[id:61375,label:test2,SpecialId:[1]]
==>[id:61377,label:test2,SpecialId:[2]]
==>[id:61379,label:test2,SpecialId:[3]]
==>[id:61381,label:test2,SpecialId:[4]]
gremlin>

第一个查询注入地图列表。第二个是一个简单的列表。这有点像您可能在 Cypher 中使用的 UNWIND 模式,它的工作方式类似。