INSERT VERTEXGraph
INSERT VERTEX
语句可以在 NebulaGraph 实例的指定图空间中插入一个或多个点。
前提条件Graph
执行INSERT VERTEX
语句需要当前登录的用户拥有指定图空间的Graph,否则会报错。
语法Graph
INSERT VERTEX [IF NOT EXISTS] <tag_name> (<prop_name_list>) [, <tag_name> (<prop_name_list>), ...]
{VALUES | VALUE} VID: (<prop_value_list>[, <prop_value_list>])
prop_name_list:
[prop_name [, prop_name] ...]
prop_value_list:
[prop_value [, prop_value] ...]
-
IF NOT EXISTS
:用户可以使用IF NOT EXISTS
关键字检测待插入的 VID 是否存在,只有不存在时,才会插入,如果已经存在,不会进行修改。Note
IF NOT EXISTS
仅检测 VID + Tag 的值是否相同,不会检测属性值。IF NOT EXISTS
会先读取一次数据是否存在,因此对性能会有明显影响。
tag_name
:点关联的 Tag(点类型)。Tag 必须提前创建,详情请参见 Graph。
prop_name_list
:需要设置的属性名称列表。
VID
:点 ID。在 NebulaGraph 2.0 中支持字符串和整数,需要在创建图空间时设置,详情请参见 Graph。
prop_value_list
:根据prop_name_list
填写属性值。如果属性值和 Tag 中的数据类型不匹配,会返回错误。如果没有填写属性值,而 Tag 中对应的属性设置为NOT NULL
,也会返回错误。详情请参见 Graph。
Caution
INSERT VERTEX
与 openCypher 中CREATE
的语意不同:
INSERT VERTEX
语意更接近于 NoSQL(key-value) 方式的 INSERT 语意,或者 SQL 中的UPSERT
(UPDATE
orINSERT
)。- 相同
VID
和TAG
的情况下,如果没有使用IF NOT EXISTS
,新写入的数据会覆盖旧数据,不存在时会新写入。 - 相同
VID
但不同TAG
的情况下,不同 TAG 对应的记录不会相互覆盖,不存在会新写入。
参考以下示例。
示例Graph
# 插入不包含属性的点。
nebula> CREATE TAG IF NOT EXISTS t1();
nebula> INSERT VERTEX t1() VALUE "10":();
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);
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");
一个点可以多次插入属性值,以最后一次为准。
# 多次插入属性值。
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";
+---------------------------------+
| vertices_ |
+---------------------------------+
| ("11" :t2{age: 15, name: "n4"}) |
+---------------------------------+
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";
+--------------------------------------------+
| vertices_ |
+--------------------------------------------+
| ("003" :t5{p1: "cd", p2: 5, p3: __NULL__}) |
+--------------------------------------------+
# 属性 p1 最大长度为 5,因此会被截断。
nebula> INSERT VERTEX t5(p1, p2) VALUES "004":("shalalalala", 4);
nebula> FETCH PROP on t5 "004";
+-----------------------------------------------+
| vertices_ |
+-----------------------------------------------+
| ("004" :t5{p1: "shala", p2: 4, p3: __NULL__}) |
+-----------------------------------------------+
使用IF NOT EXISTS
插入已存在的点时,不会进行修改。
# 插入点 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";
+--------------------------------+
| vertices_ |
+--------------------------------+
| ("1" :t2{age: 13, name: "n2"}) |
+--------------------------------+
最后更新: November 24, 2021