pub struct PersistentGraph { /* private fields */ }Expand description
Persistent graph backed by LanceDB datasets.
All operations go through the PhysicalStore trait, so the graph
works identically with local Lance files or remote S3-backed brains.
Implementations§
Source§impl PersistentGraph
impl PersistentGraph
Sourcepub fn new(storage: Arc<dyn PhysicalStore>) -> Self
pub fn new(storage: Arc<dyn PhysicalStore>) -> Self
Create a persistent graph handle without async index setup.
Use this when constructing HirnDB synchronously. Call
ensure_indices() later (e.g. on first
async operation) if you need index guarantees.
Sourcepub async fn open(storage: Arc<dyn PhysicalStore>) -> HirnResult<Self>
pub async fn open(storage: Arc<dyn PhysicalStore>) -> HirnResult<Self>
Open or create a persistent graph on the given storage backend.
On first open, creates the graph_nodes and graph_edges datasets
with appropriate indices.
Sourcepub async fn add_node(
&self,
id: MemoryId,
layer: Layer,
importance: f32,
created_at: Timestamp,
namespace: Namespace,
) -> HirnResult<bool>
pub async fn add_node( &self, id: MemoryId, layer: Layer, importance: f32, created_at: Timestamp, namespace: Namespace, ) -> HirnResult<bool>
Add or update a node in the graph.
Sourcepub async fn add_nodes(&self, nodes: &[GraphNodeData]) -> HirnResult<()>
pub async fn add_nodes(&self, nodes: &[GraphNodeData]) -> HirnResult<()>
Add or update multiple nodes in the graph with one storage write.
Sourcepub async fn get_node(&self, id: MemoryId) -> HirnResult<Option<GraphNodeData>>
pub async fn get_node(&self, id: MemoryId) -> HirnResult<Option<GraphNodeData>>
Retrieve a node by ID.
Sourcepub async fn update_node(&self, node: GraphNodeData) -> HirnResult<()>
pub async fn update_node(&self, node: GraphNodeData) -> HirnResult<()>
Update node metadata (importance, etc.) via merge-insert.
Sourcepub async fn flush_access_counts(
&self,
dirty: &[(MemoryId, u64)],
) -> HirnResult<()>
pub async fn flush_access_counts( &self, dirty: &[(MemoryId, u64)], ) -> HirnResult<()>
Bulk-update access_count for a batch of nodes in the cold-tier Lance dataset.
Called periodically by CachedGraphStore::flush_hot_access_counts() to
persist the hot-tier access counts to Lance without issuing one merge-insert
per node. Uses a CASE expression to update all rows in a single pass.
Silently skips when dirty is empty or the dataset does not yet exist.
Sourcepub async fn remove_node(&self, id: MemoryId) -> HirnResult<bool>
pub async fn remove_node(&self, id: MemoryId) -> HirnResult<bool>
Remove a node and all its edges.
Sourcepub async fn expire_node_edges(
&self,
node_id: MemoryId,
expiry: Timestamp,
) -> HirnResult<()>
pub async fn expire_node_edges( &self, node_id: MemoryId, expiry: Timestamp, ) -> HirnResult<()>
Set valid_until_ms on all Lance edges whose source or target is
node_id, recording the bi-temporal expiry timestamp.
This soft-deletes the edges from live traversal (which filters on
valid_until_ms IS NULL OR valid_until_ms > now()) while keeping them
readable for AS OF time-travel queries.
Sourcepub async fn has_node(&self, id: MemoryId) -> HirnResult<bool>
pub async fn has_node(&self, id: MemoryId) -> HirnResult<bool>
Check if a node exists.
Sourcepub async fn node_count(&self) -> HirnResult<u64>
pub async fn node_count(&self) -> HirnResult<u64>
Count all nodes.
Sourcepub async fn node_ids(&self) -> HirnResult<Vec<MemoryId>>
pub async fn node_ids(&self) -> HirnResult<Vec<MemoryId>>
Get all node IDs.
Sourcepub async fn nodes_by_layer(
&self,
layer: Layer,
) -> HirnResult<Vec<GraphNodeData>>
pub async fn nodes_by_layer( &self, layer: Layer, ) -> HirnResult<Vec<GraphNodeData>>
Filter nodes by layer.
Sourcepub async fn nodes_by_namespace(
&self,
ns: &Namespace,
) -> HirnResult<Vec<GraphNodeData>>
pub async fn nodes_by_namespace( &self, ns: &Namespace, ) -> HirnResult<Vec<GraphNodeData>>
Filter nodes by namespace.
Sourcepub async fn node_importance(&self, id: MemoryId) -> HirnResult<Option<f32>>
pub async fn node_importance(&self, id: MemoryId) -> HirnResult<Option<f32>>
Get node importance.
Sourcepub async fn set_node_importance(
&self,
id: MemoryId,
importance: f32,
) -> HirnResult<()>
pub async fn set_node_importance( &self, id: MemoryId, importance: f32, ) -> HirnResult<()>
Set node importance.
Sourcepub async fn add_edge(
&self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
) -> HirnResult<EdgeId>
pub async fn add_edge( &self, source: MemoryId, target: MemoryId, relation: EdgeRelation, weight: f32, metadata: Metadata, ) -> HirnResult<EdgeId>
Add a directed edge. Returns the edge ID.
Enforces MAX_EDGES_PER_NODE fan-out cap and prevents duplicate
edges with the same (source, target, relation) triple.
For bidirectional relations (RelatedTo, Contradicts, SimilarTo),
the reverse edge is automatically created so graph traversal works
symmetrically from either endpoint.
Sourcepub async fn add_causal_edge(
&self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
causal: CausalEdgeData,
) -> HirnResult<EdgeId>
pub async fn add_causal_edge( &self, source: MemoryId, target: MemoryId, relation: EdgeRelation, weight: f32, metadata: Metadata, causal: CausalEdgeData, ) -> HirnResult<EdgeId>
Create a causal edge with associated [CausalEdgeData] on the cold tier.
Populates strength, confidence, evidence_count, and mechanism
on the stored edge. Bidirectional relations get an automatic reverse
edge that shares the same causal data.
Sourcepub async fn get_edges_from(
&self,
source: MemoryId,
) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_from( &self, source: MemoryId, ) -> HirnResult<Vec<GraphEdge>>
Get all edges originating from a node.
Sourcepub async fn get_edges_to(&self, target: MemoryId) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_to(&self, target: MemoryId) -> HirnResult<Vec<GraphEdge>>
Get all edges pointing to a node.
Sourcepub async fn get_edges(&self, node_id: MemoryId) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges(&self, node_id: MemoryId) -> HirnResult<Vec<GraphEdge>>
Get all edges from/to a node.
Sourcepub async fn get_edges_between(
&self,
a: MemoryId,
b: MemoryId,
) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_between( &self, a: MemoryId, b: MemoryId, ) -> HirnResult<Vec<GraphEdge>>
Get edges between two nodes (both directions).
Sourcepub async fn get_edges_of_type(
&self,
node_id: MemoryId,
relation: EdgeRelation,
) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_of_type( &self, node_id: MemoryId, relation: EdgeRelation, ) -> HirnResult<Vec<GraphEdge>>
Get edges of a specific type from a node.
Sourcepub async fn update_edge_weight(
&self,
edge_id: EdgeId,
new_weight: f32,
co_retrieval_count: Option<u64>,
) -> HirnResult<()>
pub async fn update_edge_weight( &self, edge_id: EdgeId, new_weight: f32, co_retrieval_count: Option<u64>, ) -> HirnResult<()>
Update edge weight via merge-insert.
Sourcepub async fn get_edges_by_ids(
&self,
edge_ids: &[EdgeId],
) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_by_ids( &self, edge_ids: &[EdgeId], ) -> HirnResult<Vec<GraphEdge>>
Get a batch of edges by ID in a single scan.
Sourcepub async fn get_edges_for_nodes(
&self,
node_ids: &[MemoryId],
) -> HirnResult<Vec<GraphEdge>>
pub async fn get_edges_for_nodes( &self, node_ids: &[MemoryId], ) -> HirnResult<Vec<GraphEdge>>
Get all edges incident to any of the provided nodes in a single scan.
Sourcepub async fn get_edge(&self, edge_id: EdgeId) -> HirnResult<Option<GraphEdge>>
pub async fn get_edge(&self, edge_id: EdgeId) -> HirnResult<Option<GraphEdge>>
Get a single edge by ID.
Sourcepub async fn remove_edge(&self, edge_id: EdgeId) -> HirnResult<()>
pub async fn remove_edge(&self, edge_id: EdgeId) -> HirnResult<()>
Remove a single edge by ID.
Sourcepub async fn edge_count(&self) -> HirnResult<u64>
pub async fn edge_count(&self) -> HirnResult<u64>
Count currently-active (non-expired) edges.
Excludes edges whose valid_until_ms has been set (soft-expired),
consistent with the hot-tier PropertyGraph::edge_count() which filters
by is_currently_active().
Sourcepub async fn add_edges(&self, edges: &[GraphEdge]) -> HirnResult<()>
pub async fn add_edges(&self, edges: &[GraphEdge]) -> HirnResult<()>
Batch add edges.
Sourcepub async fn upsert_edges(&self, edges: &[GraphEdge]) -> HirnResult<()>
pub async fn upsert_edges(&self, edges: &[GraphEdge]) -> HirnResult<()>
Batch upsert edges by ID.
Sourcepub async fn outgoing_weighted(
&self,
node_id: MemoryId,
) -> HirnResult<Vec<(MemoryId, f32, EdgeRelation)>>
pub async fn outgoing_weighted( &self, node_id: MemoryId, ) -> HirnResult<Vec<(MemoryId, f32, EdgeRelation)>>
Get outgoing weighted edges for spreading activation. Returns (target_id, weight, relation) for each outgoing edge.
pub async fn batch_adjacency_read( &self, frontier: &[MemoryId], ) -> HirnResult<Vec<GraphEdge>>
Sourcepub async fn batch_adjacency_read_scoped(
&self,
frontier: &[MemoryId],
allowed_namespaces: Option<&[Namespace]>,
) -> HirnResult<Vec<GraphEdge>>
pub async fn batch_adjacency_read_scoped( &self, frontier: &[MemoryId], allowed_namespaces: Option<&[Namespace]>, ) -> HirnResult<Vec<GraphEdge>>
Batch adjacency read: fetch all outgoing edges for a set of frontier
nodes in a single scan using an IN (...) predicate.
Replaces O(frontier) individual get_edges_from() calls with a
single scan that uses the bitmap index on graph_edges.source.
Sourcepub async fn batch_adjacency_read_filtered(
&self,
frontier: &[MemoryId],
relation: EdgeRelation,
) -> HirnResult<Vec<GraphEdge>>
pub async fn batch_adjacency_read_filtered( &self, frontier: &[MemoryId], relation: EdgeRelation, ) -> HirnResult<Vec<GraphEdge>>
Batch adjacency read with a relation type filter.
Same as Self::batch_adjacency_read but additionally filters edges by
relation type, enabling efficient traversal of specific edge kinds
(e.g., causal chains).
Sourcepub async fn batch_adjacency_read_filtered_scoped(
&self,
frontier: &[MemoryId],
relation: EdgeRelation,
allowed_namespaces: Option<&[Namespace]>,
) -> HirnResult<Vec<GraphEdge>>
pub async fn batch_adjacency_read_filtered_scoped( &self, frontier: &[MemoryId], relation: EdgeRelation, allowed_namespaces: Option<&[Namespace]>, ) -> HirnResult<Vec<GraphEdge>>
Batch adjacency read with relation and namespace filters.
Sourcepub async fn batch_bfs(
&self,
start_ids: &[MemoryId],
max_depth: usize,
) -> HirnResult<BfsResult>
pub async fn batch_bfs( &self, start_ids: &[MemoryId], max_depth: usize, ) -> HirnResult<BfsResult>
Batch BFS using batch adjacency reads.
Performs breadth-first search starting from start_ids, expanding
the frontier at each depth level with a single batch scan. Total
number of scans = max_depth (not frontier_size × depth).
Returns a BfsResult containing edges at each depth level and
all visited node IDs.
Sourcepub async fn batch_bfs_filtered(
&self,
start_ids: &[MemoryId],
max_depth: usize,
relation: Option<EdgeRelation>,
) -> HirnResult<BfsResult>
pub async fn batch_bfs_filtered( &self, start_ids: &[MemoryId], max_depth: usize, relation: Option<EdgeRelation>, ) -> HirnResult<BfsResult>
Batch BFS with optional relation type filter.
Sourcepub async fn batch_bfs_filtered_scoped(
&self,
start_ids: &[MemoryId],
max_depth: usize,
relation: Option<EdgeRelation>,
allowed_namespaces: Option<&[Namespace]>,
) -> HirnResult<BfsResult>
pub async fn batch_bfs_filtered_scoped( &self, start_ids: &[MemoryId], max_depth: usize, relation: Option<EdgeRelation>, allowed_namespaces: Option<&[Namespace]>, ) -> HirnResult<BfsResult>
Batch BFS with optional relation and namespace filters.
Sourcepub async fn deep_causal_bfs(
&self,
start_ids: &[MemoryId],
max_depth: usize,
confidence_threshold: f32,
relation: EdgeRelation,
allowed_namespaces: Option<&[Namespace]>,
) -> HirnResult<Vec<CausalBfsRow>>
pub async fn deep_causal_bfs( &self, start_ids: &[MemoryId], max_depth: usize, confidence_threshold: f32, relation: EdgeRelation, allowed_namespaces: Option<&[Namespace]>, ) -> HirnResult<Vec<CausalBfsRow>>
Deep causal BFS on the cold (Lance) tier.
Performs batched breadth-first search following only edges of the given
relation type, pruning edges below confidence_threshold and outside
allowed_namespaces. Returns a flat list of CausalBfsRow records
suitable for converting to Arrow RecordBatch.
This is the cold-tier counterpart of CausalChainExec’s in-memory DFS.
Each row represents one edge in a causal chain, tagged with a chain_id,
depth, and the chain’s composite score.
Complexity: one Lance scan per depth level (not per node).
Sourcepub async fn get_neighbors(
&self,
start: MemoryId,
max_depth: usize,
min_weight: f32,
) -> HirnResult<Vec<MemoryId>>
pub async fn get_neighbors( &self, start: MemoryId, max_depth: usize, min_weight: f32, ) -> HirnResult<Vec<MemoryId>>
BFS neighbor traversal.
Sourcepub async fn get_neighbors_filtered(
&self,
start: MemoryId,
max_depth: usize,
min_weight: f32,
namespace: Option<&Namespace>,
) -> HirnResult<Vec<MemoryId>>
pub async fn get_neighbors_filtered( &self, start: MemoryId, max_depth: usize, min_weight: f32, namespace: Option<&Namespace>, ) -> HirnResult<Vec<MemoryId>>
BFS neighbor traversal with optional namespace filter.
Uses batch adjacency reads: one scan per depth level instead of one scan per frontier node.
Sourcepub async fn shortest_path(
&self,
source: MemoryId,
target: MemoryId,
) -> HirnResult<Option<Vec<MemoryId>>>
pub async fn shortest_path( &self, source: MemoryId, target: MemoryId, ) -> HirnResult<Option<Vec<MemoryId>>>
Shortest path between two nodes (BFS, unweighted).
Uses batch adjacency reads: one scan per depth level.
Sourcepub async fn subgraph(
&self,
node_ids: &[MemoryId],
) -> HirnResult<Vec<GraphEdge>>
pub async fn subgraph( &self, node_ids: &[MemoryId], ) -> HirnResult<Vec<GraphEdge>>
Extract subgraph: return all edges between the given node set.
Uses batch adjacency read to fetch all outgoing edges in one scan, then filters to edges whose target is also in the node set.
Sourcepub async fn degree_centrality(&self) -> HirnResult<HashMap<MemoryId, usize>>
pub async fn degree_centrality(&self) -> HirnResult<HashMap<MemoryId, usize>>
Degree centrality: count of edges per node.
Sourcepub async fn path_exists_via(
&self,
source: MemoryId,
target: MemoryId,
allowed_relations: &[EdgeRelation],
) -> HirnResult<bool>
pub async fn path_exists_via( &self, source: MemoryId, target: MemoryId, allowed_relations: &[EdgeRelation], ) -> HirnResult<bool>
Check if a path exists between two nodes via specific edge types.
Uses batch adjacency reads with relation filter.
Sourcepub async fn node_layer(&self, id: MemoryId) -> HirnResult<Option<Layer>>
pub async fn node_layer(&self, id: MemoryId) -> HirnResult<Option<Layer>>
Get the layer of a node.
Sourcepub async fn node_namespace(
&self,
id: MemoryId,
) -> HirnResult<Option<Namespace>>
pub async fn node_namespace( &self, id: MemoryId, ) -> HirnResult<Option<Namespace>>
Get the namespace of a node.
Sourcepub async fn all_edges(&self) -> HirnResult<Vec<GraphEdge>>
pub async fn all_edges(&self) -> HirnResult<Vec<GraphEdge>>
Get all edges in the graph.
Sourcepub async fn namespaces_compatible(
&self,
a: MemoryId,
b: MemoryId,
) -> HirnResult<bool>
pub async fn namespaces_compatible( &self, a: MemoryId, b: MemoryId, ) -> HirnResult<bool>
Check if two nodes’ namespaces are compatible for auto-edge creation. Compatible means: same namespace, or either is “shared”.
Trait Implementations§
Source§impl GraphStore for PersistentGraph
impl GraphStore for PersistentGraph
Source§fn add_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
layer: Layer,
importance: f32,
created_at: Timestamp,
namespace: Namespace,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
layer: Layer,
importance: f32,
created_at: Timestamp,
namespace: Namespace,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
true if newly inserted, false if it
already existed.Source§fn remove_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn remove_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
true if the node
existed.Source§fn has_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn has_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<GraphNodeData>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_node<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<GraphNodeData>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
None if absent.Source§fn node_ids<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn node_ids<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn node_importance<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<f32>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn node_importance<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<f32>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn set_node_importance<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
importance: f32,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn set_node_importance<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
importance: f32,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn node_layer<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Layer>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn node_layer<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Layer>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn node_namespace<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Namespace>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn node_namespace<'life0, 'async_trait>(
&'life0 self,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Namespace>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn namespaces_compatible<'life0, 'async_trait>(
&'life0 self,
a: MemoryId,
b: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn namespaces_compatible<'life0, 'async_trait>(
&'life0 self,
a: MemoryId,
b: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn add_edge<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
) -> Pin<Box<dyn Future<Output = HirnResult<EdgeId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add_edge<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
) -> Pin<Box<dyn Future<Output = HirnResult<EdgeId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn add_causal_edge<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
causal: CausalEdgeData,
) -> Pin<Box<dyn Future<Output = HirnResult<EdgeId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add_causal_edge<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
causal: CausalEdgeData,
) -> Pin<Box<dyn Future<Output = HirnResult<EdgeId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
CausalEdgeData. Read moreSource§fn remove_edge<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn remove_edge<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_edge<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_edge<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_edges<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_edges<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_edges_between<'life0, 'async_trait>(
&'life0 self,
a: MemoryId,
b: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_edges_between<'life0, 'async_trait>(
&'life0 self,
a: MemoryId,
b: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_edges_of_type<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
relation: EdgeRelation,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_edges_of_type<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
relation: EdgeRelation,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn all_edges<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn all_edges<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<GraphEdge>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn update_edge_weight<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
new_weight: f32,
co_retrieval_count: Option<u64>,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update_edge_weight<'life0, 'async_trait>(
&'life0 self,
edge_id: EdgeId,
new_weight: f32,
co_retrieval_count: Option<u64>,
) -> Pin<Box<dyn Future<Output = HirnResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_neighbors<'life0, 'async_trait>(
&'life0 self,
start: MemoryId,
depth: usize,
min_weight: f32,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_neighbors<'life0, 'async_trait>(
&'life0 self,
start: MemoryId,
depth: usize,
min_weight: f32,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
depth hops, filtering by minimum edge weight.Source§fn get_neighbors_filtered<'life0, 'life1, 'async_trait>(
&'life0 self,
start: MemoryId,
depth: usize,
min_weight: f32,
namespace: Option<&'life1 Namespace>,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_neighbors_filtered<'life0, 'life1, 'async_trait>(
&'life0 self,
start: MemoryId,
depth: usize,
min_weight: f32,
namespace: Option<&'life1 Namespace>,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<MemoryId>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn outgoing_weighted<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<(MemoryId, f32, EdgeRelation)>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn outgoing_weighted<'life0, 'async_trait>(
&'life0 self,
node_id: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Vec<(MemoryId, f32, EdgeRelation)>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
(target, weight, relation) tuples.Source§fn shortest_path<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Vec<MemoryId>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn shortest_path<'life0, 'async_trait>(
&'life0 self,
source: MemoryId,
target: MemoryId,
) -> Pin<Box<dyn Future<Output = HirnResult<Option<Vec<MemoryId>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
None if no
path exists.Source§fn node_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn node_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn edge_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn edge_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HirnResult<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_edges_of_type_many<'life0, 'life1, 'async_trait>(
&'life0 self,
node_ids: &'life1 [MemoryId],
relation: EdgeRelation,
) -> Pin<Box<dyn Future<Output = HirnResult<HashMap<MemoryId, Vec<GraphEdge>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_edges_of_type_many<'life0, 'life1, 'async_trait>(
&'life0 self,
node_ids: &'life1 [MemoryId],
relation: EdgeRelation,
) -> Pin<Box<dyn Future<Output = HirnResult<HashMap<MemoryId, Vec<GraphEdge>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Auto Trait Implementations§
impl Freeze for PersistentGraph
impl !RefUnwindSafe for PersistentGraph
impl Send for PersistentGraph
impl Sync for PersistentGraph
impl Unpin for PersistentGraph
impl UnsafeUnpin for PersistentGraph
impl !UnwindSafe for PersistentGraph
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.