REMOVE

The REMOVE clause is used to remove properties from nodes and relationships, and to remove labels from nodes.

For deleting nodes and relationships, see DELETE.

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:

graph remove clause

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.

Query
MATCH (a {name: 'Andy'})
REMOVE a.age
RETURN a.name, a.age

The node is returned, and no property age exists on it.

Table 1. Result
a.name a.age

"Andy"

<null>

Rows: 1
Properties set: 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 property

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:

Query
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:

Table 2. Result
n.name keys(n)

"Andy"

["name", "age"]

"Timothy"

["name", "age"]

"Peter"

["name", "age"]

Rows: 3
Properties set: 2

Remove a label from a node

To remove labels, you use REMOVE.

Query
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)
Table 3. Result
n.name labels(n)

"Peter"

["Swedish"]

Rows: 1
Labels removed: 1

Dynamically remove a node label

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.

Query
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.
Table 4. Result
n.name labels(n)

"Peter"

[]

Rows: 1
Labels removed: 2

Remove multiple labels from a node

To remove multiple labels, you use REMOVE.

Query
MATCH (n {name: 'Peter'})
REMOVE n:German:Swedish
RETURN n.name, labels(n)
Table 5. Result
n.name labels(n)

"Peter"

[]

Rows: 1
Labels removed: 2

Remove multiple labels dynamically from a node

It is possible to remove multiple labels dynamically using a LIST<STRING> and/or by chaining them separately with a ::

Query
MATCH (n {name: 'Peter'})
REMOVE n:$(labels(n))
RETURN n.name, labels(n)
Table 6. Result
n.name labels(n)

"Peter"

[]

Rows: 1
Labels removed: 2