【问题标题】:Gremlin - Upsert of vertex not working with coalesceGremlin - Upsert 顶点不与合并一起使用
【发布时间】:2020-08-15 21:28:55
【问题描述】:

我是 gremlin 的新手,有一个非常简单的案例需要检查:

  • 如果顶点存在
    • 更新属性
  • 其他
    • 使用属性添加顶点

我为此使用 Java API。

我的代码:

g.V().hasLabel("Entity").has("identifier", "123").fold()
.coalesce(
    __.unfold(),
    __.addV("Entity")
        .property("identifier", "123")
        .property("value", "A")
        .property("action", "add")
    )
.property("value", "A")
.property("action", "update")
.iterate();

我知道这是一个非常简单的案例,我参考了 [CosmosDB Graph : "upsert" query pattern

中给出的示例

但它不起作用。如果顶点不存在,则添加属性,但属性也会更新。

【问题讨论】:

    标签: gremlin upsert amazon-neptune


    【解决方案1】:

    在编写 Gremlin 时,您需要从流的角度进行思考。 V() 生成图中所有顶点的流。设想该流中的每个项目点击hasLabel()和has()过滤器,直到它们到达fold()的减少步骤,这会产生一个List,其顶点与过滤器标准匹配,或者,如果没有,它simple 产生一个空列表,它成为流中的新对象。

    从那里coalesce() 产生一种 if-then 类型的情况,其中提供给它的第一个返回值的子流最终被耗尽,而其余的子流被忽略。因此,如果unfold() 采用带有fold() 生成的顶点的List 包含一个顶点,则将其提供给流并且该顶点存在并且coalesce() 因此产生该现有顶点并继续到最后两个property("value", "A").property("action", "update") 的步骤。如果List 为空,则unfold() 流不产生任何对象并转到下一个以addV() 开头的子流。 addV() 流显然会生成一个具有指定属性的新 Vertex,但随后 coalesce() 作为其父级将生成新添加的顶点到流中,它也将继续最后两个步骤,从而覆盖属性您提供给addV()的值。

    如果你想有两个独立的路径,那么你可以这样做:

    g.V().hasLabel("Entity").has("identifier", "123").fold()
    .coalesce((Traversal)
        __.unfold()
            .property("value", "A")
            .property("action", "update"),
        __.addV("Entity")
            .property("identifier", "123")
            .property("value", "A")
            .property("action", "add")
        )
    .iterate();
    

    【讨论】:

    • 上述代码因错误无法编译:GraphTraversal> 类型中的方法 coalesce(Traversal,E2>...) 不适用于参数(GraphTraversal, GraphTraversal)
    • 您可以摆脱这个问题 - 请参阅我的更新答案
    • 插入有效但更新无效
    【解决方案2】:

    顶点是否存在合并将返回现有顶点或新创建的顶点。在任何一种情况下,合并之后的属性设置步骤都将应用于流出它的任何内容。如果您只想将合并后的更改应用于现有顶点,请将它们放在展开步骤之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多