UPSERT EDGE¶
UPSERT is a combination of UPDATE and INSERT. Use UPSERT EDGE to update properties of an edge if it exists or insert a new edge if it does not exist.
The performance of UPSERT is much lower than that of INSERT, because UPSERT is a read-modify-write serialization operation at the partition level.
Danger
Don't use UPSERT for scenarios with highly concurrent writes. Use UPDATE or INSERT instead.
Syntax¶
UPSERT EDGE ON <edge_type>
<src_vid> -> <dst_vid> [@rank]
SET <update_prop>
[WHEN <condition>]
[YIELD <properties>]
| Field | Required | Description | Example |
|---|---|---|---|
ON <edge_type> |
Yes | Specifies the type of the edge. The properties to be updated must be on this edge type. | ON serve |
<src_vid> |
Yes | Specifies the source vertex ID of the edge. | "player100" |
<dst_vid> |
Yes | Specifies the destination vertex ID of the edge. | "team204" |
<rank> |
No | Specifies the rank of the edge. | 10 |
SET <update_prop> |
Yes | Specifies the properties to be updated and how they will be updated. | SET start_year = start_year +1 |
WHEN <condition> |
No | Specifies the filter conditions. | WHEN end_year < 2010 |
YIELD <output> |
No | Specifies the output format of the statement. | YIELD start_year AS Start_Year |
Insert an edge if it does not exist¶
If an edge does not exist, it is created no matter the conditions in the WHEN clause are met or not, and the SET clause takes effect. The property values of the new edge depends on:
- How the
SETclause is defined - The default value of the properties
For example, if:
- The edge to be inserted will have properties
start_yearandend_yearbased on the edge typeserve. - The
SETclause specifies thatend_year = 2021.
Then the property values in different cases are listed as follows:
Are WHEN conditions met |
If properties has default values | Value of start_year |
Value of end_year |
|---|---|---|---|
| Yes | Yes | The default value | 2021 |
| Yes | No | NULL |
2021 |
| No | Yes | The default value | 2021 |
| No | No | NULL |
2021 |
Here are some examples:
// Check if the following three vertices has any outgoing serve edge.
nebula> GO FROM "player666", "player667", "player668" \
OVER serve \
YIELD serve.start_year, serve.end_year;
Empty set
// The result Empty set indicates that the edges don't exist.
nebula> UPSERT EDGE on serve \
"player666" -> "team200"@0 \
SET end_year = 2021 \
WHEN end_year == 2010 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| __NULL__ | 2021 |
+------------+----------+
nebula> UPSERT EDGE on serve \
"player666" -> "team200"@0 \
SET end_year = 2022 \
WHEN end_year == 2010 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| __NULL__ | 2021 |
+------------+----------+
nebula> UPSERT EDGE on serve \
"player667" -> "team200"@0 \
SET end_year = 2022 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| __NULL__ | 2022 |
+------------+----------+
nebula> UPSERT EDGE on serve \
"player668" -> "team200"@0 \
SET start_year = 2000, end_year = end_year + 1 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| 2000 | __NULL__ |
+------------+----------+
In the last query of the preceding example, since end_year has no default value, when the edge is created, end_year is NULL, and end_year = end_year + 1 does not take effect. But if it has a default value, end_year = end_year + 1 in the SET clause will take effect. For example:
nebula> CREATE EDGE serve_with_default(start_year int, end_year DEFAULT 2010);
Execution succeeded
nebula> UPSERT EDGE on serve_with_default \
"player668" -> "team200" \
SET end_year = end_year + 1 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| __NULL__ | 2011 |
+------------+----------+
Update an edge if it exists¶
If the edge exists and the WHEN conditions are met, the edge is updated.
nebula> MATCH (v:player{name:"Ben Simmons"})-[e:serve]-(v2) \
RETURN e;
+-----------------------------------------------------------------------+
| e |
+-----------------------------------------------------------------------+
| [:serve "player149"->"team219" @0 {end_year: 2019, start_year: 2016}] |
+-----------------------------------------------------------------------+
nebula> UPSERT EDGE on serve \
"player149" -> "team219" \
SET end_year = end_year + 1 \
WHEN start_year == 2016 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| 2016 | 2020 |
+------------+----------+
If the edge exists and the WHEN conditions are not met, the edge does not take effect.
nebula> MATCH (v:player{name:"Ben Simmons"})-[e:serve]-(v2) \
RETURN e;
+-----------------------------------------------------------------------+
| e |
+-----------------------------------------------------------------------+
| [:serve "player149"->"team219" @0 {end_year: 2020, start_year: 2016}] |
+-----------------------------------------------------------------------+
nebula> UPSERT EDGE on serve \
"player149" -> "team219" \
SET end_year = end_year + 1 \
WHEN start_year != 2016 \
YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| 2016 | 2020 |
+------------+----------+