删除数据 #
一、删除概述 #
1.1 删除类型 #
text
删除类型:
├── 删除顶点:删除顶点及其关联边
├── 删除边:删除关系
├── 删除属性:删除属性值
└── 批量删除:批量删除数据
1.2 删除方式 #
text
删除方式:
├── Gremlin:drop()
└── SPARQL:DELETE DATA, DELETE WHERE
二、Gremlin删除顶点 #
2.1 基本删除 #
gremlin
// 删除单个顶点
g.V('1').drop()
// 删除多个顶点
g.V('1', '2', '3').drop()
// 删除并返回
g.V('1').drop().iterate()
2.2 条件删除 #
gremlin
// 按标签删除
g.V().hasLabel('temp').drop()
// 按属性删除
g.V().has('status', 'deleted').drop()
// 复杂条件删除
g.V().hasLabel('user').
has('lastLogin', lt(oneYearAgo)).
has('status', 'inactive').
drop()
2.3 级联删除 #
gremlin
// Neptune自动删除关联边
g.V('1').drop() // 自动删除所有关联边
// 手动删除关联数据
g.V('1').as('v').
outE().drop().
select('v').drop()
2.4 删除孤立顶点 #
gremlin
// 删除没有边的顶点
g.V().where(bothE().count().is(0)).drop()
// 删除没有入边的顶点
g.V().where(inE().count().is(0)).drop()
// 删除没有出边的顶点
g.V().where(outE().count().is(0)).drop()
三、Gremlin删除边 #
3.1 基本删除 #
gremlin
// 删除单个边
g.E('e1').drop()
// 删除多个边
g.E('e1', 'e2', 'e3').drop()
// 删除顶点的所有出边
g.V('1').outE().drop()
// 删除顶点的所有入边
g.V('1').inE().drop()
// 删除顶点的所有边
g.V('1').bothE().drop()
3.2 条件删除 #
gremlin
// 按标签删除
g.E().hasLabel('temp').drop()
// 按属性删除
g.E().has('verified', false).drop()
// 复杂条件删除
g.E().hasLabel('follows').
has('createdAt', lt(oneYearAgo)).
has('weight', lt(0.1)).
drop()
3.3 删除特定关系的边 #
gremlin
// 删除两个顶点之间的边
g.V('1').outE().where(inV().hasId('2')).drop()
// 删除特定类型的边
g.V('1').outE('knows').where(inV().hasId('2')).drop()
// 删除双向边
g.V('1').bothE('knows').where(otherV().hasId('2')).drop()
四、Gremlin删除属性 #
4.1 删除单个属性 #
gremlin
// 删除顶点属性
g.V('1').properties('age').drop()
// 删除边属性
g.E('e1').properties('weight').drop()
// 删除多个属性
g.V('1').properties('age', 'email').drop()
4.2 删除所有属性 #
gremlin
// 删除顶点所有属性
g.V('1').properties().drop()
// 删除边所有属性
g.E('e1').properties().drop()
4.3 删除多值属性 #
gremlin
// 删除特定值
g.V('1').properties('tags').hasValue('oldTag').drop()
// 删除所有值
g.V('1').properties('tags').drop()
4.4 条件删除属性 #
gremlin
// 条件删除
g.V().hasLabel('user').
properties('tempData').
drop()
// 删除过期的临时数据
g.V().properties('tempData').
has('expiresAt', lt(now)).
drop()
五、SPARQL删除 #
5.1 DELETE DATA #
sparql
PREFIX ex: <http://example.org/>
DELETE DATA {
ex:Tom ex:age 30 .
}
# 删除多个三元组
DELETE DATA {
ex:Tom ex:age 30 .
ex:Tom ex:status "active" .
}
# 删除关系
DELETE DATA {
ex:Tom foaf:knows ex:Jerry .
}
5.2 DELETE WHERE #
sparql
PREFIX ex: <http://example.org/>
# 删除匹配的三元组
DELETE WHERE {
?person ex:status "inactive" .
}
# 删除特定资源的所有三元组
DELETE WHERE {
ex:Tom ?p ?o .
}
# 条件删除
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE WHERE {
?person ex:lastLogin ?date .
FILTER (?date < "2020-01-01"^^xsd:date)
}
5.3 DELETE/INSERT #
sparql
PREFIX ex: <http://example.org/>
# 删除并记录
DELETE {
?person ex:status ?oldStatus .
}
INSERT {
?person ex:deletedAt "2024-01-01"^^xsd:date .
}
WHERE {
?person ex:status ?oldStatus .
?person ex:toBeDeleted true .
}
六、批量删除 #
6.1 Gremlin批量删除 #
gremlin
// 批量删除顶点
g.V().hasLabel('temp').drop().iterate()
// 批量删除边
g.E().hasLabel('temp').drop().iterate()
// 批量删除属性
g.V().properties('tempData').drop().iterate()
// 分批删除(避免超时)
g.V().hasLabel('log').limit(1000).drop().iterate()
6.2 SPARQL批量删除 #
sparql
PREFIX ex: <http://example.org/>
# 批量删除
DELETE WHERE {
?log a ex:Log .
?log ex:createdAt ?date .
FILTER (?date < "2023-01-01"^^xsd:date)
}
七、安全删除 #
7.1 软删除 #
gremlin
// 软删除(标记为已删除)
g.V('1').property('deleted', true).property('deletedAt', datetime())
// 查询时排除已删除
g.V().has('deleted', neq(true))
// 恢复软删除
g.V('1').properties('deleted').drop().properties('deletedAt').drop()
7.2 删除前检查 #
gremlin
// 检查是否存在
g.V('1').hasNext()
// 条件删除
g.V('1').filter(has('canDelete', true)).drop()
// 删除并验证
g.V('1').drop().iterate()
g.V('1').hasNext() // 应返回false
7.3 级联删除处理 #
gremlin
// 删除顶点前处理关联数据
g.V('1').as('v').
// 处理关联数据
out('owns').as('owned').
// 可以选择移动或删除
drop().
// 删除顶点
select('v').drop()
八、实际应用示例 #
8.1 删除用户 #
gremlin
// 软删除用户
g.V().has('userId', 'user_001').
property('deleted', true).
property('deletedAt', datetime()).
property('status', 'deleted')
// 硬删除用户
g.V().has('userId', 'user_001').drop()
// 删除用户及其数据
g.V().has('userId', 'user_001').as('user').
out('created').drop(). // 删除创建的内容
select('user').drop() // 删除用户
8.2 删除关系 #
gremlin
// 删除关注关系
g.V().has('userId', 'user_001').
outE('follows').where(inV().has('userId', 'user_002')).
drop()
// 删除所有关注
g.V().has('userId', 'user_001').outE('follows').drop()
// 删除双向好友关系
g.V().has('userId', 'user_001').as('a').
V().has('userId', 'user_002').as('b').
select('a').bothE('friends').where(otherV().as('b')).drop()
8.3 清理过期数据 #
gremlin
// 删除过期会话
g.V().hasLabel('session').
has('expiresAt', lt(datetime())).
drop()
// 删除旧日志
g.V().hasLabel('log').
has('createdAt', lt(thirtyDaysAgo)).
limit(1000).
drop().
iterate() // 分批删除
// 删除临时数据
g.V().has('temp', true).
has('createdAt', lt(oneDayAgo)).
drop()
8.4 删除测试数据 #
gremlin
// 删除所有测试数据
g.V().has('testData', true).drop()
// 删除特定标签的测试数据
g.V().hasLabel('test_user', 'test_product').drop()
// 清空图(谨慎使用)
g.V().drop()
九、删除性能优化 #
9.1 分批删除 #
gremlin
// 分批删除大量数据
for (int i = 0; i < 100; i++) {
g.V().hasLabel('log').limit(1000).drop().iterate()
}
9.2 使用iterate() #
gremlin
// 使用iterate()避免返回结果
g.V().hasLabel('temp').drop().iterate()
// 不使用iterate()会返回空结果
g.V().hasLabel('temp').drop() // 返回空列表
9.3 索引优化 #
gremlin
// 使用索引属性删除
g.V().has('userId', 'user_001').drop() // 快
// 避免全图扫描
g.V().has('name', 'Tom').drop() // 慢,如果没有索引
十、最佳实践 #
10.1 安全删除 #
text
安全删除建议:
├── 使用软删除保留数据
├── 删除前备份数据
├── 验证删除条件
├── 处理关联数据
└── 记录删除日志
10.2 性能优化 #
text
性能优化建议:
├── 分批删除大量数据
├── 使用索引属性
├── 使用iterate()
├── 避免高峰期删除
└── 监控删除性能
10.3 数据一致性 #
text
数据一致性建议:
├── 处理级联删除
├── 维护引用完整性
├── 更新相关缓存
├── 通知相关系统
└── 记录删除历史
十一、总结 #
删除数据要点:
| 操作 | Gremlin | SPARQL |
|---|---|---|
| 删除顶点 | V().drop() | DELETE WHERE |
| 删除边 | E().drop() | DELETE DATA |
| 删除属性 | properties().drop() | DELETE DATA |
| 条件删除 | has().drop() | DELETE WHERE |
| 批量删除 | limit().drop().iterate() | DELETE WHERE |
最佳实践:
- 使用软删除保留重要数据
- 分批删除大量数据
- 处理级联删除
- 使用索引加速删除
- 记录删除日志
下一步,让我们学习高级查询!
最后更新:2026-03-27