DELETE¶
The DELETE clause is used to delete nodes and relationships from the graph.
Delete Nodes¶
Basic Node Deletion¶
Delete Multiple Nodes¶
Delete Relationships¶
Delete Specific Relationship¶
Delete All Relationships of a Type¶
DETACH DELETE¶
Delete node and all its relationships:
This is equivalent to:
Delete with Conditions¶
Delete Old Data¶
Delete Inactive Users¶
Delete Patterns¶
Delete Relationship Chain¶
MATCH (a:User)-[r1:KNOWS]->(b:User)-[r2:KNOWS]->(c:User)
WHERE a.name = 'Alice' AND c.name = 'Charlie'
DELETE r1, r2
Delete Subgraph¶
Delete All Data¶
Delete All Nodes and Relationships¶
Delete by Label¶
Conditional Delete¶
Delete with CASE¶
MATCH (u:User)
WITH u,
CASE
WHEN u.lastLogin < datetime() - duration('P365D') THEN true
ELSE false
END AS shouldDelete
WHERE shouldDelete = true
DETACH DELETE u
Delete and Return¶
Return deleted elements:
Batch Delete¶
Delete in Batches¶
CALL {
MATCH (u:User)
WHERE u.inactive = true
WITH u LIMIT 1000
DETACH DELETE u
RETURN count(u) AS deleted
}
RETURN deleted
Delete with Progress Tracking¶
MATCH (n:OldData)
WITH count(n) AS total
MATCH (n:OldData)
WITH n, total
LIMIT 1000
DETACH DELETE n
RETURN count(n) AS deleted, total
Delete Orphaned Nodes¶
Delete nodes with no relationships:
Delete Duplicate Relationships¶
MATCH (a:User)-[r:KNOWS]->(b:User)
WITH a, b, collect(r) AS rels
WHERE size(rels) > 1
UNWIND rels[1..] AS duplicateRel
DELETE duplicateRel
Common Patterns¶
Soft Delete (Mark as Deleted)¶
Instead of deleting, mark as deleted:
Query active users:
Archive Before Delete¶
MATCH (u:User {name: 'Alice'})
CREATE (a:ArchivedUser)
SET a = properties(u)
SET a.archivedAt = datetime()
WITH u
DETACH DELETE u
Delete Cascade¶
Delete user and all related content:
MATCH (u:User {name: 'Alice'})
OPTIONAL MATCH (u)-[:POSTED]->(p:Post)
OPTIONAL MATCH (u)-[:COMMENTED]->(c:Comment)
DETACH DELETE u, p, c
Cleanup After Delete¶
// Delete user
MATCH (u:User {name: 'Alice'})
DETACH DELETE u
// Delete orphaned data
MATCH (p:Post)
WHERE NOT ()-[:POSTED]->(p)
DELETE p
Performance Tips¶
-
Delete in Batches for Large Datasets
-
Use DETACH DELETE for Nodes
-
Index Properties Used in DELETE Queries
-
Consider Soft Delete for Audit Trail
Safety Tips¶
-
Always Use WHERE Clause
-
Test with COUNT First
-
Use Transactions
-
Backup Before Large Deletes
Error Handling¶
Constraint Violations¶
// Can't delete node with relationships without DETACH
MATCH (u:User {name: 'Alice'})
DELETE u
// Error: Cannot delete node with relationships
// Use DETACH DELETE
MATCH (u:User {name: 'Alice'})
DETACH DELETE u
// Success
Next Steps¶
- Create data with CREATE
- Update data with SET
- Match patterns with MATCH
- Read Cypher Introduction