使用 Gremlin 更新一条具有属性的边

UPSERT an edge with properties with Gremlin

我正在尝试通过单个查询使用 Gremlin 中的属性更新插入边(如果不存在则插入,如果存在则更新)。

我有这个,它在 ID 为 AmyJohn.[=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')

的两个补充:

  1. 我认为你需要在outE中指定边标签,否则unfold可能return两个顶点之间存在其他关系,这些将用 属性 更新,而不是触发新边的 addE。指定边缘标签应确保折叠数组的长度在 INSERT 的情况下为 0,在 UPDATE 的情况下为 1。

  2. 对于 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