Azure Cosmos DB Graph API如何实现顶点Upsert及边的幂等添加?
在Azure Cosmos DB图中实现Gremlin Upsert(顶点/边)
针对你的需求——在顶点不存在时插入、存在时获取引用,以及添加边时忽略节点/边是否已存在的场景,Azure Cosmos DB支持使用标准Gremlin步骤实现,不需要依赖Groovy闭包,具体方案如下:
一、顶点的Upsert操作
利用coalesce结合fold()和unfold()来实现"查不到就创建"的逻辑:
g.V('the-id').fold().coalesce(unfold(), addV('the-label').property('id', 'the-id'))
逻辑说明:
V('the-id').fold():尝试查询指定id的顶点,并用fold()将结果转换为一个列表(无论是否找到顶点,都会返回一个列表)。coalesce(unfold(), addV(...)):coalesce会依次执行传入的步骤,返回第一个有结果的分支:- 如果之前的列表不为空(顶点存在),
unfold()会展开列表返回该顶点; - 如果列表为空(顶点不存在),则执行
addV分支创建新顶点。
- 如果之前的列表不为空(顶点存在),
二、添加边的Upsert操作(含节点自动创建)
要完成"在两个节点间添加边,不管节点/边是否存在"的需求,需要分三步:先Upsert第一个节点,再Upsert第二个节点,最后Upsert边。可以合并为一条Gremlin语句:
// Upsert顶点A g.V('a-id').fold().coalesce(unfold(), addV('labelA').property('id', 'a-id')) // Upsert顶点B .V('b-id').fold().coalesce(unfold(), addV('labelB').property('id', 'b-id')) // Upsert边:检查是否存在从A到B的指定边,不存在则创建 .V('a-id').as('a').V('b-id').as('b') .coalesce( __.outE('connects').where(inV().as('b')), addE('connects').from('a').to('b').property('id', 'a-id-b-id') )
关键细节:
- 边的
id设为a-id-b-id(两个顶点id拼接),确保同类型的边在两个顶点间只会存在一条; - 所有步骤均使用标准Gremlin语法,完全兼容Azure Cosmos DB,不需要任何Groovy特性。
内容的提问来源于stack exchange,提问作者Tomas Aschan
相关产品推荐
相关产品推荐

