INSERT EDGEGraph
INSERT EDGE
语句可以在NebulaGraph实例的指定图空间中插入一条或多条边。边是有方向的,从起始点(src_vid)到目的点(dst_vid)。
INSERT EDGE
的执行方式为覆盖式插入。四元组<起点、终点、Edge type、rank>唯一确定一条边,如果四元组都相同,则覆盖。
语法Graph
INSERT EDGE [IF NOT EXISTS] <edge_type> ( <prop_name_list> ) {VALUES | VALUE}
<src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> )
[, <src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> ), ...];
<prop_name_list> ::=
[ <prop_name> [, <prop_name> ] ...]
<prop_value_list> ::=
[ <prop_value> [, <prop_value> ] ...]
-
IF NOT EXISTS
:用户可以使用IF NOT EXISTS
关键字检测待插入的边是否存在,只有不存在时,才会插入。Note
-
IF NOT EXISTS
仅检测<边的类型、起始点、目的点和rank>是否存在,不会检测属性值是否重合。-
IF NOT EXISTS
会先读取一次数据是否存在,因此对性能会有明显影响。
<edge_type>
:边关联的Edge type,只能指定一个Edge type。Edge type必须提前创建,详情请参见Graph。
<prop_name_list>
:需要设置的属性名称列表。
src_vid
:起始点ID,表示边的起点。
dst_vid
:目的点ID,表示边的终点。
-
rank
:可选项。边的rank值。默认值为0
。rank值可以用来区分Edge type、起始点、目的点都相同的边。openCypher兼容性
openCypher中没有rank的概念。
<prop_value_list>
:根据prop_name_list
填写属性值。如果属性值和Edge type中的数据类型不匹配,会返回错误。如果没有填写属性值,而Edge type中对应的属性设置为NOT NULL
,也会返回错误。详情请参见Graph。
示例Graph
# 插入不包含属性的边。
nebula> CREATE EDGE e1();
nebula> INSERT EDGE e1 () VALUES "10"->"11":();
# 插入rank为1的边。
nebula> INSERT EDGE e1 () VALUES "10"->"11"@1:();
nebula> CREATE EDGE e2 (name string, age int);
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 1);
# 一次插入2条边。
nebula> INSERT EDGE e2 (name, age) VALUES \
"12"->"13":("n1", 1), "13"->"14":("n2", 2);
# 创建失败,因为"a13"不是int类型。
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", "a13");
同一条边(四元组<起始点、目的点、Edge_Type、Rank>相同)可以多次插入属性值,以最后一次为准。
# 多次插入属性值。
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13@0":("n1", 12);
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13@0":("n1", 13);
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13@0":("n1", 14);
nebula> FETCH PROP ON e2 "11"->"13";
+-------------------------------------------+
| edges_ |
+-------------------------------------------+
| [:e2 "11"->"13" @0 {age: 14, name: "n1"}] |
+-------------------------------------------+
使用IF NOT EXISTS
插入已存在的边时,不会进行修改。
# 插入边。
nebula> INSERT EDGE e2 (name, age) VALUES "14"->"15"@1:("n1", 12);
# 使用IF NOT EXISTS修改边,因为边已存在,不会进行修改。
nebula> INSERT EDGE IF NOT EXISTS e2 (name, age) VALUES "14"->"15"@1:("n2", 13);
nebula> FETCH PROP ON e2 "14"->"15"@1;
+-------------------------------------------+
| edges_ |
+-------------------------------------------+
| [:e2 "14"->"15" @1 {age: 12, name: "n1"}] |
+-------------------------------------------+
Note
- NebulaGraph 2.5.1 允许存在悬挂边(Dangling edge)。因此可以在起点或者终点存在前,先写边;此时就可以通过
<edgetype>._src
或<edgetype>._dst
获取到(尚未写入的)点VID(不建议这样使用)。 - 目前还不能保证操作的原子性,如果失败请重试,否则会发生部分写入。此时读取该数据的行为是未定义的。
- 并发写入同一条边会报
edge conflict
错误,可稍后重试。 边的INSERT速度
大约是点的INSERT速度一半。原因是INSERT边会对应storaged的两个INSERT,INSERT点
对应storaged的一个INSERT。
最后更新: September 18, 2021