在Azure Cosmos DB Graph API中添加或获取顶点

时间:2018-05-15 14:59:37

标签: azure-cosmosdb gremlin

使用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闭包,所以它不会工作。

2 个答案:

答案 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作为参数而不是顶点标签。