From afb5e5c1cb2221f26a22188faa470406d481b1a5 Mon Sep 17 00:00:00 2001 From: yangdx Date: Fri, 31 Oct 2025 02:36:15 +0800 Subject: [PATCH] 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 --- lightrag/lightrag.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/lightrag/lightrag.py b/lightrag/lightrag.py index 8453940b..af2067d8 100644 --- a/lightrag/lightrag.py +++ b/lightrag/lightrag.py @@ -3334,6 +3334,7 @@ class LightRAG: if entities_to_delete: try: # Debug: Check and log all edges before deleting nodes + edges_to_delete = set() edges_still_exist = 0 for entity in entities_to_delete: edges = ( @@ -3343,6 +3344,10 @@ class LightRAG: ) if 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 ( src in entities_to_delete and tgt in entities_to_delete @@ -3356,7 +3361,7 @@ class LightRAG: ) else: logger.warning( - f"Edge still exists: {tgt} --> {src}" + f"Edge still exists: {src} <-- {tgt}" ) edges_still_exist += 1 if edges_still_exist: @@ -3364,7 +3369,32 @@ class LightRAG: 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( list(entities_to_delete) )