Go语言 Gremlin MergeV更新现有元素的属性和单基数

dwbf0jvd  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(99)

我正在使用Amazon Neptune和Gremlin-go来满足我们的图形数据库需求。我正在编写代码,用g.mergeV()插入/更新(upsert)元素。但是,当找到匹配项并且属性得到更新时,新值将添加到值列表中。我想将正在更新的属性设置为single(基数),因此在任何给定时间它都只有一个值。这是我的代码

g.mergeV(['firstname': 'fname']).
    option(onCreate, [(T.label): 'Someone','lastname': 'lname']).
    option(onMatch, ['lastname': 'lname1']))

我希望更新时的值如下所示

{'firstname': ['fname'], 'lastname': ['lname1']}

但是,更新后的值如下所示

{'firstname': ['fname'], 'lastname': ['lname','lname1']}

不幸的是,海王星的默认属性基数是一个列表。我希望使用property()将工作,如果找到一个匹配,但得到这个错误

g.mergeV(['firstname': 'fname']).
    option(onCreate, [(T.label): 'Someone','lastname': 'lname']).
    option(onMatch, __.property(single, ['lastname': 'lname1'])))

"detailedMessage": "com.amazon.neptune.tinkerpop.structure.NeptuneVertex cannot be cast to java.util.Map"

我也尝试过fold/coalesce/unfold方法,但是如果找到记录,值不会更新

g.V().hasLabel("Someone").
      has("firstname", "fname").
      has("lastname", "lname").
      fold().
      coalesce(unfold(), 
               __.addV("Someone").property(**single**, ["firstname": "fname", "lastname": "lname1"]))

我愿意使用另一种方式,只要它是upsert。

pengsaosao

pengsaosao1#

一些评论。

  1. Amazon Neptune使用的默认基数实际上是Set而不是List
    1.要使用coalesce形式的查询,您需要为LHS提供一个不仅仅是unfold的操作,因为如果顶点已经存在,则将采用该路径。因此,查询将是这样的:
g.V().hasLabel("Someone").
      has("firstname", "fname").
      has("lastname", "lname").
      fold().
      coalesce(unfold().property(single,"firstname","Newname"), 
               addV("Someone").property(single, ["firstname": "fname", "lastname": "lname1"]))

1.可以使用mergeV查询。你只需要沿着这些路线使用稍微不同的形式。sideEffect执行实际的更新,constant([:])生成一个空Map,因为不需要更多的更改。

g.mergeV(["firstname":"firstname"]).
   option(Merge.onMatch,sideEffect(property(single,"firstname","Newname")).constant([:]))

注意您需要运行引擎版本为1.2.1.0.R2或更高版本的Amazon Neptune,才能运行sideEffect版本的查询。

相关问题