删除数据 #

一、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 删除标签

最佳实践:

  1. 使用DETACH DELETE简化操作
  2. 删除前检查依赖关系
  3. 重要数据使用软删除
  4. 大量删除分批处理
  5. 删除后验证结果

下一步,让我们学习基础查询!

最后更新:2026-03-27