Skip to main content

vectorizer_sdk/client/
graph.rs

1//! Graph surface: nodes, edges, neighbours, paths, discovery.
2//!
3//! 10 methods covering the explicit-graph endpoints + the auto-
4//! discovery pipeline that infers `SIMILAR_TO` edges from vector
5//! distance.
6
7use super::VectorizerClient;
8use crate::error::{Result, VectorizerError};
9use crate::models::*;
10
11impl VectorizerClient {
12    /// List every node in a collection's graph.
13    pub async fn list_graph_nodes(&self, collection: &str) -> Result<ListNodesResponse> {
14        let url = format!("/graph/nodes/{collection}");
15        let response = self.make_request("GET", &url, None).await?;
16        serde_json::from_str(&response).map_err(|e| {
17            VectorizerError::server(format!("Failed to parse list nodes response: {e}"))
18        })
19    }
20
21    /// Get neighbours of a specific node.
22    pub async fn get_graph_neighbors(
23        &self,
24        collection: &str,
25        node_id: &str,
26    ) -> Result<GetNeighborsResponse> {
27        let url = format!("/graph/nodes/{collection}/{node_id}/neighbors");
28        let response = self.make_request("GET", &url, None).await?;
29        serde_json::from_str(&response).map_err(|e| {
30            VectorizerError::server(format!("Failed to parse neighbors response: {e}"))
31        })
32    }
33
34    /// Find related nodes within N hops.
35    pub async fn find_related_nodes(
36        &self,
37        collection: &str,
38        node_id: &str,
39        request: FindRelatedRequest,
40    ) -> Result<FindRelatedResponse> {
41        let url = format!("/graph/nodes/{collection}/{node_id}/related");
42        let payload = serde_json::to_value(&request).map_err(|e| {
43            VectorizerError::validation(format!("Failed to serialize request: {e}"))
44        })?;
45        let response = self.make_request("POST", &url, Some(payload)).await?;
46        serde_json::from_str(&response).map_err(|e| {
47            VectorizerError::server(format!("Failed to parse related nodes response: {e}"))
48        })
49    }
50
51    /// Find the shortest path between two nodes.
52    pub async fn find_graph_path(&self, request: FindPathRequest) -> Result<FindPathResponse> {
53        let payload = serde_json::to_value(&request).map_err(|e| {
54            VectorizerError::validation(format!("Failed to serialize request: {e}"))
55        })?;
56        let response = self
57            .make_request("POST", "/graph/path", Some(payload))
58            .await?;
59        serde_json::from_str(&response)
60            .map_err(|e| VectorizerError::server(format!("Failed to parse path response: {e}")))
61    }
62
63    /// Create an explicit edge between two nodes.
64    pub async fn create_graph_edge(
65        &self,
66        request: CreateEdgeRequest,
67    ) -> Result<CreateEdgeResponse> {
68        let payload = serde_json::to_value(&request).map_err(|e| {
69            VectorizerError::validation(format!("Failed to serialize request: {e}"))
70        })?;
71        let response = self
72            .make_request("POST", "/graph/edges", Some(payload))
73            .await?;
74        serde_json::from_str(&response).map_err(|e| {
75            VectorizerError::server(format!("Failed to parse create edge response: {e}"))
76        })
77    }
78
79    /// Delete an edge by id.
80    pub async fn delete_graph_edge(&self, edge_id: &str) -> Result<()> {
81        let url = format!("/graph/edges/{edge_id}");
82        self.make_request("DELETE", &url, None).await?;
83        Ok(())
84    }
85
86    /// List every edge in a collection.
87    pub async fn list_graph_edges(&self, collection: &str) -> Result<ListEdgesResponse> {
88        let url = format!("/graph/collections/{collection}/edges");
89        let response = self.make_request("GET", &url, None).await?;
90        serde_json::from_str(&response).map_err(|e| {
91            VectorizerError::server(format!("Failed to parse list edges response: {e}"))
92        })
93    }
94
95    /// Discover SIMILAR_TO edges for an entire collection.
96    pub async fn discover_graph_edges(
97        &self,
98        collection: &str,
99        request: DiscoverEdgesRequest,
100    ) -> Result<DiscoverEdgesResponse> {
101        let url = format!("/graph/discover/{collection}");
102        let payload = serde_json::to_value(&request).map_err(|e| {
103            VectorizerError::validation(format!("Failed to serialize request: {e}"))
104        })?;
105        let response = self.make_request("POST", &url, Some(payload)).await?;
106        serde_json::from_str(&response).map_err(|e| {
107            VectorizerError::server(format!("Failed to parse discover edges response: {e}"))
108        })
109    }
110
111    /// Discover SIMILAR_TO edges for one specific node.
112    pub async fn discover_graph_edges_for_node(
113        &self,
114        collection: &str,
115        node_id: &str,
116        request: DiscoverEdgesRequest,
117    ) -> Result<DiscoverEdgesResponse> {
118        let url = format!("/graph/discover/{collection}/{node_id}");
119        let payload = serde_json::to_value(&request).map_err(|e| {
120            VectorizerError::validation(format!("Failed to serialize request: {e}"))
121        })?;
122        let response = self.make_request("POST", &url, Some(payload)).await?;
123        serde_json::from_str(&response).map_err(|e| {
124            VectorizerError::server(format!("Failed to parse discover edges response: {e}"))
125        })
126    }
127
128    /// Get discovery status for a collection.
129    pub async fn get_graph_discovery_status(
130        &self,
131        collection: &str,
132    ) -> Result<DiscoveryStatusResponse> {
133        let url = format!("/graph/discover/{collection}/status");
134        let response = self.make_request("GET", &url, None).await?;
135        serde_json::from_str(&response).map_err(|e| {
136            VectorizerError::server(format!("Failed to parse discovery status response: {e}"))
137        })
138    }
139}