Remove a node and all its connected edges
(&mut self, node_id: &str)
| 279 | |
| 280 | /// Remove a node and all its connected edges |
| 281 | pub fn remove_node(&mut self, node_id: &str) -> Result<Node, GraphError> { |
| 282 | let node = self |
| 283 | .nodes |
| 284 | .remove(node_id) |
| 285 | .ok_or_else(|| GraphError::NodeNotFound(node_id.to_string()))?; |
| 286 | |
| 287 | // Remove from label indices |
| 288 | for label in &node.labels { |
| 289 | if let Some(nodes) = self.node_labels.get_mut(label) { |
| 290 | nodes.retain(|id| id != node_id); |
| 291 | if nodes.is_empty() { |
| 292 | self.node_labels.remove(label); |
| 293 | } |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | // Collect all connected edges to remove |
| 298 | let mut edges_to_remove = Vec::new(); |
| 299 | if let Some(outgoing) = self.adjacency_out.get(node_id) { |
| 300 | edges_to_remove.extend(outgoing.clone()); |
| 301 | } |
| 302 | if let Some(incoming) = self.adjacency_in.get(node_id) { |
| 303 | edges_to_remove.extend(incoming.clone()); |
| 304 | } |
| 305 | |
| 306 | // Remove all connected edges |
| 307 | for edge_id in edges_to_remove { |
| 308 | let _ = self.remove_edge(&edge_id); |
| 309 | } |
| 310 | |
| 311 | // Remove adjacency lists |
| 312 | self.adjacency_out.remove(node_id); |
| 313 | self.adjacency_in.remove(node_id); |
| 314 | |
| 315 | Ok(node) |
| 316 | } |
| 317 | |
| 318 | /// Remove an edge |
| 319 | pub fn remove_edge(&mut self, edge_id: &str) -> Result<Edge, GraphError> { |
no test coverage detected