我是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查询?
提前致谢。
答案 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)))