我正在使用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。
1条答案
按热度按时间pengsaosao1#
一些评论。
1.要使用
coalesce
形式的查询,您需要为LHS提供一个不仅仅是unfold
的操作,因为如果顶点已经存在,则将采用该路径。因此,查询将是这样的:1.可以使用
mergeV
查询。你只需要沿着这些路线使用稍微不同的形式。sideEffect
执行实际的更新,constant([:])
生成一个空Map,因为不需要更多的更改。注意您需要运行引擎版本为1.2.1.0.R2或更高版本的Amazon Neptune,才能运行
sideEffect
版本的查询。