更新操作是指根据过滤条件修改图集中已有的点、边的自定义属性,由 update()
命令触发。
执行 update()
命令时:
- 根据过滤条件确定被更新的数据;
- 待修改的自定义属性的数据类型正确的,将直接更新;
- 待修改的自定义属性的数据类型与属性类型不一致的,将根据属性类型赋值为空字符串(string,text,datetime)、0(int32,int64,uint32,uint64,float,double)、"1970-01-01 08:00:00 +08:00"(timestamp);
- 更新边时提供的 FROM、TO 必须已经存在于图集中,否则会导致操作失。
修改操作会增加图集中的无效数据,影响数据查询的效率,建议定期对图集进行碎片整理,详见《图集》中的
compact()
命令。
不建议在算法流式返回之后进行更新操作,详见《Ultipa 图分析与图算法》-《算法的使用》-《执行方式》-流式返回
stream()
的相关说明。
语法:
- 语句别名:支持,结构为 NODE 或 EDGE
// 修改当前图集中的 N 个点数据
update().nodes(<filter>)
.set({<property1> : <value1>, <property2> : <value2> ...})
.limit(<N>)
// 修改当前图集中的 N 个边数据
update().edges(<filter>)
.set({<property1> : <value1>, <property2> : <value2> ...})
.limit(<N>)
示例:修改银行卡 C001 的余额为 300
update().nodes({_id == "C001"})
.set({balance: 300})
示例:修改所有银行卡的积分为“余额 × 级别”
update().nodes({@card})
.set({score: balance * level})
示例:将 5000 张 2 级以下但余额超过 200,000 的银行卡升一级
update().nodes({@card && level < 2 && balance > 200000})
.set({level: level + 1})
.limit(5000)
分析:内存紧张或数据量过大时,可使用 limit()
参数限制处理的数据量,分批进行处理。
示例:修改交易 TRX001 的金额为 100
update().edges({@transaction.no == "TRX001"})
.set({amount: 100})