使用 Gremlin,我可以通过发出以下命令在 Azure Cosmos DB 图中创建顶点
g.addV('the-label').property('id', 'the-id')
然后使用找到它
g.V('the-label').has('id', 'the-id')
但是,我还没有找到一种方法来发出查询,如果节点丢失,则插入该节点,如果节点已经存在,则仅获取对其的引用。有办法吗?
我的具体用例是,我想在单个查询中在两个节点之间添加一条边,无论这些节点(或边,就此而言)是否已经存在。我试过这种更新插入方法,但显然 Cosmos DB 不支持 Groovy 闭包,因此它不起作用。
“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 逻辑。这个里面有讨论博客文章更详细地说。
UPDATE:从 TinkerPop 3.6.0 开始,fold()/coalesce()/unfold()
模式已很大程度上被新步骤取代 of mergeV()
and mergeE()
这极大地简化了执行类似更新插入操作所需的 Gremlin。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)