gpt4 book ai didi

azure-cosmosdb - CosmosDB 图 : "upsert" query pattern

转载 作者:行者123 更新时间:2023-12-04 05:05:53 24 4
gpt4 key购买 nike

我是 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 查询?

提前致谢。

最佳答案

有很多方法可以做到这一点,但我认为 TinkerPop 社区通常采用这种方法:

g.V().has('event','id','1').
fold().
coalesce(unfold(),
addV('event').property('id','1'))

基本上,它使用 has() 寻找“事件”。并使用 fold()强制到列表的步骤。该列表要么是空的,要么有 Vertex在其中。然后用 coalesce() ,它试图 unfold()列表,如果它有 Vertex否则立即返回,它执行 addV() .

如果想法是在找到元素后更新现有属性,只需添加 property() coalesce() 后的步骤:
g.V().has('event','id','1').
fold().
coalesce(unfold(),
addV('event').property('id','1')).
property('description','This is an event')

如果您需要知道返回的顶点是否是“新的”,那么您可以执行以下操作:
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)))

可以在以下问题中找到有关此主题的其他阅读 Material :“ Why do you need to fold/unfold using coalesce for a conditional insert?

另请注意,此处描述了可选的边缘插入:“ Add edge if not exist using gremlin”。

最后要注意的是,虽然这个问题是关于 CosmosDB 的,但答案通常适用于所有启用 TinkerPop 的图形。当然,图如何优化这个 Gremlin 是一个单独的问题。如果图具有 native upsert 功能,则该功能可能会或可能不会在此 Gremlin 的幕后使用,因此可能有更好的方法通过图系统 native API 来实现 upsert(当然,选择该路径会降低您的代码)。

关于azure-cosmosdb - CosmosDB 图 : "upsert" query pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com