插入操作是指向当前图集中单一/批量地插入新的点、边数据,insert()
、insert().overwrite()
、upsert()
这三个命令均可以触发插入操作。本节介绍由命令 insert()
触发的插入操作。
执行 insert()
命令时:
- 如果数据中未携带 ID,或携带的 ID 在图集中不存在,则执行插入操作;
- 如果数据中携带了图集中已有的 ID,则操作失败;
- 其他导致操作失败的情况有:插入边时未携带 FROM、TO,或携带的 FROM、TO 在图集中不存在。
当 insert()
命令触发插入操作时:
- 未携带的 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 中插入点数据
insert().into(@<schema>)
.nodes([ //只插入一个点时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
// 向当前图集的某个 schema 中插入边数据,必须携带 _from 和 _to,或必须携带 _from_uuid 和 _to_uuid
insert().into(@<schema>)
.edges([ //只插入一个边时可省略中括号
{<property1>:<value1>, <property2>:<value2>, ...},
{<property1>:<value1>, <property2>:<value2>, ...},
...
])
示例:插入两个账户,用账户号作为唯一标识符;一个名称为 graph,账户号为 U001,另一个名称为 database,账户号为 U002;查看系统生成的 UUID
insert().into(@account)
.nodes([{_id: "U001", name: "graph"}, {_id: "U002", name: "database"}]) as nodes
return nodes._uuid
分析:本例为点的插入操作,由于唯一标识符是字符串,可以使用 ID 进行存放。
示例:插入一个交易,用交易号作为唯一标识符;交易号为 TRX001,起始于 C001,结束于 C002,金额 100,交易时间为 2021-01-01 09:00:00;查看系统生成的 UUID
insert().into(@transaction)
.edges({no: "TRX001",
_from: "C001",
_to: "C002",
amount: 100,
time: "2021-01-01 09:00:00"
}) as edges
return edges._uuid
分析:本例为边的插入操作,由于唯一标识符是字符串,且边不支持 ID,故用字符串型属性 no 进行存放,后期查询时可通过对 no 设置索引、LTE 来加速。