使用 Gremlin 更新一条具有属性的边
UPSERT an edge with properties with Gremlin
我正在尝试通过单个查询使用 Gremlin 中的属性更新插入边(如果不存在则插入,如果存在则更新)。
我有这个,它在 ID 为 Amy
和 John
.[=18 的两个顶点之间添加了一个带有 duration
属性 的 manages
边=]
g.E().where(outV().has('id','Amy')).where(inV().has('id','John')).fold().coalesce(unfold(),g.V('Amy').as('a').V('John').addE('manages').from('a').property('duration','1year'))
.
查询确实进行了更新插入,但如果我更改 duration
属性 的值、删除 duration
属性 或添加其他属性,则属性 更改不会反映在边缘上。
我希望能够更改 duration
属性 的值,而无需添加新边或不必删除旧边。
我对 Gremlin 还很陌生,所以请分享任何可能有帮助的建议。
我不确定这是否重要,但底层数据库是 Azure Cosmos DB。
要始终应用 属性 更改,无论边缘是否存在或已创建,您只需将 property
步骤移动到 coalesce
:
之后
g.E().
where(outV().has('id', 'Amy')).
where(inV().has('id', 'John')).
fold().
coalesce(
unfold(),
g.V('Amy').as('a').
V('John').
addE('manages').from('a')).
property('duration', '1year')
不过,尽管如此,还是有一些关于查询的观察结果。以 g.E()
开始可能效率低下,应避免使用 g.V()
中间遍历,必要时仅使用 V()
。
如果“John”和 'Amy' 是唯一 ID,您应该按照以下方式利用它:
g.V('Amy').
outE().where(inV().hasId('John')).
fold().
coalesce(
unfold(),
addE('manages').from(V('Amy')).to(V('John'))).
property('duration', '1year')
的两个补充:
我认为你需要在outE
中指定边标签,否则unfold
可能return两个顶点之间存在其他关系,这些将用 属性 更新,而不是触发新边的 addE。指定边缘标签应确保折叠数组的长度在 INSERT 的情况下为 0,在 UPDATE 的情况下为 1。
对于 Cosmos DB Gremlin API,在不使用 g
时使用匿名 class __
g.V('Amy').
outE('manages').where(inV().hasId('John')).
fold().
coalesce(
unfold(),
__.addE('manages').from(__.V('Amy')).to(__.V('John'))).
property('duration', '1year')
更详细的例子here。
我正在尝试通过单个查询使用 Gremlin 中的属性更新插入边(如果不存在则插入,如果存在则更新)。
我有这个,它在 ID 为 Amy
和 John
.[=18 的两个顶点之间添加了一个带有 duration
属性 的 manages
边=]
g.E().where(outV().has('id','Amy')).where(inV().has('id','John')).fold().coalesce(unfold(),g.V('Amy').as('a').V('John').addE('manages').from('a').property('duration','1year'))
.
查询确实进行了更新插入,但如果我更改 duration
属性 的值、删除 duration
属性 或添加其他属性,则属性 更改不会反映在边缘上。
我希望能够更改 duration
属性 的值,而无需添加新边或不必删除旧边。
我对 Gremlin 还很陌生,所以请分享任何可能有帮助的建议。
我不确定这是否重要,但底层数据库是 Azure Cosmos DB。
要始终应用 属性 更改,无论边缘是否存在或已创建,您只需将 property
步骤移动到 coalesce
:
g.E().
where(outV().has('id', 'Amy')).
where(inV().has('id', 'John')).
fold().
coalesce(
unfold(),
g.V('Amy').as('a').
V('John').
addE('manages').from('a')).
property('duration', '1year')
不过,尽管如此,还是有一些关于查询的观察结果。以 g.E()
开始可能效率低下,应避免使用 g.V()
中间遍历,必要时仅使用 V()
。
如果“John”和 'Amy' 是唯一 ID,您应该按照以下方式利用它:
g.V('Amy').
outE().where(inV().hasId('John')).
fold().
coalesce(
unfold(),
addE('manages').from(V('Amy')).to(V('John'))).
property('duration', '1year')
我认为你需要在
outE
中指定边标签,否则unfold
可能return两个顶点之间存在其他关系,这些将用 属性 更新,而不是触发新边的 addE。指定边缘标签应确保折叠数组的长度在 INSERT 的情况下为 0,在 UPDATE 的情况下为 1。对于 Cosmos DB Gremlin API,在不使用
时使用匿名 classg
__
g.V('Amy').
outE('manages').where(inV().hasId('John')).
fold().
coalesce(
unfold(),
__.addE('manages').from(__.V('Amy')).to(__.V('John'))).
property('duration', '1year')
更详细的例子here。