插入覆盖操作是指向当前图集中单一/批量地插入新的点、边数据,或根据 ID 单一/批量的覆盖已有的点、边的自定义属性,由 insert().overwrite()
命令触发。
执行 insert().overwrite()
命令时:
- 如果数据中未携带 ID,或携带的 ID 在图集中不存在,则执行插入操作;
- 如果数据中携带了图集中已有的 ID 且不违背 ID 的对应关系(指 _id 与 _uuid 的对应关系以及 ID 与 schema 的对应关系),则执行覆盖操作;
- 导致操作失败的情况有:携带的 ID 违背图集中的对应关系,插入边时未携带 FROM、TO,或携带的 FROM、TO 在图集中不存在。
当 insert().overwrite()
命令触发插入操作时,细节同 insert()
命令。
当 insert().overwrite()
命令触发覆盖操作时:
- 根据携带的 ID 确定被覆盖的数据;
- 自定义属性的处理与插入操作相同。
不建议在算法流式返回之后进行插入覆盖操作,详见《Ultipa 图分析与图算法》-《算法的使用》-《执行方式》-流式返回
stream()
的相关说明。
语法:
- 语句别名:支持,结构为 NODE 或 EDGE
// 向当前图集的某个 schema 中插入或覆盖点数据
insert().overwrite().into(@<schema>)
.nodes([ //只插入覆盖一个点时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
// 向当前图集的某个 schema 中插入或覆盖边数据,必须携带 _from 和 _to,或必须携带 _from_uuid 和 _to_uuid
insert().overwrite().into(@<schema>)
.edges([ //只插入覆盖一个边时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
示例:有账户 U001 名称为 test,如果该账户已存在则覆盖原始数据,不存在则插入新数据;返回操作后该账户的信息
insert().overwrite().into(@account)
.nodes({_id: "U001", name: "test"}) as nodes
return nodes{*}
示例:用起始于 C001,结束于 C003 的交易 TRX001 覆盖 UUID 为 1 的交易,若原交易不存在则插入新交易;用同一条语句插入起始于 C003,结束于 C001 的交易 TRX003
insert().overwrite().into(@transaction)
.edges([
{no: "TRX001", _from: "C001", _to: "C003", _uuid: 1},
{no: "TRX003", _from: "C003", _to: "C001"}
])