当前位置: 首页 > 知识库问答 >
问题:

Gremlin-顶点的插入不使用合并

匡玉堂
2023-03-14

我是新的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:"upert"查询模式中给出的示例

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

共有2个答案

周子平
2023-03-14

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

阎雪峰
2023-03-14

当你写《小精灵》时,你需要从流的角度思考V()生成图中所有顶点的流。设想该流中的每个项目点击hasLabel()和has()过滤器将配对,直到它们到达减少步骤fold(),该步骤生成一个具有匹配过滤条件顶点的列表,或者,如果没有,它简单地生成一个空列表,成为流中的新对象。

从那里,coalesce()生成一种if-then排序的情况,其中提供给它的第一个子流返回一个值,最后被耗尽,其余子流被忽略。因此,如果采用由fold()生成的顶点的列表包含一个顶点,则它被提供给流,并且该顶点存在,因此生成该现有顶点,并继续执行属性(“值”,“a”)的最后两个步骤。属性(“操作”,“更新”)。如果列表为空,则展开()流不会生成任何对象,并转到下一个子流,该子流以addV()开始。显然,addV()流将生成具有指定属性的新顶点,但随后作为其父对象的聚结()将向流生成新添加的顶点,并且它也将继续执行最后两个步骤,从而覆盖您提供给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();
 类似资料:
  • 我花了几个小时试图写一个小精灵语句来处理在它们之间插入两个顶点和一条边,但运气不太好。 在伪gremlin中,我想做的事情非常简单,如下所示: 此代码的问题是每个步骤,作为屏障步骤“删除”前面步骤的值。 有没有办法在一个声明中正确地做到这一点? 感谢开尔文的回答,这里是解决方案:)

  • 我有一个顶点上插工作和一个边缘上插工作在2个单独的遍历中。是否可以将2合并为1遍历?我尝试过,但收到错误。 a=自身g.V()。has('account',id',account-111111111').fold().coalesce(.unfold(),.addV('account').property(T.id,'account-111111111'))。has('customer','id'

  • 在遍历图时,我想保存起始顶点,再进一步遍历一点,并将具有特定边的任何顶点移回保存的顶点。 这是我目前的尝试,但显然是不正确的: 如何检查Gremlin中的顶点相等?如何过滤掉存在此类相等的所有路径?

  • 如何在Gremlin查询中检索从根顶点开始的所有顶点属性? 我们有以下结构: 根顶点:Employee 边缘:EdCompany,EdDepartment,EdRole顶点:公司,部门,角色 我们试图接收与根顶点连接的其他顶点的数据。有人这样想: 我们尝试了该查询,但返回了一个复杂的JSON: 编辑: 我们还尝试了Kelvin建议的查询: 堆栈跟踪:提交查询失败:g.V().hasLabel(“E

  • 我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。

  • 我提出的问题与您在这里看到的几乎相同,但有一个约束条件,即必须使用groovy而不是java语法。理想情况下,答案应该非常简洁。 我有一个简单的人顶点图。每个人都有一个“年龄”属性,列出该人的年龄(以年为单位)。还有“worksFor”标记的边连接成对的人顶点。我希望看到所有边缘,边缘两端的人都具有相同的年龄属性。 然后我想问一个类似的问题,两个年龄相差不到3年。 如前所述,这应该是groovy语