| 247 | } |
| 248 | |
| 249 | fn del_kg_node(&mut self, id: &str) -> PristineResult<bool> { |
| 250 | // First delete all edges for this node |
| 251 | self.del_kg_edges_for_node(id)?; |
| 252 | |
| 253 | // Delete the node |
| 254 | let mut table = match self.txn.open_table(KG_NODES) { |
| 255 | Ok(t) => t, |
| 256 | Err(redb::TableError::TableDoesNotExist(_)) => return Ok(false), |
| 257 | Err(e) => return Err(PristineError::from(e)), |
| 258 | }; |
| 259 | |
| 260 | // Note: orphan FTS entries are harmless — get_kg_node returns None for |
| 261 | // deleted nodes so they're filtered out at query time. A full reindex |
| 262 | // cleans them up. |
| 263 | |
| 264 | let result = table.remove(id)?.is_some(); |
| 265 | drop(table); |
| 266 | Ok(result) |
| 267 | } |
| 268 | |
| 269 | fn del_kg_edge(&mut self, from_id: &str, to_id: &str, kind: &str) -> PristineResult<bool> { |
| 270 | let edge_key = encode_edge_key(from_id, to_id, kind); |