命令、参数
修改操作可以在当前图集中单一或批量地修改点、边数据。UQL 先根据过滤条件找出待修改的点、边,再修改其属性。除了唯一标识 _id
和 _uuid
,其它属性均可以修改。
语法:
- 命令:
update()
- 参数:(见下表)
- 语句别名:支持自定义别名,结构类型为 NODE 或 EDGE
参数 | 类型 | 规范 | 描述 | 自定义别名结构类型 |
---|---|---|---|---|
nodes() 或 edges() |
filter | Ultipa 过滤器,必填 | 点或边的过滤条件 | 不支持自定义别名 |
set() |
obj | 必填 | 要修改的属性键值对组成的对象 | 不支持自定义别名 |
limit() |
int | > 0 | 要修改的点或边的数量 | 不支持自定义别名 |
修改操作会增加图集中的无效数据,影响数据查询的效率,建议定期对图集进行碎片整理,详见上一章内容《图集》篇的
compact()
命令。
不建议在算法流式返回之后进行更新操作,详见《Ultipa 图分析与图算法》-《算法的使用》-《执行方式》-流式返回
stream()
的相关说明。
修改点(node)数据
// 修改当前图集中的点数据
update().nodes(<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()
参数限制处理的数据量,分批进行处理。
修改边(edge)数据
修改边的端点 _from
、_to
、_from_uuid
、_to_uuid
时,新的端点必须已经存在于图系统中,否则会导致操作失败;修改起点 _from
时,系统会自动修改 _from_uuid
,反之亦然,修改终点时同理;同时修改 _from
和 _from_uuid
时,如果二者不符合图集中的对应关系,系统以 _from_uuid
为准,同时修改 _to
和 _to_uuid
时同理。
// 修改当前图集中的边数据
update().edges(<filter>)
.set({<property1> : <value1>, <property2> : <value2> ...})
.limit(<N>)
示例:修改交易 TRX001 的金额为 100
update().edges({@transaction.no == "TRX001"})
.set({amount: 100})