Fix edge cleanup when deleting entities to prevent orphaned relationships
- Track edges to delete in set - Clean VDB before node deletion - Remove from relation chunks storage - Prevent orphaned relationship data
This commit is contained in:
parent
3b48cf1643
commit
afb5e5c1cb
1 changed files with 32 additions and 2 deletions
|
|
@ -3334,6 +3334,7 @@ class LightRAG:
|
||||||
if entities_to_delete:
|
if entities_to_delete:
|
||||||
try:
|
try:
|
||||||
# Debug: Check and log all edges before deleting nodes
|
# Debug: Check and log all edges before deleting nodes
|
||||||
|
edges_to_delete = set()
|
||||||
edges_still_exist = 0
|
edges_still_exist = 0
|
||||||
for entity in entities_to_delete:
|
for entity in entities_to_delete:
|
||||||
edges = (
|
edges = (
|
||||||
|
|
@ -3343,6 +3344,10 @@ class LightRAG:
|
||||||
)
|
)
|
||||||
if edges:
|
if edges:
|
||||||
for src, tgt in edges:
|
for src, tgt in edges:
|
||||||
|
# Normalize edge representation (sorted for consistency)
|
||||||
|
edge_tuple = tuple(sorted((src, tgt)))
|
||||||
|
edges_to_delete.add(edge_tuple)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
src in entities_to_delete
|
src in entities_to_delete
|
||||||
and tgt in entities_to_delete
|
and tgt in entities_to_delete
|
||||||
|
|
@ -3356,7 +3361,7 @@ class LightRAG:
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"Edge still exists: {tgt} --> {src}"
|
f"Edge still exists: {src} <-- {tgt}"
|
||||||
)
|
)
|
||||||
edges_still_exist += 1
|
edges_still_exist += 1
|
||||||
if edges_still_exist:
|
if edges_still_exist:
|
||||||
|
|
@ -3364,7 +3369,32 @@ class LightRAG:
|
||||||
f"⚠️ {edges_still_exist} entities still has edges before deletion"
|
f"⚠️ {edges_still_exist} entities still has edges before deletion"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Delete from graph
|
# Clean residual edges from VDB and storage before deleting nodes
|
||||||
|
if edges_to_delete:
|
||||||
|
# Delete from relationships_vdb
|
||||||
|
rel_ids_to_delete = []
|
||||||
|
for src, tgt in edges_to_delete:
|
||||||
|
rel_ids_to_delete.extend(
|
||||||
|
[
|
||||||
|
compute_mdhash_id(src + tgt, prefix="rel-"),
|
||||||
|
compute_mdhash_id(tgt + src, prefix="rel-"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
await self.relationships_vdb.delete(rel_ids_to_delete)
|
||||||
|
|
||||||
|
# Delete from relation_chunks storage
|
||||||
|
if self.relation_chunks:
|
||||||
|
relation_storage_keys = [
|
||||||
|
make_relation_chunk_key(src, tgt)
|
||||||
|
for src, tgt in edges_to_delete
|
||||||
|
]
|
||||||
|
await self.relation_chunks.delete(relation_storage_keys)
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
f"Cleaned {len(edges_to_delete)} residual edges from VDB and chunk-tracking storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Delete from graph (edges will be auto-deleted with nodes)
|
||||||
await self.chunk_entity_relation_graph.remove_nodes(
|
await self.chunk_entity_relation_graph.remove_nodes(
|
||||||
list(entities_to_delete)
|
list(entities_to_delete)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue