跳转至

INSERT VERTEX

INSERT VERTEX语句可以在 Nebula Graph 实例的指定图空间中插入一个或多个点。

前提条件

执行INSERT VERTEX语句需要当前登录的用户拥有指定图空间的插入点权限,否则会报错。

语法

```ngql INSERT VERTEX [IF NOT EXISTS] [tag_props, [tag_props] ...] VALUES VID: ([prop_value_list])

tag_props: tag_name ([prop_name_list])

prop_name_list: [prop_name [, prop_name] ...]

prop_value_list: [prop_value [, prop_value] ...]
```

  • IF NOT EXISTS:检测待插入的 VID 是否存在,只有不存在时,才会插入,如果已经存在,不会进行修改。

    Note

    • IF NOT EXISTS 仅检测 VID + Tag 的值是否相同,不会检测属性值。
    • IF NOT EXISTS 会先读取一次数据是否存在,因此对性能会有明显影响。
  • tag_name:点关联的 Tag(点类型)。Tag 的创建,详情请参见 CREATE TAG

    Caution

    Nebula Graph 3.0.2 中支持插入无 Tag 的点。

  • property_name:需要设置的属性名称。
  • vid:点 ID。在 Nebula Graph 3.0.2 中支持字符串和整数,需要在创建图空间时设置,详情请参见 CREATE SPACE
  • property_value:根据prop_name_list填写属性值。如果没有填写属性值,而 Tag 中对应的属性设置为NOT NULL,会返回错误。详情请参见 CREATE TAG

Caution

INSERT VERTEX与 openCypher 中CREATE的语意不同:

  • INSERT VERTEX语意更接近于 NoSQL(key-value) 方式的 INSERT 语意,或者 SQL 中的UPSERT (UPDATE or INSERT)。
  • 相同VIDTAG的情况下,如果没有使用IF NOT EXISTS,新写入的数据会覆盖旧数据,不存在时会新写入。
  • 相同VID但不同TAG的情况下,不同 TAG 对应的记录不会相互覆盖,不存在会新写入。

参考以下示例。

示例

```ngql

插入不包含 Tag 的点。

nebula> INSERT VERTEX VALUES "1":();

插入不包含属性的点。

nebula> CREATE TAG IF NOT EXISTS t1();
nebula> INSERT VERTEX t1() VALUES "10":(); ```

```ngql nebula> CREATE TAG IF NOT EXISTS t2 (name string, age int);
nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n1", 12);

创建失败,因为"a13"不是 int 类型。

nebula> INSERT VERTEX t2 (name, age) VALUES "12":("n1", "a13");

一次插入 2 个点。

nebula> INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8); ```

```ngql nebula> CREATE TAG IF NOT EXISTS t3(p1 int); nebula> CREATE TAG IF NOT EXISTS t4(p2 string);

一次插入两个 Tag 的属性到同一个点。

nebula> INSERT VERTEX t3 (p1), t4(p2) VALUES "21": (321, "hello"); ```

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

```ngql

多次插入属性值。

nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n2", 13); nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n3", 14); nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n4", 15); nebula> FETCH PROP ON t2 "11" YIELD properties(vertex); +-----------------------+ | properties(VERTEX) | +-----------------------+ | {age: 15, name: "n4"} | +-----------------------+ ```

```ngql nebula> CREATE TAG IF NOT EXISTS t5(p1 fixed_string(5) NOT NULL, p2 int, p3 int DEFAULT NULL); nebula> INSERT VERTEX t5(p1, p2, p3) VALUES "001":("Abe", 2, 3);

插入失败,因为属性 p1 不能为 NULL。

nebula> INSERT VERTEX t5(p1, p2, p3) VALUES "002":(NULL, 4, 5); [ERROR (-1005)]: Storage Error: The not null field cannot be null.

属性 p3 为默认值 NULL。

nebula> INSERT VERTEX t5(p1, p2) VALUES "003":("cd", 5); nebula> FETCH PROP ON t5 "003" YIELD properties(vertex); +---------------------------------+ | properties(VERTEX) | +---------------------------------+ | {p1: "cd", p2: 5, p3: NULL} | +---------------------------------+

属性 p1 最大长度为 5,因此会被截断。

nebula> INSERT VERTEX t5(p1, p2) VALUES "004":("shalalalala", 4); nebula> FETCH PROP on t5 "004" YIELD properties(vertex); +------------------------------------+ | properties(VERTEX) | +------------------------------------+ | {p1: "shala", p2: 4, p3: NULL} | +------------------------------------+ ```

使用IF NOT EXISTS插入已存在的点时,不会进行修改。

```ngql

插入点 1。

nebula> INSERT VERTEX t2 (name, age) VALUES "1":("n2", 13);

使用 IF NOT EXISTS 修改点 1,因为点 1 已存在,不会进行修改。

nebula> INSERT VERTEX IF NOT EXISTS t2 (name, age) VALUES "1":("n3", 14); nebula> FETCH PROP ON t2 "1" YIELD properties(vertex); +-----------------------+ | properties(VERTEX) | +-----------------------+ | {age: 13, name: "n2"} | +-----------------------+ ```


最后更新: 2026年8月17日