介绍
更新是指对除唯一标识符 ID 和 UUID 之外的属性进行更新,且仅对数据中携带的属性进行更新,未携带的属性不做任何操作。
插入更新操作可以向当前图集中单一或批量地插入或更新点、边数据。
- 更新点:需要指定图集中已存在的 UUID 或 ID,或同时指定符合在图集中的对应关系的 UUID 和 ID;如果同时指定了 UUID 和 ID 但不符合在图集中的对应关系,更新会失败;当指定的 UUID 和/或 ID 在图集中不存在,或者未指定 UUID 和 ID 时,执行插入操作。
- 更新边:需要指定 UUID;如果指定的 UUID 在图集中不存在,或者未指定 UUID,执行插入操作;如果数据中未携带起点/终点,或起点/终点在图集中不存在,操作会失败。
语法:
- 命令:
upsert().into(@<schema>)
- 参数:
nodes()
或edges()
,不支持自定义别名 - 语句别名:支持自定义别名,结构类型为 NODE 或 EDGE
不建议在算法流式返回之后进行插入更新操作,详见《Ultipa 图分析与图算法》-《算法的使用》-《执行方式》-流式返回
stream()
的相关说明。
// 向当前图集的某个 schema 中插入或更新点数据
upsert().into(@<schema>)
.nodes([ //只插入更新一个点时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
// 向当前图集的某个 schema 中插入或更新边数据,必须携带 _from 和 _to,或必须携带 _from_uuid 和 _to_uuid
upsert().into(@<schema>)
.edges([ //只插入更新一个边时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
示例:有账户 U001 名称为 test,如果该账户已存在则更新原始数据,不存在则插入新数据;返回操作后该账户的信息
upsert().into(@account)
.nodes({_id: "U001", name: "test"}) as nodes
return nodes{*}
示例:用起始于 C001,结束于 C003 的交易 TRX001 更新 UUID 为 1 的交易,若原交易不存在则插入新交易;用同一条语句插入起始于 C003,结束于 C001 的交易 TRX003
upsert().into(@transaction)
.edges([
{no: "TRX001", _from: "C001", _to: "C003", _uuid: 1},
{no: "TRX003", _from: "C003", _to: "C001"}
])