【问题标题】:UPSERT an edge with properties with GremlinUPSERT 具有 Gremlin 属性的优势
【发布时间】:2022-01-09 20:52:42
【问题描述】:

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

我有这个,它在 id 为AmyJohn 的两个顶点之间添加了一个manages 边缘和一个duration 属性。

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')).

查询确实执行了 upsert,但如果我更改 duration 属性的值、删除 duration 属性或添加其他属性,则属性更改不会反映在边缘上。

我希望能够更改 duration 属性的值,而无需添加新边缘或删除旧边缘。

我是 Gremlin 的新手,所以请分享任何可能有帮助的建议。

我不确定这是否重要,但底层数据库是 Azure Cosmos DB。

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    Kevin's answer 的两个补充:

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

    2. 对于 Cosmos DB Gremlin API,在不使用 g 时使用匿名类 __

    g.V('Amy').
      outE('manages').where(inV().hasId('John')).
      fold().
      coalesce(
        unfold(),
        __.addE('manages').from(__.V('Amy')).to(__.V('John'))).
      property('duration', '1year')
    

    更详细的例子here

    【讨论】:

    • Linda,谢谢你的帮助,今天晚些时候我会检查一下,并报告它是否解决了我的问题。
    • 我尝试了两个代码示例,这个第一次工作。感谢 Linda 和 Kevin 的意见
    【解决方案2】:

    要始终应用属性更改,无论边缘是否存在或已创建,您只需将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')
    

    【讨论】:

    • Kelvin,感谢您的帮助,我会在今天晚些时候查看并报告它是否解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多