如何调整Gremlin查询,实现指定ID顶点的属性与元属性更新
问题描述
我有一个带元属性的顶点,数据结构如下:
"someLabel": [ { "id": "1234", "value": "value", "properties": { "currentDate": "12/12/2023", "previousDate": "10/10/2023" } } ]
需要在属性id匹配传入的hasId值时,同时更新该属性的元属性(currentDate、previousDate)和同级的value字段。
尝试了以下Gremlin查询:
g.V('9999').hasLabel('someLabel').as('a'). properties('PropertyName'). hasId('1234'). property('currentDate','12/12/2023'). property('previousDate','10/10/2023'). select('a'). property('value',<new-value>)
但查询未正确更新目标条目的value,反而新增了一个含value:new-value的新条目,结果如下:
"someLabel": [ { "id": "1234", "value": "value", "properties": { "currentDate": "12/12/2023", "previousDate": "10/10/2023" } }, { "id": "30628eea-b97a-40c9-a05f-d1e6267e8846", "value": "new-value" } ]
预期结果是:
"someLabel": [ { "id": "1234", "value": "newVal", "properties": { "currentDate": "12/12/2023", "previousDate": "10/10/2023" } } ]
解决方案
你的查询错误在于回到顶点(select('a'))后调用property('value', ...)——这是在给顶点新增一个名为value的属性条目,而非更新已定位到的someLabel属性条目的值。
正确的做法是:直接在已匹配到的目标属性对象(即properties('someLabel').hasId('1234')返回的元素)上操作,同时更新元属性和属性本身的value:
g.V('9999').hasLabel('someLabel'). // 定位到id为1234的someLabel属性条目 properties('someLabel').hasId('1234'). // 更新元属性 property('currentDate', '12/12/2023'). property('previousDate', '10/10/2023'). // 更新该属性条目的value值 property('newVal')
关键说明:
- 当遍历到
Property对象(即顶点的属性条目)时,调用property(key, value)是设置该属性的元属性; - 调用
property(value)(仅传一个参数)则是更新该Property对象的主value值; - 无需回到顶点操作,避免新增不必要的属性条目。
内容的提问来源于stack exchange,提问作者Bobby1989
相关产品推荐
相关产品推荐

