使用Gremlin,我可以通过发出
在Azure Cosmos DB图中创建一个顶点g.addV('the-label').property('id', 'the-id')
然后使用
找到它g.V('the-label').has('id', 'the-id')
但是,我还没有找到一种方法来发出一个查询,如果该节点丢失,它将插入该节点,如果该节点已经存在,则只获取它的引用。有办法吗?
我的具体用例是,我想在两个节点之间添加边,无论这些节点(或边缘)是否已经存在,在单个查询中。我试过this upsert approach,但显然Cosmos DB不支持Groovy闭包,所以它不会工作。
答案 0 :(得分:3)
此时,“upsert模式”的定义相对较为明确。它被描述为here。如果你想扩展它以增加边缘,那也是可能的:
g.V().has('event','id','1').
fold().
coalesce(unfold(),
addV('event').property('id','1')).as('start').
coalesce(outE('link').has('id','3'),
coalesce(V().has('event','id','2'),
addV('event').property('id','2')).
addE('link').from('start').property('id','3'))
如果看起来有点复杂,你肯定可以使用Gremlin DSL进行简化(虽然我不确定CosmosDB此时是否支持Gremlin字节码)。这是一个example,它通过DSL简化了更复杂的upsert逻辑。我们将在blog post中更详细地讨论它。
答案 1 :(得分:0)
请看这个。
http://tinkerpop.apache.org/docs/current/reference/#coalesce-step
你可以尝试
g.Inject(0).coalesce(__。V()。has(' id',' the-id'),addV(' the-label& #39;)。property(' id',' the-id')
顺便说一句,你无法使用gV(' the-label')找到顶点。有(' id',' -id&# 39)。g.V()接受顶点id作为参数而不是顶点标签。