REMOVE
The REMOVE clause is used to remove properties from nodes and relationships, and to remove labels from nodes.
To delete nodes and relationships, use the DELETE clause.
| Removing labels from a node is an idempotent operation: if you try to remove a label from a node that does not have that label on it, nothing happens. The query statistics will tell you if something needed to be done or not. |
Example graph
The following graph is used for the examples below:
To recreate it, run the following query against an empty Neo4j database:
CREATE
(a:Swedish {name: 'Andy', age: 36, propTestValue1: 42}),
(t:Swedish {name: 'Timothy', age: 25, propTestValue2: 42}),
(p:German:Swedish {name: 'Peter', age: 34}),
(a)-[:KNOWS]->(t),
(a)-[:KNOWS]->(p)
Remove a property
Neo4j doesn’t allow storing null in properties.
Instead, if no value exists, the property is just not there.
So, REMOVE is used to remove a property value from a node or a relationship.
MATCH (a {name: 'Andy'})
REMOVE a.age
RETURN a.name, a.age
The node is returned, and no property age exists on it.
| a.name | a.age |
|---|---|
|
|
Rows: 1 |
|
Remove all properties
REMOVE cannot be used to remove all existing properties from a node or relationship.
Instead, using SET with = and an empty map as the right operand will clear all properties from the node or relationship.
Dynamically remove a propertyIntroduced in 5.24
REMOVE can be used to remove a property on a node or relationship even when the property key name is not statically known.
This allows for more flexible queries and mitigates the risk of Cypher® injection.
(For more information about Cypher injection, see Neo4j Knowledge Base → Protecting against Cypher injection).
REMOVE n[key]
The dynamically calculated key must evaluate to a STRING value.
This query creates a copy of every property on the nodes:
MATCH (n)
WITH n, [k IN keys(n) WHERE k CONTAINS "Test" | k] as propertyKeys (1)
FOREACH (i IN propertyKeys | REMOVE n[i]) (2)
RETURN n.name, keys(n);
| 1 | The keys() function retrieves all property keys of the matched nodes, and a list comprehension filters these keys to include only those that contain the substring "Test", assigning the resulting list to the variable propertyKeys. |
| 2 | The FOREACH clause iterates over each key in the propertyKeys list and removes the corresponding property using the REMOVE clause. |
All properties with the word "Test" in them are removed:
| n.name | keys(n) |
|---|---|
|
|
|
|
|
|
Rows: 3 |
|
Remove a label from a node
To remove labels, you use REMOVE.
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)
| n.name | labels(n) |
|---|---|
|
|
Rows: 1 |
|
Dynamically remove a node labelIntroduced in 5.24
REMOVE can be used to remove a label on a node even when the label is not statically known.
MATCH (n)
REMOVE n:$(expr)
The expression must evaluate to a STRING NOT NULL | LIST<STRING NOT NULL> NOT NULL value.
MATCH (n {name: 'Peter'})
UNWIND labels(n) AS label (1)
REMOVE n:$(label)
RETURN n.name, labels(n)
| 1 | UNWIND is used here to transform the list of labels from the labels() function into separate rows, allowing subsequent operations to be performed on each label individually. |
| n.name | labels(n) |
|---|---|
|
|
Rows: 1 |
|
Remove multiple labels from a node
To remove multiple labels, you use REMOVE.
MATCH (n {name: 'Peter'})
REMOVE n:German:Swedish
RETURN n.name, labels(n)
| n.name | labels(n) |
|---|---|
|
|
Rows: 1 |
|
Remove multiple labels dynamically from a nodeIntroduced in 5.24
It is possible to remove multiple labels dynamically using a LIST<STRING> and/or by chaining them separately with a ::
MATCH (n {name: 'Peter'})
REMOVE n:$(labels(n))
RETURN n.name, labels(n)
| n.name | labels(n) |
|---|---|
|
|
Rows: 1 |
|