删除数据 #

一、删除概述 #

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

最佳实践:

  1. 使用软删除保留重要数据
  2. 分批删除大量数据
  3. 处理级联删除
  4. 使用索引加速删除
  5. 记录删除日志

下一步,让我们学习高级查询!

最后更新:2026-03-27