Optimize entity deletion by batching edge queries to avoid N+1 problem

• Add batch get_nodes_edges_batch call
• Remove individual get_node_edges calls
• Improve query performance
This commit is contained in:
yangdx 2025-11-06 21:34:47 +08:00
parent 678e17bb5c
commit 04ed709b34

View file

@ -3333,15 +3333,16 @@ class LightRAG:
# 7. Delete entities that have no remaining sources # 7. Delete entities that have no remaining sources
if entities_to_delete: if entities_to_delete:
try: try:
# Batch get all edges for entities to avoid N+1 query problem
nodes_edges_dict = await self.chunk_entity_relation_graph.get_nodes_edges_batch(
list(entities_to_delete)
)
# Debug: Check and log all edges before deleting nodes # Debug: Check and log all edges before deleting nodes
edges_to_delete = set() edges_to_delete = set()
edges_still_exist = 0 edges_still_exist = 0
for entity in entities_to_delete:
edges = ( for entity, edges in nodes_edges_dict.items():
await self.chunk_entity_relation_graph.get_node_edges(
entity
)
)
if edges: if edges:
for src, tgt in edges: for src, tgt in edges:
# Normalize edge representation (sorted for consistency) # Normalize edge representation (sorted for consistency)
@ -3364,6 +3365,7 @@ class LightRAG:
f"Edge still exists: {src} <-- {tgt}" f"Edge still exists: {src} <-- {tgt}"
) )
edges_still_exist += 1 edges_still_exist += 1
if edges_still_exist: if edges_still_exist:
logger.warning( logger.warning(
f"⚠️ {edges_still_exist} entities still has edges before deletion" f"⚠️ {edges_still_exist} entities still has edges before deletion"