CosmosDB图:“upsert”查询模式

时间:2018-04-10 16:14:43

标签: azure-cosmosdb gremlin

我是Gremlin查询语言的新手。 我必须在Cosmos DB图表上插入数据(使用Gremlin.Net包),无论顶点(或边缘)是否已存在于图形中。如果数据存在,我只需要更新属性。 我想使用这种模式:

g.V().hasLabel('event').has('id','1').tryNext().orElseGet {g.addV('event').has('id','1')}

但Gremlin.Net / Cosmos DB图API不支持它。有没有办法在单个查询中进行一种upsert查询?

提前致谢。

1 个答案:

答案 0 :(得分:10)

有很多方法可以做到这一点,但我认为TinkerPop社区一般都采用这种方法:

g.V().has('event','id','1').
  fold().
  coalesce(unfold(),
           addV('event').property('id','1'))

基本上,它会寻找"事件"使用has()并使用fold()步骤强制列表。该列表将为空或其中包含Vertex。然后使用coalesce(),它会尝试unfold()列表,如果它有一个Vertex,否则会立即返回,它会执行addV()

如果你需要知道返回的顶点是否是" new"或者不然后你可以做这样的事情:

g.V().has('event','id','1').
  fold().
  coalesce(unfold().
           project('vertex','exists').
             by(identity()).
             by(constant(true)),
           addV('event').property('id','1').
           project('vertex','exists').
             by(identity()).
             by(constant(false)))