Skip to main content

khive_storage/
graph.rs

1//! Graph storage capability — edge CRUD and traversal.
2
3use async_trait::async_trait;
4use uuid::Uuid;
5
6use crate::types::{
7    BatchWriteSummary, DeleteMode, Edge, EdgeFilter, EdgeSortField, GraphPath, LinkId, NeighborHit,
8    NeighborQuery, Page, PageRequest, SortOrder, StorageResult, TraversalRequest,
9};
10
11/// Directed edge CRUD and graph traversal over the knowledge graph.
12#[async_trait]
13pub trait GraphStore: Send + Sync + 'static {
14    /// Insert or update a single edge.
15    async fn upsert_edge(&self, edge: Edge) -> StorageResult<()>;
16    /// Insert or update a batch of edges.
17    async fn upsert_edges(&self, edges: Vec<Edge>) -> StorageResult<BatchWriteSummary>;
18    /// Fetch an edge by link ID, returning `None` if absent.
19    async fn get_edge(&self, id: LinkId) -> StorageResult<Option<Edge>>;
20    /// Delete an edge by link ID using the specified delete mode.
21    async fn delete_edge(&self, id: LinkId, mode: DeleteMode) -> StorageResult<bool>;
22    /// Query edges with filter, sort, and pagination.
23    async fn query_edges(
24        &self,
25        filter: EdgeFilter,
26        sort: Vec<SortOrder<EdgeSortField>>,
27        page: PageRequest,
28    ) -> StorageResult<Page<Edge>>;
29    /// Count edges matching the given filter.
30    async fn count_edges(&self, filter: EdgeFilter) -> StorageResult<u64>;
31    /// Return immediate neighbors of a graph node.
32    async fn neighbors(
33        &self,
34        node_id: Uuid,
35        query: NeighborQuery,
36    ) -> StorageResult<Vec<NeighborHit>>;
37    /// Multi-hop BFS traversal from the given roots.
38    async fn traverse(&self, request: TraversalRequest) -> StorageResult<Vec<GraphPath>>;
39}