跳转至

INSERT EDGE

INSERT EDGE语句可以在 NebulaGraph 实例的指定图空间中插入一条或多条边。边是有方向的,从起始点(src_vid)到目的点(dst_vid)。

INSERT EDGE的执行方式为覆盖式插入。如果已有 Edge type、起点、终点、rank 都相同的边,则覆盖原边。

语法

INSERT EDGE [IF NOT EXISTS] <edge_type> ( <prop_name_list> ) VALUES 
<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 必须提前创建,详情请参见 CREATE EDGE
  • <prop_name_list>:需要设置的属性名称列表。
  • src_vid:起始点 ID,表示边的起点。
  • dst_vid:目的点 ID,表示边的终点。
  • rank:可选项。边的 rank 值。数据类型为int。默认值为0

    openCypher 兼容性

    openCypher 中没有 rank 的概念。

  • <prop_value_list>:根据prop_name_list填写属性值。如果属性值和 Edge type 中的数据类型不匹配,会返回错误。如果没有填写属性值,而 Edge type 中对应的属性设置为NOT NULL,也会返回错误。详情请参见 CREATE EDGE

示例

# 插入不包含属性的边。
nebula> CREATE EDGE IF NOT EXISTS e1();                 
nebula> INSERT EDGE e1 () VALUES "10"->"11":();  

# 插入 rank 为 1 的边。
nebula> INSERT EDGE e1 () VALUES "10"->"11"@1:(); 
nebula> CREATE EDGE IF NOT EXISTS 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");

一条边可以多次插入属性值,以最后一次为准。

# 多次插入属性值。
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 12);
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 13);
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 14);
nebula> FETCH PROP ON e2 "11"->"13" YIELD edge AS e;
+-------------------------------------------+
| e                                         |
+-------------------------------------------+
| [: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 YIELD edge AS e;
+-------------------------------------------+
| e                                         |
+-------------------------------------------+
| [:e2 "14"->"15" @1 {age: 12, name: "n1"}] |
+-------------------------------------------+

Note

  • NebulaGraph 3.4.3 允许存在悬挂边(Dangling edge)。因此可以在起点或者终点存在前,先写边;此时就可以通过 <edgetype>._src<edgetype>._dst获取到(尚未写入的)点 VID(不建议这样使用)。
  • 目前还不能保证操作的原子性,如果失败请重试,否则会发生部分写入。此时读取该数据的行为是未定义的。例如写入操作涉及到多个机器时,可能会出现插入单个边的正反向边只写入成功一个,或者插入多个边时只写入成功一部分,此时会返回报错,请重新执行命令。
  • 并发写入同一条边会报edge conflict错误,可稍后重试。
  • 边的 INSERT 速度大约是点的 INSERT 速度一半。原因是 INSERT 边会对应 storaged 的两个 INSERT,INSERT 点对应 storaged 的一个 INSERT。

最后更新: September 4, 2023