插入更新操作是指向当前图集中单一/批量地插入新的点、边数据,或根据 ID 单一/批量的更新已有的点、边的自定义属性,由 upsert()
命令触发。
执行 upsert()
命令时:
- 如果数据中未携带 ID,或携带的 ID 在图集中不存在,则执行插入操作;
- 如果数据中携带了图集中已有的 ID 且不违背 ID 的对应关系(指 _id 与 _uuid 的对应关系以及 ID 与 schema 的对应关系),则执行更新操作;
- 导致操作失败的情况有:携带的 ID 违背图集中的对应关系,插入边时未携带 FROM、TO,或携带的 FROM、TO 在图集中不存在。
当 upsert()
命令触发插入操作时,细节同 insert()
命令。
当 upsert()
命令触发更新操作时:
- 根据携带的 ID 确定被更新的数据;
- 携带的自定义属性且数据类型正确的,将直接更新;
- 携带的自定义属性数据类型与属性类型不一致的,将根据属性类型赋值为空字符串(string,text,datetime)、0(int32,int64,uint32,uint64,float,double)、"1970-01-01 08:00:00 +08:00"(timestamp);
- 未携带的自定义属性保持不变。
不建议在算法流式返回之后进行插入更新操作,详见《Ultipa 图分析与图算法》-《算法的使用》-《执行方式》-流式返回
stream()
的相关说明。
语法:
- 语句别名:支持,结构为 NODE 或 EDGE
// 向当前图集的某个 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"}
])