pub struct GraphDB { /* private fields */ }Expand description
High-performance graph database with concurrent access
Implementations§
Source§impl GraphDB
impl GraphDB
Sourcepub fn with_storage<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn with_storage<P: AsRef<Path>>(path: P) -> Result<Self>
Create a new graph database with persistent storage
Sourcepub fn create_node(&self, node: Node) -> Result<NodeId>
pub fn create_node(&self, node: Node) -> Result<NodeId>
Create a node
Sourcepub fn with_node<R>(&self, id: &str, f: impl FnOnce(&Node) -> R) -> Option<R>
pub fn with_node<R>(&self, id: &str, f: impl FnOnce(&Node) -> R) -> Option<R>
Borrow a node and apply f without cloning it.
Hot-path accessor for scans that only need to read a node (e.g. vector
scoring). Avoids the full Node + embedding clone that get_node
incurs. Returns None if the node is absent.
Sourcepub fn node_ids_by_label(&self, label: &str) -> Vec<NodeId> ⓘ
pub fn node_ids_by_label(&self, label: &str) -> Vec<NodeId> ⓘ
Node ids carrying label, straight from the label index (no node clones).
Sourcepub fn update_node<F>(&self, id: impl AsRef<str>, f: F) -> Result<bool>
pub fn update_node<F>(&self, id: impl AsRef<str>, f: F) -> Result<bool>
Atomically update an existing node.
Applies f to a clone of the current node, persists the new value, and
refreshes the label and property indexes. Concurrent updates to the same
node are serialized, so one update cannot silently overwrite another.
The node ID is immutable and changing it returns a constraint error.
Returns Ok(false) if the node was not found (no error), Ok(true) if
updated successfully. This is the counterpart to create_node and
enables SUPERSEDES-style versioning where a prior node is marked
deprecated without deleting it.
§Example
graph.update_node(&node_id, |n| {
n.set_property("status", PropertyValue::from("deprecated"));
n.set_property("deprecated_at", PropertyValue::from(now_iso8601));
})?;The callback runs while the node’s map shard is write-locked. It must
not call back into this GraphDB, because doing so may deadlock.
Sourcepub fn keyword_search(
&self,
label: &str,
text_field: &str,
query: &str,
k: usize,
) -> Result<Vec<(NodeId, f32)>>
pub fn keyword_search( &self, label: &str, text_field: &str, query: &str, k: usize, ) -> Result<Vec<(NodeId, f32)>>
Keyword (BM25) search over a node text property.
Builds a transient Bm25Index from the text_field property of all
nodes carrying label, and returns the top-k node IDs by BM25 score.
This is the keyword arm of hybrid search — pair with vector ANN for
reciprocal rank fusion.
For large graphs, build the index once and reuse it; this method rebuilds on every call (suitable for small-to-medium graphs or one-shot queries). A cached variant can be added behind a feature flag if needed.
§Example
let hits = graph.keyword_search("Memory", "content", "vector search", 10)?;Sourcepub fn get_nodes_by_label(&self, label: &str) -> Vec<Node>
pub fn get_nodes_by_label(&self, label: &str) -> Vec<Node>
Get nodes by label
Sourcepub fn get_nodes_by_property(
&self,
key: &str,
value: &PropertyValue,
) -> Vec<Node>
pub fn get_nodes_by_property( &self, key: &str, value: &PropertyValue, ) -> Vec<Node>
Get nodes by property
Sourcepub fn create_edge(&self, edge: Edge) -> Result<EdgeId>
pub fn create_edge(&self, edge: Edge) -> Result<EdgeId>
Create an edge
Sourcepub fn delete_edges_batch(&self, ids: &[impl AsRef<str>]) -> Result<usize>
pub fn delete_edges_batch(&self, ids: &[impl AsRef<str>]) -> Result<usize>
Delete multiple edges (batch)
Sourcepub fn get_edges_by_type(&self, edge_type: &str) -> Vec<Edge>
pub fn get_edges_by_type(&self, edge_type: &str) -> Vec<Edge>
Get edges by type
Sourcepub fn get_outgoing_edges(&self, node_id: &NodeId) -> Vec<Edge>
pub fn get_outgoing_edges(&self, node_id: &NodeId) -> Vec<Edge>
Get outgoing edges from a node
Sourcepub fn get_incoming_edges(&self, node_id: &NodeId) -> Vec<Edge>
pub fn get_incoming_edges(&self, node_id: &NodeId) -> Vec<Edge>
Get incoming edges to a node
Sourcepub fn has_edge(&self, from: &NodeId, to: &NodeId, edge_type: &str) -> bool
pub fn has_edge(&self, from: &NodeId, to: &NodeId, edge_type: &str) -> bool
Checks whether an edge exists from from → to with type edge_type.
Returns true if found, false otherwise.
Fast path: avoids cloning Edge by reading fields through the DashMap
reference guard and short-circuits on first match.
Sourcepub fn get_edges_for_nodes(&self, node_ids: &[NodeId]) -> Vec<Edge>
pub fn get_edges_for_nodes(&self, node_ids: &[NodeId]) -> Vec<Edge>
Get outgoing edges for multiple nodes in one call (O(k×avg_degree) vs O(E) for full scan).
Sourcepub fn create_hyperedge(&self, hyperedge: Hyperedge) -> Result<HyperedgeId>
pub fn create_hyperedge(&self, hyperedge: Hyperedge) -> Result<HyperedgeId>
Create a hyperedge
Sourcepub fn get_hyperedge(&self, id: &HyperedgeId) -> Option<Hyperedge>
pub fn get_hyperedge(&self, id: &HyperedgeId) -> Option<Hyperedge>
Get a hyperedge by ID
Sourcepub fn get_hyperedges_by_node(&self, node_id: &NodeId) -> Vec<Hyperedge>
pub fn get_hyperedges_by_node(&self, node_id: &NodeId) -> Vec<Hyperedge>
Get hyperedges containing a node
Sourcepub fn delete_hyperedge(&self, id: &HyperedgeId) -> Result<bool>
pub fn delete_hyperedge(&self, id: &HyperedgeId) -> Result<bool>
Delete a hyperedge by ID
Sourcepub fn delete_hyperedges_by_node(&self, node_id: &NodeId) -> Result<usize>
pub fn delete_hyperedges_by_node(&self, node_id: &NodeId) -> Result<usize>
Delete all hyperedges that contain a given node
Sourcepub fn node_count(&self) -> usize
pub fn node_count(&self) -> usize
Get the number of nodes
Sourcepub fn edge_count(&self) -> usize
pub fn edge_count(&self) -> usize
Get the number of edges
Sourcepub fn hyperedge_count(&self) -> usize
pub fn hyperedge_count(&self) -> usize
Get the number of hyperedges
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for GraphDB
impl !UnwindSafe for GraphDB
impl Freeze for GraphDB
impl Send for GraphDB
impl Sync for GraphDB
impl Unpin for GraphDB
impl UnsafeUnpin for GraphDB
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request