删除数据 #
一、DELETE语句概述 #
1.1 基本语法 #
cypher
DELETE node
DELETE relationship
DETACH DELETE node
1.2 DELETE特点 #
text
DELETE特点:
├── 删除节点和关系
├── 删除前必须断开关系
├── 支持批量删除
├── 删除操作不可逆
└── 需要提交事务才能生效
二、删除节点 #
2.1 删除单个节点 #
cypher
MATCH (p:Person {name: 'Tom'})
DELETE p
2.2 删除多个节点 #
cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry']
DELETE p
2.3 条件删除 #
cypher
MATCH (p:Person)
WHERE p.age > 60
DELETE p
2.4 删除有关系的节点 #
cypher
MATCH (p:Person {name: 'Tom'})
DETACH DELETE p
2.5 删除所有节点 #
cypher
MATCH (n)
DETACH DELETE n
2.6 删除特定标签的所有节点 #
cypher
MATCH (p:Person)
DETACH DELETE p
三、DETACH DELETE #
3.1 什么是DETACH DELETE #
DETACH DELETE会删除节点及其所有关系。
cypher
MATCH (p:Person {name: 'Tom'})
DETACH DELETE p
3.2 DELETE vs DETACH DELETE #
| 操作 | 说明 |
|---|---|
| DELETE | 只删除节点,有关系时报错 |
| DETACH DELETE | 删除节点及其所有关系 |
3.3 使用场景 #
text
使用DELETE:
├── 确定节点没有关系
├── 需要先手动删除关系
└── 需要精确控制删除过程
使用DETACH DELETE:
├── 删除节点及其关系
├── 不确定是否有关系
└── 快速清理数据
3.4 安全删除模式 #
cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[r]-()
WITH p, r
DELETE r
DELETE p
四、删除关系 #
4.1 删除单个关系 #
cypher
MATCH (a)-[r:KNOWS]->(b)
WHERE a.name = 'Tom' AND b.name = 'Jerry'
DELETE r
4.2 删除特定类型的所有关系 #
cypher
MATCH ()-[r:KNOWS]-()
DELETE r
4.3 删除节点的所有关系 #
cypher
MATCH (p:Person {name: 'Tom'})-[r]-()
DELETE r
4.4 删除节点的出关系 #
cypher
MATCH (p:Person {name: 'Tom'})-[r]->()
DELETE r
4.5 删除节点的入关系 #
cypher
MATCH (p:Person {name: 'Tom'})<-[r]-()
DELETE r
4.6 条件删除关系 #
cypher
MATCH ()-[r:KNOWS]-()
WHERE r.since < 2020
DELETE r
4.7 删除多种类型的关系 #
cypher
MATCH ()-[r:KNOWS|FRIEND_OF]-()
DELETE r
五、REMOVE语句 #
5.1 REMOVE概述 #
REMOVE用于删除属性和标签,而不是删除节点或关系。
cypher
REMOVE n.property
REMOVE n:Label
5.2 删除属性 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p.email
5.3 删除多个属性 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p.email, p.phone
5.4 删除标签 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p:Actor
5.5 删除多个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p:Actor:Director
5.6 条件删除属性 #
cypher
MATCH (p:Person)
WHERE p.tempData IS NOT NULL
REMOVE p.tempData
5.7 DELETE vs REMOVE #
| 操作 | 用途 |
|---|---|
| DELETE | 删除节点和关系 |
| REMOVE | 删除属性和标签 |
六、批量删除 #
6.1 批量删除节点 #
cypher
MATCH (p:Person)
WHERE p.status = 'inactive'
DETACH DELETE p
6.2 使用IN条件批量删除 #
cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry', 'Mike']
DETACH DELETE p
6.3 使用UNWIND批量删除 #
cypher
:param ids => ['person_001', 'person_002', 'person_003']
UNWIND $ids AS id
MATCH (p:Person {id: id})
DETACH DELETE p
6.4 分批删除大量数据 #
cypher
MATCH (p:Person)
WHERE p.status = 'deleted'
CALL {
WITH p
DETACH DELETE p
} IN TRANSACTIONS OF 1000 ROWS
6.5 限制删除数量 #
cypher
MATCH (p:Person)
WHERE p.status = 'inactive'
DETACH DELETE p
LIMIT 1000
七、条件删除 #
7.1 基于属性条件删除 #
cypher
MATCH (p:Person)
WHERE p.age < 18
DETACH DELETE p
7.2 基于时间条件删除 #
cypher
MATCH (p:Person)
WHERE p.createdAt < datetime('2020-01-01')
DETACH DELETE p
7.3 基于关系条件删除 #
cypher
MATCH (p:Person)
WHERE NOT (p)-[:KNOWS]-()
DELETE p
7.4 基于度数条件删除 #
cypher
MATCH (p:Person)
WHERE size((p)-[]-()) = 0
DELETE p
7.5 基于多条件删除 #
cypher
MATCH (p:Person)
WHERE p.status = 'inactive' AND p.lastLogin < datetime('2023-01-01')
DETACH DELETE p
八、级联删除 #
8.1 手动级联删除 #
cypher
MATCH (p:Person {name: 'Tom'})-[:HAS_POST]->(post:Post)
DETACH DELETE post
DETACH DELETE p
8.2 删除子图 #
cypher
MATCH (p:Person {name: 'Tom'})-[r*1..5]->(related)
DETACH DELETE related
DETACH DELETE p
8.3 删除关联数据 #
cypher
MATCH (u:User {id: 'user_001'})
OPTIONAL MATCH (u)-[:HAS_POST]->(p:Post)
OPTIONAL MATCH (p)-[:HAS_COMMENT]->(c:Comment)
DETACH DELETE c
DETACH DELETE p
DETACH DELETE u
九、软删除 #
9.1 什么是软删除 #
软删除不实际删除数据,而是标记为已删除。
cypher
MATCH (p:Person {name: 'Tom'})
SET p.deleted = true, p.deletedAt = datetime()
9.2 查询时过滤软删除 #
cypher
MATCH (p:Person)
WHERE p.deleted IS NULL OR p.deleted = false
RETURN p
9.3 恢复软删除 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.deleted = false, p.deletedAt = NULL
9.4 永久删除软删除数据 #
cypher
MATCH (p:Person)
WHERE p.deleted = true AND p.deletedAt < datetime() - duration('P30D')
DETACH DELETE p
9.5 软删除优势 #
text
优势:
├── 数据可恢复
├── 保留历史记录
├── 支持审计
├── 防止误删
└── 支持撤销操作
十、删除前检查 #
10.1 检查是否存在 #
cypher
MATCH (p:Person {name: 'Tom'})
WITH p, count(p) AS exists
WHERE exists > 0
DETACH DELETE p
10.2 检查关系数量 #
cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[r]-()
WITH p, count(r) AS relCount
RETURN p.name, relCount
10.3 预览删除数据 #
cypher
MATCH (p:Person {name: 'Tom'})
OPTIONAL MATCH (p)-[r]-()
RETURN p, r
10.4 统计删除数量 #
cypher
MATCH (p:Person)
WHERE p.status = 'inactive'
WITH count(p) AS deleteCount
MATCH (p:Person)
WHERE p.status = 'inactive'
DETACH DELETE p
RETURN deleteCount
十一、删除安全措施 #
11.1 使用事务 #
cypher
BEGIN
MATCH (p:Person {name: 'Tom'})
DETACH DELETE p
COMMIT
11.2 备份重要数据 #
cypher
MATCH (p:Person {name: 'Tom'})
CREATE (backup:PersonBackup)
SET backup = properties(p)
WITH p
DETACH DELETE p
11.3 使用LIMIT限制 #
cypher
MATCH (p:Person)
WHERE p.status = 'inactive'
DETACH DELETE p
LIMIT 100
11.4 删除确认 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p
十二、删除性能优化 #
12.1 使用索引 #
cypher
CREATE INDEX FOR (p:Person) ON (p.id)
MATCH (p:Person {id: 'person_001'})
DETACH DELETE p
12.2 分批删除 #
cypher
CALL {
MATCH (p:Person)
WHERE p.status = 'deleted'
DETACH DELETE p
RETURN count(p) AS deleted
} IN TRANSACTIONS OF 1000 ROWS
12.3 删除顺序 #
cypher
MATCH (p:Person {name: 'Tom'})
MATCH (p)-[r]-()
DELETE r
DELETE p
12.4 性能建议 #
text
建议:
├── 使用索引加速查找
├── 分批删除大量数据
├── 先删除关系再删除节点
├── 使用DETACH DELETE简化操作
└── 避免高峰期大量删除
十三、删除最佳实践 #
13.1 删除前备份 #
cypher
MATCH (p:Person {id: 'person_001'})
CREATE (backup:PersonBackup)
SET backup = properties(p), backup.deletedAt = datetime()
WITH p
DETACH DELETE p
13.2 使用软删除 #
cypher
MATCH (p:Person {id: 'person_001'})
SET p.deleted = true, p.deletedAt = datetime()
13.3 审计删除操作 #
cypher
MATCH (p:Person {id: 'person_001'})
CREATE (log:DeleteLog {
entityId: p.id,
entityType: 'Person',
deletedAt: datetime(),
deletedBy: 'admin'
})
WITH p
DETACH DELETE p
13.4 避免反模式 #
text
避免:
├── 不使用索引的删除
├── 大量单条删除
├── 删除前不检查依赖
├── 删除后不验证结果
└── 不使用事务保护
十四、实际应用示例 #
14.1 删除用户 #
cypher
MATCH (u:User {id: 'user_001'})
OPTIONAL MATCH (u)-[:HAS_POST]->(p:Post)
OPTIONAL MATCH (p)-[:HAS_COMMENT]->(c:Comment)
DETACH DELETE c
DETACH DELETE p
DETACH DELETE u
14.2 删除过期数据 #
cypher
MATCH (o:Order)
WHERE o.status = 'pending' AND o.createdAt < datetime() - duration('P30D')
DETACH DELETE o
14.3 清理孤立节点 #
cypher
MATCH (n)
WHERE NOT (n)--()
DELETE n
14.4 删除测试数据 #
cypher
MATCH (n)
WHERE n.name STARTS WITH 'test_'
DETACH DELETE n
14.5 重置数据库 #
cypher
MATCH (n)
DETACH DELETE n
十五、总结 #
删除数据要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 删除节点 | DELETE n | 删除无关系的节点 |
| 删除节点及关系 | DETACH DELETE n | 删除节点及其关系 |
| 删除关系 | DELETE r | 删除关系 |
| 删除属性 | REMOVE n.prop | 删除属性 |
| 删除标签 | REMOVE n:Label | 删除标签 |
最佳实践:
- 使用DETACH DELETE简化操作
- 删除前检查依赖关系
- 重要数据使用软删除
- 大量删除分批处理
- 删除后验证结果
下一步,让我们学习基础查询!
最后更新:2026-03-27