INSERT EDGE¶
The INSERT EDGE
statement inserts an edge or multiple edges into a graph space from a source vertex (given by src_vid) to a destination vertex (given by dst_vid) with a specific rank in NebulaGraph.
When inserting an edge that already exists, INSERT EDGE
overrides the edge.
Syntax¶
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
detects if the edge that you want to insert exists. If it does not exist, a new one will be inserted.Note
IF NOT EXISTS
only detects whetherexist and does not detect whether the property values overlap. IF NOT EXISTS
will read to check whether the data exists, which will have a significant impact on performance.
<edge_type>
denotes the edge type, which must be created beforeINSERT EDGE
. Only one edge type can be specified in this statement.
<prop_name_list>
is the property name list in the given<edge_type>
.
src_vid
is the VID of the source vertex. It specifies the start of an edge.
dst_vid
is the VID of the destination vertex. It specifies the end of an edge.
-
rank
is optional. It specifies the edge rank of the same edge type. The data type isint
. If not specified, the default value is0
. You can insert many edges with the same edge type, source vertex, and destination vertex by using different rank values.OpenCypher compatibility
OpenCypher has no such concept as rank.
<prop_value_list>
must provide the value list according to<prop_name_list>
. If the property values do not match the data type in the edge type, an error is returned. When theNOT NULL
constraint is set for a given property, an error is returned if no property is given. When the default value for a property isNULL
, you can omit to specify the property value. For details, see CREATE EDGE.
Examples¶
# The following example creates edge type e1 with no property and inserts an edge from vertex "10" to vertex "11" with no property.
nebula> CREATE EDGE IF NOT EXISTS e1();
nebula> INSERT EDGE e1 () VALUES "10"->"11":();
# The following example inserts an edge from vertex "10" to vertex "11" with no property. The edge rank is 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);
# The following example creates edge type e2 with two properties.
nebula> INSERT EDGE e2 (name, age) VALUES \
"12"->"13":("n1", 1), "13"->"14":("n2", 2);
# In the following example, the insertion fails because "a13" is not int.
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", "a13");
An edge can be inserted/written with property values multiple times. Only the last written values can be read.
The following examples insert edge e2 with the new values for multiple times.
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 you insert an edge that already exists with IF NOT EXISTS
, there will be no modification.
# The following example inserts edge e2 from vertex "14" to vertex "15".
nebula> INSERT EDGE e2 (name, age) VALUES "14"->"15"@1:("n1", 12);
# The following example alters the edge with IF NOT EXISTS. But there will be no alteration because edge e2 already 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.1 allows dangling edges. Therefore, you can write the edge before the source vertex or the destination vertex exists. At this time, you can get the (not written) vertex VID through
<edgetype>._src
or<edgetype>._dst
(which is not recommended). - Atomic operation is not guaranteed during the entire process for now. If it fails, please try again. Otherwise, partial writing will occur. At this time, the behavior of reading the data is undefined. For example, if multiple machines are involved in the write operation, only one of the forward and reverse edges of a single edge is written successfully, or only part of the edge is written successfully when multiple edges are inserted. In this case, an error will be returned, so please execute the command again.
- Concurrently writing the same edge will cause an
edge conflict
error, so please try again later. - The inserting speed of an edge is about half that of a vertex. Because in the storaged process, the insertion of an edge involves two tasks, while the insertion of a vertex involves only one task.