From 32e5635188231fbe1ae8ec523e80e10dbebcc42d Mon Sep 17 00:00:00 2001 From: lidiazuin Date: Mon, 24 Nov 2025 16:33:56 +0100 Subject: [PATCH 01/12] Turning the page into a tutorial --- .../images/cypher_graph_mergeFriend-arr.svg | 3 - .../cypher_graph_mergeFriendRel-arr.svg | 3 - .../images/cypher_graph_mergeFriendRel.jpg | Bin 37481 -> 0 bytes modules/ROOT/images/jennifer-friends-mark.svg | 8 + modules/ROOT/pages/cypher/updating.adoc | 367 ++++++++---------- 5 files changed, 165 insertions(+), 216 deletions(-) delete mode 100644 modules/ROOT/images/cypher_graph_mergeFriend-arr.svg delete mode 100644 modules/ROOT/images/cypher_graph_mergeFriendRel-arr.svg delete mode 100644 modules/ROOT/images/cypher_graph_mergeFriendRel.jpg create mode 100644 modules/ROOT/images/jennifer-friends-mark.svg diff --git a/modules/ROOT/images/cypher_graph_mergeFriend-arr.svg b/modules/ROOT/images/cypher_graph_mergeFriend-arr.svg deleted file mode 100644 index c3451220..00000000 --- a/modules/ROOT/images/cypher_graph_mergeFriend-arr.svg +++ /dev/null @@ -1,3 +0,0 @@ -Personname:Mark \ No newline at end of file diff --git a/modules/ROOT/images/cypher_graph_mergeFriendRel-arr.svg b/modules/ROOT/images/cypher_graph_mergeFriendRel-arr.svg deleted file mode 100644 index cf952fc4..00000000 --- a/modules/ROOT/images/cypher_graph_mergeFriendRel-arr.svg +++ /dev/null @@ -1,3 +0,0 @@ -:IS_FRIENDS_WITHPersonname:JenniferPersonname:Mark \ No newline at end of file diff --git a/modules/ROOT/images/cypher_graph_mergeFriendRel.jpg b/modules/ROOT/images/cypher_graph_mergeFriendRel.jpg deleted file mode 100644 index 478ce65792966f97bbc348dd1fc19b8d739f39f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37481 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

bGGcE)#Ovr`9d`>15$6?=Ee*j0ojBT%j)V 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 diff --git a/modules/ROOT/images/jennifer-friends-mark.svg b/modules/ROOT/images/jennifer-friends-mark.svg new file mode 100644 index 00000000..381eff24 --- /dev/null +++ b/modules/ROOT/images/jennifer-friends-mark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 5e8f63d2..44b3e1b4 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -1,6 +1,6 @@ -= Updating the data += Updating the graph :tags: cypher, queries, graph-queries, insert-create, update, delete, merge -:description: Building on the Cypher Basics I guide, this guide covers more introductory concepts of Cypher, Neo4j's graph query language. Upon finishing this guide, you should be able to read and write Cypher queries for standard CRUD operations. +:description: This guide explains how to update data that already exists in a graph, using Cypher. :page-newsletter: true :page-ad-overline-link: https://graphacademy.neo4j.com/?ref=guides :page-ad-overline: Neo4j GraphAcademy @@ -10,27 +10,16 @@ :page-ad-underline-role: button :page-ad-underline: Learn more -Earlier you learned how to represent nodes, relationships, labels, properties, and patterns in Cypher. -This section adds another level to your knowledge by introducing how to update and delete data with Cypher. +This tutorial shows how to update information in the graph by changing, removing, and adding nodes, relationships, and properties. +It also addresses how to avoid duplication and how to keep track of changes by adding new properties to the graph. -While these are the standard CRUD (create, update, and delete) operations, some things function a bit differently in a graph than in other types of databases. -You will probably recognize some of the similarities and differences as we go along. +== Create the dataset -[[cypher-update]] -== Updating data with Cypher - -You may already have a node or relationship in the data, but you want to modify its properties. -You can do this by matching the pattern you want to find and using the `SET` keyword to add, remove, or update properties. - -We continue to use the following dataset: - -.Graph: people, companies they work at, and technologies they like -image::people-technologies-graph-arr.svg[role="popup-link"] - -To create the aforementioned graph, run the Cypher query: +After you link:https://neo4j.com/product/auradb/?ref=docs-nav-get-started[create a free Aura instance], use the "Connect" button and select "Query". +In the Cypher editor, copy and paste the following Cypher and execute the query: [source, cypher] ----- +-- CREATE (diana:Person {name: "Diana"}) CREATE (melissa:Person {name: "Melissa", twitter: "@melissa"}) CREATE (dan:Person {name: "Dan", twitter: "@dan", yearsExperience: 6}) @@ -65,213 +54,156 @@ CREATE (ann)<-[:IS_FRIENDS_WITH]-(jennifer)-[:IS_FRIENDS_WITH]->(mark) CREATE (john)-[:LIKES]->(dev)<-[:LIKES]-(ann)-[:IS_FRIENDS_WITH]->(dan)-[:WORKS_FOR]->(abc) CREATE (ann)-[:WORKS_FOR]->(abc) CREATE (a)<-[:WORKS_FOR]-(melissa)-[:LIKES]->(graphs)<-[:LIKES]-(diana) ----- +-- +You should now have a graph with 20 nodes, 31 relationships, 28 properties, and 20 labels. -Using the above example dataset thus far, you could update Jennifer's node to add her birthdate. -The next Cypher statement shows how to do this. +== Update a node -. First, you need to find the existing node for Jennifer. -. Next, use `SET` to create the new property (with syntax `variable.property`) and set its value. -. Finally, you can return Jennifer's node to ensure that the information was updated correctly. +This is the query you need to update Jennifer's node with information about her birthday: [source, cypher] ----- +-- MATCH (p:Person {name: 'Jennifer'}) SET p.birthdate = date('1980-01-01') RETURN p ----- +-- -*Query result:* +What this query does is: -[queryresult] +. Find Jennifer's already existing node with the `MATCH` clause. +. Use `SET` to create the new property `birthday` (with syntax `variable.property`) and set its value. +. Use `RETURN` to retrieve Jennifer's node and ensure that the information was updated correctly. ----- -Set Properties: 1 -Rows: 1 - -+------------------------------------------------------+ -| p | -+------------------------------------------------------+ -|(Person: {birthdate: '1980-01-01', name: 'Jennifer'}) | -+------------------------------------------------------+ ----- +This is the result: +[role="queryresult",options="header,footer",cols="1* Temporal functions^]. -==== +| (:Person {twitter: "@jennifer", birthdate: 1980-01-01, name: "Jennifer", yearsExperience: 5}) + +1+d|Rows: 1 +|=== -If you want to change Jennifer's birthdate, you can use the same query above to find Jennifer's node again and put a different date in the `SET` clause. +== Update a property -You are able also update Jennifer's `WORKS_FOR` relationship with the `Company` node to include the year that she started working there. -To do this, you can use similar syntax as above for updating nodes. +To change Jennifer's birthdate, you can use the same query from the previous section to find Jennifer's node again, and then put a different date in the `SET` clause: [source, cypher] ----- -MATCH (:Person {name: 'Jennifer'})-[rel:WORKS_FOR]-(:Company {name: 'Neo4j'}) -SET rel.startYear = date({year: 2018}) -RETURN rel ----- +-- +MATCH (p:Person {name: 'Jennifer'}) +SET p.birthdate = date('1980-01-02') +RETURN p +-- +This is the result: -*Query result:* +[role="queryresult",options="header,footer",cols="1*(m:Person {name: 'Mark'}) -DELETE r +MATCH (:Person {name: 'Jennifer'})-[rel:WORKS_FOR]-(:Company {name: 'Neo4j'}) +SET rel.startYear = date({year: 2018}) +RETURN rel ---- -*Query result:* +This is the result: -[queryresult] ----- -+-----------------------------------------+ -| Deleted Relationships: 1 | -| Rows: 0 | -+-----------------------------------------+ ----- +[role="queryresult",options="header,footer",cols="1*(m) +-- +MERGE (j:Person {name: 'Jennifer'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) RETURN j, r, m ----- - -Notice that here `MATCH` is used to find both Mark's node and Jennifer's node before we use `MERGE` to find or create the relationship between them. - -Why do we not use a single statement? - -`MERGE` looks for an entire pattern that you specify to see whether to return an existing one or create it new. -If the entire pattern (nodes, relationships, and any specified properties) does not exist, Cypher creates it. +-- -Cypher never produces a partial mix of matching and creating within a pattern. -To avoid a mix of match and create, you need to match any existing elements of your pattern first before doing a merge on any elements you might want to create, just as we did in the statement above. +Cypher won't find this specific pattern, so it will create it from scratch, which means both nodes and the relationship between them will be created. +Since the relationship didn't exist previously, it is Jennifer and Mark's nodes that will be duplicated. -image::cypher_graph_mergeFriendRel-arr.svg[role="popup-link", width=600] - -[NOTE] +[TIP] +==== +If you ran this statement and created the duplication, you can go back to the previous steps where you saw xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[how to delete a node and its relationships]. ==== -Just for reference, the Cypher statement that causes duplicates is below. -Since this pattern (`Jennifer IS_FRIENDS_WITH Mark`) does not exist in the database, Cypher creates the entire pattern new -- both nodes, as well as the relationship between them. + +To avoid this scenario, you should write the statement like this instead: [source, cypher] ---- -//this statement will create duplicate nodes for Mark and Jennifer -MERGE (j:Person {name: 'Jennifer'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) +MATCH (j:Person {name: 'Jennifer'}) +MATCH (m:Person {name: 'Mark'}) +MERGE (j)-[r:IS_FRIENDS_WITH]->(m) RETURN j, r, m ---- -==== -=== Handling _MERGE_ criteria +`MATCH` is used here to find both Mark and Jennifer's node before using `MERGE` to find or create the relationship between them. +Since this relationship didn't exist anymore after you xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[deleted Mark's node and appended relationships], the result will be a newly created relationship: -Perhaps you want to use `MERGE` to ensure you do not create duplicates, but you want to initialize certain properties if the pattern is created and update other properties if it is only matched. -In this case, you can use `ON CREATE` or `ON MATCH` with the `SET` keyword to handle these situations. +image::jennifer-friends-mark.svg[Jennifer and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] -Let us look at an example. +== Track changes + +You can use the `MERGE` clause both for avoiding duplicates and also for keeping track of changes done to the graph. +For example, you can combine it with link:https://neo4j.com/docs/cypher-manual/current/clauses/merge/#query-merge-on-create-on-match[`ON CREATE` or `ON MATCH`] with the `SET` keyword to handle these situations: [source, cypher] ---- @@ -339,12 +269,29 @@ MERGE (m:Person {name: 'Mark'})-[r:IS_FRIENDS_WITH]-(j:Person {name:'Jennifer'}) RETURN m, r, j ---- -[[cypher-resources]] -== Resources +Now you have the new properties `since` and `updated` added to the `IS_FRIENDS_WITH` relationship. +They give information about how long Jennifer and Mark have been friends and when this information was updated to the graph. + +Supposing you made this change to the graph on November 24th, 2025, you will get the following result: + +[role="queryresult",options="header,footer",cols="3* A complete section on how to get started with data modeling through tutorials and reference material. \ No newline at end of file From 9c3f717acb9f344175ba881aa86d3cbe124901b0 Mon Sep 17 00:00:00 2001 From: Lidia Zuin <102308961+lidiazuin@users.noreply.github.com> Date: Tue, 25 Nov 2025 16:37:29 +0100 Subject: [PATCH 02/12] Apply suggestions from code review Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 44b3e1b4..7f98e83c 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -58,9 +58,9 @@ CREATE (a)<-[:WORKS_FOR]-(melissa)-[:LIKES]->(graphs)<-[:LIKES]-(diana) You should now have a graph with 20 nodes, 31 relationships, 28 properties, and 20 labels. -== Update a node +== Add a property to a node -This is the query you need to update Jennifer's node with information about her birthday: +If you want to add a birthday for the person named Jennifer, you can use this query: [source, cypher] -- @@ -71,11 +71,11 @@ RETURN p What this query does is: -. Find Jennifer's already existing node with the `MATCH` clause. +. Find Jennifer's node with the `MATCH` clause. . Use `SET` to create the new property `birthday` (with syntax `variable.property`) and set its value. -. Use `RETURN` to retrieve Jennifer's node and ensure that the information was updated correctly. +. Use `RETURN` to return Jennifer's node and ensure that the information was updated correctly. -This is the result: +This is the tabular result: [role="queryresult",options="header,footer",cols="1*(m) RETURN j, r, m ---- -`MATCH` is used here to find both Mark and Jennifer's node before using `MERGE` to find or create the relationship between them. -Since this relationship didn't exist anymore after you xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[deleted Mark's node and appended relationships], the result will be a newly created relationship: +`MATCH` finds both Mark and Jennifer's node before `MERGE` (finds or) creates the relationship between them. +Since this relationship didn't exist after xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[Mark's node and appended relationships] were deleted, the result is a newly created relationship: image::jennifer-friends-mark.svg[Jennifer and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] From 8cd09fbeda0994622687aeacec7c1f2c25900fa3 Mon Sep 17 00:00:00 2001 From: lidiazuin Date: Thu, 27 Nov 2025 14:17:32 +0100 Subject: [PATCH 03/12] updates after review --- modules/ROOT/images/update-graph.svg | 40 +++++++++++++++++++ modules/ROOT/pages/cypher/updating.adoc | 53 ++++++------------------- 2 files changed, 53 insertions(+), 40 deletions(-) create mode 100644 modules/ROOT/images/update-graph.svg diff --git a/modules/ROOT/images/update-graph.svg b/modules/ROOT/images/update-graph.svg new file mode 100644 index 00000000..76277afe --- /dev/null +++ b/modules/ROOT/images/update-graph.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 7f98e83c..48e670dd 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -11,7 +11,7 @@ :page-ad-underline: Learn more This tutorial shows how to update information in the graph by changing, removing, and adding nodes, relationships, and properties. -It also addresses how to avoid duplication and how to keep track of changes by adding new properties to the graph. +It also addresses how to avoid duplication. == Create the dataset @@ -58,6 +58,8 @@ CREATE (a)<-[:WORKS_FOR]-(melissa)-[:LIKES]->(graphs)<-[:LIKES]-(diana) You should now have a graph with 20 nodes, 31 relationships, 28 properties, and 20 labels. +image::update-graph.svg[All nodes added to the graph,width=500] + == Add a property to a node If you want to add a birthday for the person named Jennifer, you can use this query: @@ -110,7 +112,8 @@ This is the result: == Delete properties -Neo4j doesn't store null values, which means that if you set a property value as `null`, it will be automatically removed from your graph. +To remove a property, either use the `REMOVE` clause, or set its value to `null`. +Neo4j doesn't store properties without values, so doing this removes the property from a node. .Using the `REMOVE` clause [source,cypher] @@ -179,12 +182,9 @@ MATCH (j:Person {name:"Jennifer"}) DELETE j -- -== Delete a node and its relationships - -To repeat the same two previous steps with another node, you don't need to write two statements. -You can do this in one single query, but with some modifications that follow Neo4j's ACID compliance. +The result is the following message: "Deleted 1 node". -This time, you need to use `DETACH DELETE` to remove any existing relationships Mark's node *and* delete the node itself: +However, if you want to delete another node, for example, Mark's, you can do the same thing but in one single query using `DETACH DELETE` instead: [source, cypher] -- @@ -192,6 +192,7 @@ MATCH (m:Person {name: 'Mark'}) DETACH DELETE m -- +This removes all relationships attached to Mark's node and the node in itself. The result is the following message: "Deleted 1 node, deleted 2 relationships". == Add new data @@ -218,7 +219,7 @@ This is the result: |=== | mark -| (:Person {twitter: "@mark", name: "Mark"}) +| (:Person {name: "Mark"}) 1+d|Rows: 1 |=== @@ -234,7 +235,8 @@ MERGE (j:Person {name: 'Jennifer'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark' RETURN j, r, m -- -Cypher won't find this specific pattern, so it will create it from scratch, which means both nodes and the relationship between them will be created. +Cypher can't find this pattern since Mark's node and all its relationships were deleted, and only their node was recreated. +Consequently, if you use `CREATE` instead of `MERGE`, the whole pattern is created (with both nodes and the relationship), which results in duplicate nodes for `Jennifer` and `Mark`, but a new relationship. [TIP] ==== @@ -256,39 +258,10 @@ Since this relationship didn't exist after xref:cypher/updating.adoc#_delete_a_n image::jennifer-friends-mark.svg[Jennifer and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] -== Track changes - -You can use the `MERGE` clause both for avoiding duplicates and also for keeping track of changes done to the graph. -For example, you can combine it with link:https://neo4j.com/docs/cypher-manual/current/clauses/merge/#query-merge-on-create-on-match[`ON CREATE` or `ON MATCH`] with the `SET` keyword to handle these situations: - -[source, cypher] ----- -MERGE (m:Person {name: 'Mark'})-[r:IS_FRIENDS_WITH]-(j:Person {name:'Jennifer'}) - ON CREATE SET r.since = date('2018-03-01') - ON MATCH SET r.updated = date() -RETURN m, r, j ----- - -Now you have the new properties `since` and `updated` added to the `IS_FRIENDS_WITH` relationship. -They give information about how long Jennifer and Mark have been friends and when this information was updated to the graph. - -Supposing you made this change to the graph on November 24th, 2025, you will get the following result: - -[role="queryresult",options="header,footer",cols="3* Date: Thu, 27 Nov 2025 15:51:43 +0100 Subject: [PATCH 04/12] Apply suggestions from code review Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 48e670dd..c9c0f044 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -75,7 +75,7 @@ What this query does is: . Find Jennifer's node with the `MATCH` clause. . Use `SET` to create the new property `birthday` (with syntax `variable.property`) and set its value. -. Use `RETURN` to return Jennifer's node and ensure that the information was updated correctly. +. Use `RETURN` to return Jennifer's node and so you can ensure that the information was updated correctly. This is the tabular result: @@ -99,7 +99,7 @@ SET p.birthdate = date('1980-01-02') RETURN p -- -This is the result: +This is the tabular result: [role="queryresult",options="header,footer",cols="1* Date: Mon, 1 Dec 2025 14:18:36 +0100 Subject: [PATCH 05/12] updates after review and testing --- modules/ROOT/images/update-graph.svg | 132 +++++++++++++++++------- modules/ROOT/pages/cypher/updating.adoc | 89 +++++++++++----- 2 files changed, 157 insertions(+), 64 deletions(-) diff --git a/modules/ROOT/images/update-graph.svg b/modules/ROOT/images/update-graph.svg index 76277afe..d9851da4 100644 --- a/modules/ROOT/images/update-graph.svg +++ b/modules/ROOT/images/update-graph.svg @@ -1,40 +1,94 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index c9c0f044..1aeb45d3 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -199,52 +199,88 @@ The result is the following message: "Deleted 1 node, deleted 2 relationships". == Add new data If you want to add new data to your graph, it's important to avoid duplication. -Instead of using `CREATE`, you can use `MERGE` to add new elements. +For example, if you want to create a node that already exists in the graph using `CREATE`: -`MERGE` does a "select-or-insert" operation that first checks if the data exists in the database. -If it exists, then Cypher returns it as it is or makes any specified updates to the existing node or relationship. -If the data doesn't exist, then Cypher creates it with the information you specify. +[source, cypher] +-- +CREATE (ann:Person {name: 'Ann'}) +RETURN ann +-- -Since you removed Mark's node in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], Cypher does not find an existing match. -It creates a new node with the `name` property set to 'Mark': +Cypher prompts an error that stops you from doing it. +However, if you use `MERGE`: [source, cypher] ----- -MERGE (mark:Person {name: 'Mark'}) -RETURN mark ----- +-- +MERGE (ann:Person {name: 'Ann'}) +RETURN ann +-- -This is the tabular result: +Cypher returns the existing node normally: [role="queryresult",options="header,footer",cols="1*(m:Person {name: 'Mark'}) +RETURN j, r, m +-- -[source, cypher] +Or: + +[source,cypher] -- -MERGE (j:Person {name: 'Jennifer'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) +MERGE (j:Person {name: 'Ann'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) RETURN j, r, m -- -Cypher can't find this pattern since Mark's node and all its relationships were deleted, and only their node was recreated. -Consequently, if you use `CREATE` instead of `MERGE`, the whole pattern is created (with both nodes and the relationship), which results in duplicate nodes for `Jennifer` and `Mark`, but a new relationship. +You won't get any results. +Instead, you need to first `MATCH` the nodes and then create the relationship. -[TIP] -==== -If you ran this statement and created the duplication, you can go back to the previous steps where you saw xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[how to delete a node and its relationships]. -==== +Since Mark and Jennifer nodes were removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], you need to create them again either by using `CREATE`: -To avoid this, use `MATCH` to find the nodes first, and then `MERGE` to create the relationship: +[source, cypher] +-- +CREATE (mark:Person {name: 'Mark'}) +CREATE (jennifer:Person {name: 'Jennifer'}) +RETURN mark, jennifer +-- + +Or `MERGE`: + +[source, cypher] +-- +MERGE (mark:Person {name: 'Mark'}) +MERGE (jennifer:Person {name: 'Jennifer'}) +RETURN mark, jennifer +-- + +This is the tabular result: + +[role="queryresult",options="header,footer",cols="2* Date: Mon, 1 Dec 2025 16:49:42 +0100 Subject: [PATCH 06/12] Apply suggestions from code review Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 1aeb45d3..7dd2b3b6 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -62,7 +62,7 @@ image::update-graph.svg[All nodes added to the graph,width=500] == Add a property to a node -If you want to add a birthday for the person named Jennifer, you can use this query: +If you want to add a birthday for the person named Jennifer, you can add this information as a _property_ with this query: [source, cypher] -- @@ -71,7 +71,7 @@ SET p.birthdate = date('1980-01-01') RETURN p -- -What this query does is: +This query does the following: . Find Jennifer's node with the `MATCH` clause. . Use `SET` to create the new property `birthday` (with syntax `variable.property`) and set its value. @@ -90,7 +90,7 @@ This is the tabular result: == Update a property -To change Jennifer's birthdate, you can use the same query from the previous example to find Jennifer's node again, and then add a different date with the `SET` clause: +To change Jennifer's birthdate, you can use the same query from the previous example to find Jennifer's node again, and change the property value by adding a different date with the `SET` clause: [source, cypher] -- @@ -157,10 +157,10 @@ This is the result: == Delete a relationship -You can use the `DELETE` clause for deleting both relationships and nodes. +You can use the `DELETE` clause to delete both relationships and nodes. However, because Neo4j is ACID-compliant, you cannot delete a node if it still has relationships. -Therefore, if you want to xref:cypher/updating.adoc#_delete_a_node[delete a node], for example, Jennifer's node, you need to first delete the relationships appended to it: +Therefore, if you want to xref:cypher/updating.adoc#_delete_a_node[delete a node], for example Jennifer's node, you need to first delete the relationships appended to it: [source,cypher] -- @@ -199,7 +199,7 @@ The result is the following message: "Deleted 1 node, deleted 2 relationships". == Add new data If you want to add new data to your graph, it's important to avoid duplication. -For example, if you want to create a node that already exists in the graph using `CREATE`: +For example, if you try to create a node that already exists in the graph using `CREATE`: [source, cypher] -- @@ -291,8 +291,7 @@ RETURN j, r, m ---- `MATCH` finds both Mark and Jennifer's node before `MERGE` (finds or) creates the relationship between them. -This time, it's better not to use `CREATE` optionally because, if you run the statement again, it will duplicate the `IS_FRIENDS_WITH` relationship, but not the nodes. -Therefore, it is recommended to use `MERGE` to avoid such scenarios. +You can use `CREATE` for the relationship, but you would then risk creating a duplicate relationship (if it already exists). Since this relationship didn't exist after xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[Mark's node and appended relationships] were deleted, the result is a newly created relationship: From 9334f316f6a0cd558fe21f32352695faff555b55 Mon Sep 17 00:00:00 2001 From: lidiazuin Date: Mon, 1 Dec 2025 17:17:53 +0100 Subject: [PATCH 07/12] updates after review --- ...-friends-mark.svg => ann-friends-mark.svg} | 2 +- modules/ROOT/pages/cypher/updating.adoc | 70 ++++++++++++------- 2 files changed, 45 insertions(+), 27 deletions(-) rename modules/ROOT/images/{jennifer-friends-mark.svg => ann-friends-mark.svg} (67%) diff --git a/modules/ROOT/images/jennifer-friends-mark.svg b/modules/ROOT/images/ann-friends-mark.svg similarity index 67% rename from modules/ROOT/images/jennifer-friends-mark.svg rename to modules/ROOT/images/ann-friends-mark.svg index 381eff24..f05549a0 100644 --- a/modules/ROOT/images/jennifer-friends-mark.svg +++ b/modules/ROOT/images/ann-friends-mark.svg @@ -2,7 +2,7 @@ - + diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 7dd2b3b6..37a9cf08 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -184,8 +184,8 @@ DELETE j The result is the following message: "Deleted 1 node". -You can also delete a node with a single query using `DETACH DELETE`. -If you want to delete Mark's node, for example: +It is also possible to delete a node and all its relationships with a single query using `DETACH DELETE`. +This is faster but allows less control: [source, cypher] -- @@ -207,7 +207,27 @@ CREATE (ann:Person {name: 'Ann'}) RETURN ann -- -Cypher prompts an error that stops you from doing it. +You create a duplication. +If you `MATCH` Ann's node: + +[source, cypher] +-- +MATCH (ann:Person {name: 'Ann'}) +RETURN ann +-- + +You see there are two Nodes containing the same information: + +[role="queryresult",options="header,footer",cols="1*(m:Person {name: 'Mark'}) RETURN j, r, m -- -Or: +You duplicate Ann's node and create a new Mark node that was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step] and a new `IS_FRIENDS_WITH` relationship between them. +If you use `MERGE` instead: [source,cypher] -- @@ -244,16 +265,18 @@ MERGE (j:Person {name: 'Ann'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) RETURN j, r, m -- -You won't get any results. +You see in the result that you "Created 2 nodes, created 1 relationship, set 2 properties, added 2 labels", so another duplication. +This happens because `MERGE` tries to find the information queried and, if it doesn't exist, it is then created. + +Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements of it are created anew. Instead, you need to first `MATCH` the nodes and then create the relationship. -Since Mark and Jennifer nodes were removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], you need to create them again either by using `CREATE`: +Since Mark's node was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], you need to create it again either by using `CREATE`: [source, cypher] -- CREATE (mark:Person {name: 'Mark'}) -CREATE (jennifer:Person {name: 'Jennifer'}) -RETURN mark, jennifer +RETURN mark -- Or `MERGE`: @@ -261,41 +284,36 @@ Or `MERGE`: [source, cypher] -- MERGE (mark:Person {name: 'Mark'}) -MERGE (jennifer:Person {name: 'Jennifer'}) -RETURN mark, jennifer +RETURN mark -- This is the tabular result: -[role="queryresult",options="header,footer",cols="2*(m) -RETURN j, r, m +RETURN a, r, m ---- -`MATCH` finds both Mark and Jennifer's node before `MERGE` (finds or) creates the relationship between them. -You can use `CREATE` for the relationship, but you would then risk creating a duplicate relationship (if it already exists). - -Since this relationship didn't exist after xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[Mark's node and appended relationships] were deleted, the result is a newly created relationship: +`MATCH` finds both Mark and Ann's node before `MERGE` (finds or) creates the relationship between them. -image::jennifer-friends-mark.svg[Jennifer and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] +image::ann-friends-mark.svg[Ann and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] == Conclusion From 7cd46f1031c7d2e611784f3834d3b661dee0b0fe Mon Sep 17 00:00:00 2001 From: Lidia Zuin <102308961+lidiazuin@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:05:37 +0100 Subject: [PATCH 08/12] Apply suggestions from code review Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 37a9cf08..0395f3cf 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -216,7 +216,7 @@ MATCH (ann:Person {name: 'Ann'}) RETURN ann -- -You see there are two Nodes containing the same information: +You see there are two nodes containing the same information: [role="queryresult",options="header,footer",cols="1*(m:Person {name: 'Mark'}) -RETURN j, r, m +CREATE (a:Person {name: 'Ann'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) +RETURN a, r, m -- -You duplicate Ann's node and create a new Mark node that was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step] and a new `IS_FRIENDS_WITH` relationship between them. +The result is that you duplicate Ann's node and create a new Mark node (since it was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step]) and add a new `IS_FRIENDS_WITH` relationship between them. If you use `MERGE` instead: [source,cypher] @@ -265,11 +265,12 @@ MERGE (j:Person {name: 'Ann'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'}) RETURN j, r, m -- -You see in the result that you "Created 2 nodes, created 1 relationship, set 2 properties, added 2 labels", so another duplication. +The result is more duplication. +`MERGE` tries to match the *entire* pattern, and if it doesn't exist, it is created. This happens because `MERGE` tries to find the information queried and, if it doesn't exist, it is then created. -Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements of it are created anew. -Instead, you need to first `MATCH` the nodes and then create the relationship. +Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements are created anew. +To avoid the duplication, you need to first `MATCH` the nodes and then create the relationship. Since Mark's node was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], you need to create it again either by using `CREATE`: @@ -307,7 +308,7 @@ In order to create the new relationship, you need to first `MATCH` Ann and Mark' ---- MATCH (a:Person {name: 'Ann'}) MATCH (m:Person {name: 'Mark'}) -MERGE (j)-[r:IS_FRIENDS_WITH]->(m) +MERGE (a)-[r:IS_FRIENDS_WITH]->(m) RETURN a, r, m ---- From 7cf61b34db681de870c57d18e64a3d7bcdb79792 Mon Sep 17 00:00:00 2001 From: lidiazuin Date: Tue, 2 Dec 2025 12:28:53 +0100 Subject: [PATCH 09/12] fixes after review --- modules/ROOT/pages/cypher/updating.adoc | 39 ++++++------------------- 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 0395f3cf..1008502b 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -257,6 +257,8 @@ RETURN a, r, m -- The result is that you duplicate Ann's node and create a new Mark node (since it was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step]) and add a new `IS_FRIENDS_WITH` relationship between them. +You get the following message confirming it: "Created 2 nodes, created 1 relationship, set 2 properties, added 2 labels". + If you use `MERGE` instead: [source,cypher] @@ -272,37 +274,14 @@ This happens because `MERGE` tries to find the information queried and, if it do Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements are created anew. To avoid the duplication, you need to first `MATCH` the nodes and then create the relationship. -Since Mark's node was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step], you need to create it again either by using `CREATE`: - -[source, cypher] --- -CREATE (mark:Person {name: 'Mark'}) -RETURN mark --- - -Or `MERGE`: - -[source, cypher] --- -MERGE (mark:Person {name: 'Mark'}) -RETURN mark --- - -This is the tabular result: - -[role="queryresult",options="header,footer",cols="1* Date: Thu, 4 Dec 2025 13:08:28 +0100 Subject: [PATCH 10/12] Apply suggestions from code review Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 1008502b..e3bd3dfd 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -269,19 +269,18 @@ RETURN j, r, m The result is more duplication. `MERGE` tries to match the *entire* pattern, and if it doesn't exist, it is created. -This happens because `MERGE` tries to find the information queried and, if it doesn't exist, it is then created. Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements are created anew. To avoid the duplication, you need to first `MATCH` the nodes and then create the relationship. -[IMPORTANT] +[NOTE] ==== If you created the previous duplication, you don't need to fix it before proceeding with the tutorial. However, if you didn't do it, you need to create a new node for Mark, as it was removed in xref:cypher/updating.adoc#_delete_a_node_and_its_relationships[the previous step]. You can do it using either `CREATE` or `MERGE`. ==== -In order to create the new relationship, without duplications, you need to first `MATCH` Ann and Mark's nodes: +In order to create the new relationship, without duplications, you need to first `MATCH` Ann and Mark's nodes and then `MERGE` (or `CREATE`) the relationship: [source, cypher] ---- @@ -291,7 +290,6 @@ MERGE (a)-[r:IS_FRIENDS_WITH]->(m) RETURN a, r, m ---- -`MATCH` finds both Mark and Ann's node before `MERGE` (finds or) creates the relationship between them. image::ann-friends-mark.svg[Ann and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] From 480611ba51d4814e3884aacfbb5ad190e94a553d Mon Sep 17 00:00:00 2001 From: lidiazuin Date: Thu, 4 Dec 2025 13:17:59 +0100 Subject: [PATCH 11/12] update after review --- modules/ROOT/pages/cypher/updating.adoc | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index e3bd3dfd..4d7c08a2 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -240,13 +240,34 @@ Cypher returns the existing node without creating a new one: [role="queryresult",options="header,footer",cols="1*(m) RETURN a, r, m ---- - image::ann-friends-mark.svg[Ann and Mark's nodes are connected through a is friends with relationship,width=400,role=popup] == Conclusion From cc6f0a3c42286fea611d1f4901b247a6097d54af Mon Sep 17 00:00:00 2001 From: Lidia Zuin <102308961+lidiazuin@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:27:34 +0100 Subject: [PATCH 12/12] Update modules/ROOT/pages/cypher/updating.adoc Co-authored-by: Jessica Wright <49636617+AlexicaWright@users.noreply.github.com> --- modules/ROOT/pages/cypher/updating.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ROOT/pages/cypher/updating.adoc b/modules/ROOT/pages/cypher/updating.adoc index 4d7c08a2..dbab8e08 100644 --- a/modules/ROOT/pages/cypher/updating.adoc +++ b/modules/ROOT/pages/cypher/updating.adoc @@ -292,7 +292,6 @@ The result is more duplication. `MERGE` tries to match the *entire* pattern, and if it doesn't exist, it is created. Even though the graph already has Ann and Mark's nodes, the pattern `(Ann)-[:IS_FRIENDS_WITH]->(Mark)` doesn't exist, so all elements are created anew. -To avoid the duplication, you need to first `MATCH` the nodes and then create the relationship. [NOTE] ====