INSERT VERTEX

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

前提条件

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

语法

  1. INSERT VERTEX [IF NOT EXISTS] <tag_name> (<prop_name_list>) [, <tag_name> (<prop_name_list>), ...]
  2. {VALUES | VALUE} VID: (<prop_value_list>[, <prop_value_list>])
  3. prop_name_list:
  4. [prop_name [, prop_name] ...]
  5. prop_value_list:
  6. [prop_value [, prop_value] ...]
  • IF NOT EXISTS:用户可以使用IF NOT EXISTS关键字检测待插入的VID是否存在,只有不存在时,才会插入,如果已经存在,不会进行修改。

    Note

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

  • prop_name_list:需要设置的属性名称列表。

  • VID:点ID。在Nebula Graph 2.0中支持字符串和整数,需要在创建图空间时设置,详情请参见CREATE SPACE

  • prop_value_list:根据prop_name_list填写属性值。如果属性值和Tag中的数据类型不匹配,会返回错误。如果没有填写属性值,而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对应的记录不会相互覆盖,不存在会新写入。

参考以下示例。

示例

  1. # 插入不包含属性的点。
  2. nebula> CREATE TAG t1();
  3. nebula> INSERT VERTEX t1() VALUE "10":();
  1. nebula> CREATE TAG t2 (name string, age int);
  2. nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n1", 12);
  3. # 创建失败,因为"a13"不是int类型。
  4. nebula> INSERT VERTEX t2 (name, age) VALUES "12":("n1", "a13");
  5. # 一次插入2个点。
  6. nebula> INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8);
  1. nebula> CREATE TAG t3(p1 int);
  2. nebula> CREATE TAG t4(p2 string);
  3. # 一次插入两个Tag的属性到同一个点。
  4. nebula> INSERT VERTEX t3 (p1), t4(p2) VALUES "21": (321, "hello");

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

  1. # 多次插入属性值。
  2. nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n2", 13);
  3. nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n3", 14);
  4. nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n4", 15);
  5. nebula> FETCH PROP ON t2 "11";
  6. +---------------------------------+
  7. | vertices_ |
  8. +---------------------------------+
  9. | ("11" :t2{age: 15, name: "n4"}) |
  10. +---------------------------------+
  1. nebula> CREATE TAG t5(p1 fixed_string(5) NOT NULL, p2 int, p3 int DEFAULT NULL);
  2. nebula> INSERT VERTEX t5(p1, p2, p3) VALUES "001":("Abe", 2, 3);
  3. # 插入失败,因为属性p1不能为NULL。
  4. nebula> INSERT VERTEX t5(p1, p2, p3) VALUES "002":(NULL, 4, 5);
  5. [ERROR (-1005)]: Storage Error: The not null field cannot be null.
  6. # 属性p3为默认值NULL。
  7. nebula> INSERT VERTEX t5(p1, p2) VALUES "003":("cd", 5);
  8. nebula> FETCH PROP ON t5 "003";
  9. +--------------------------------------------+
  10. | vertices_ |
  11. +--------------------------------------------+
  12. | ("003" :t5{p1: "cd", p2: 5, p3: __NULL__}) |
  13. +--------------------------------------------+
  14. # 属性p1最大长度为5,因此会被截断。
  15. nebula> INSERT VERTEX t5(p1, p2) VALUES "004":("shalalalala", 4);
  16. nebula> FETCH PROP on t5 "004";
  17. +-----------------------------------------------+
  18. | vertices_ |
  19. +-----------------------------------------------+
  20. | ("004" :t5{p1: "shala", p2: 4, p3: __NULL__}) |
  21. +-----------------------------------------------+

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

  1. # 插入点1。
  2. nebula> INSERT VERTEX t2 (name, age) VALUES "1":("n2", 13);
  3. # 使用IF NOT EXISTS修改点1,因为点1已存在,不会进行修改。
  4. nebula> INSERT VERTEX IF NOT EXISTS t2 (name, age) VALUES "1":("n3", 14);
  5. nebula> FETCH PROP ON t2 "1";
  6. +--------------------------------+
  7. | vertices_ |
  8. +--------------------------------+
  9. | ("1" :t2{age: 13, name: "n2"}) |
  10. +--------------------------------+

最后更新: November 1, 2021