pub struct Uni { /* private fields */ }Expand description
Main entry point for Uni embedded database.
Handles storage, schema, and query execution. It coordinates the various subsystems including the storage engine, query executor, and graph algorithms.
§Examples
§Local Usage
use uni_db::Uni;
#[tokio::main]
async fn main() -> Result<(), uni_db::UniError> {
let db = Uni::open("./my_db")
.build()
.await?;
// Run a query
let results = db.query("MATCH (n) RETURN count(n)").await?;
println!("Count: {:?}", results);
Ok(())
}§Hybrid Storage (S3 + Local)
Store bulk data and catalog metadata in S3 (or GCS/Azure) while keeping WAL/ID allocation local.
use uni_db::Uni;
#[tokio::main]
async fn main() -> Result<(), uni_db::UniError> {
// Requires `object_store` features enabled (aws, gcp, azure)
let db = Uni::open("./local_meta")
.hybrid("./local_meta", "s3://my-bucket/graph-data")
.build()
.await?;
Ok(())
}Implementations§
Source§impl Uni
impl Uni
Sourcepub fn locy(&self) -> LocyEngine<'_>
pub fn locy(&self) -> LocyEngine<'_>
Create a Locy evaluation engine bound to this database.
Source§impl Uni
impl Uni
Sourcepub async fn explain(&self, cypher: &str) -> Result<ExplainOutput>
pub async fn explain(&self, cypher: &str) -> Result<ExplainOutput>
Explain a Cypher query plan without executing it.
Sourcepub async fn profile(
&self,
cypher: &str,
) -> Result<(QueryResult, ProfileOutput)>
pub async fn profile( &self, cypher: &str, ) -> Result<(QueryResult, ProfileOutput)>
Profile a Cypher query execution.
Sourcepub async fn query(&self, cypher: &str) -> Result<QueryResult>
pub async fn query(&self, cypher: &str) -> Result<QueryResult>
Execute a Cypher query
Sourcepub async fn query_cursor(&self, cypher: &str) -> Result<QueryCursor>
pub async fn query_cursor(&self, cypher: &str) -> Result<QueryCursor>
Execute query returning a cursor for streaming results
Sourcepub fn query_with(&self, cypher: &str) -> QueryBuilder<'_>
pub fn query_with(&self, cypher: &str) -> QueryBuilder<'_>
Execute a query with parameters using a builder
Sourcepub fn execute_with(&self, cypher: &str) -> QueryBuilder<'_>
pub fn execute_with(&self, cypher: &str) -> QueryBuilder<'_>
Execute a mutation with parameters using a builder.
Alias for query_with that clarifies intent for
mutation queries. Use .param() to bind parameters, then .execute()
to run the mutation.
§Examples
db.execute_with("CREATE (p:Person {name: $name, age: $age})")
.param("name", "Alice")
.param("age", 30)
.execute()
.await?;Sourcepub async fn execute(&self, cypher: &str) -> Result<ExecuteResult>
pub async fn execute(&self, cypher: &str) -> Result<ExecuteResult>
Execute a modification query (CREATE, SET, DELETE, etc.) Returns the number of affected rows/elements
Source§impl Uni
impl Uni
pub fn schema(&self) -> SchemaBuilder<'_>
pub async fn load_schema(&self, path: impl AsRef<Path>) -> Result<()>
pub async fn save_schema(&self, path: impl AsRef<Path>) -> Result<()>
Source§impl Uni
impl Uni
pub async fn begin(&self) -> Result<Transaction<'_>>
pub async fn transaction<'a, F, T>(&'a self, f: F) -> Result<T>
Source§impl Uni
impl Uni
Sourcepub fn open(uri: impl Into<String>) -> UniBuilder
pub fn open(uri: impl Into<String>) -> UniBuilder
Open or create a database at the given path.
If the database does not exist, it will be created.
§Arguments
uri- Local path or object store URI.
§Returns
A UniBuilder to configure and build the database instance.
Sourcepub fn open_existing(uri: impl Into<String>) -> UniBuilder
pub fn open_existing(uri: impl Into<String>) -> UniBuilder
Open an existing database at the given path. Fails if it does not exist.
Sourcepub fn create(uri: impl Into<String>) -> UniBuilder
pub fn create(uri: impl Into<String>) -> UniBuilder
Create a new database at the given path. Fails if it already exists.
Sourcepub fn temporary() -> UniBuilder
pub fn temporary() -> UniBuilder
Create a temporary database that is deleted when dropped.
Useful for tests and short-lived processing. Note: Currently uses a temporary directory on the filesystem.
Sourcepub fn in_memory() -> UniBuilder
pub fn in_memory() -> UniBuilder
Open an in-memory database (alias for temporary).
Sourcepub fn procedure_registry(&self) -> &Arc<ProcedureRegistry>
pub fn procedure_registry(&self) -> &Arc<ProcedureRegistry>
Returns the procedure registry for registering test procedures.
Sourcepub fn get_schema(&self) -> Arc<Schema>
pub fn get_schema(&self) -> Arc<Schema>
Get current schema (read-only snapshot)
Sourcepub fn bulk_writer(&self) -> BulkWriterBuilder<'_>
pub fn bulk_writer(&self) -> BulkWriterBuilder<'_>
Create a bulk writer for efficient data loading.
Sourcepub fn session(&self) -> SessionBuilder<'_>
pub fn session(&self) -> SessionBuilder<'_>
Create a session builder for scoped query context.
Sourcepub async fn flush(&self) -> Result<()>
pub async fn flush(&self) -> Result<()>
Flush all uncommitted changes to persistent storage (L1).
This forces a write of the current in-memory buffer (L0) to columnar files. It also creates a new snapshot.
Sourcepub async fn create_snapshot(&self, name: Option<&str>) -> Result<String>
pub async fn create_snapshot(&self, name: Option<&str>) -> Result<String>
Create a named point-in-time snapshot of the database.
This flushes current changes and records the state. Returns the snapshot ID.
Sourcepub async fn create_named_snapshot(&self, name: &str) -> Result<String>
pub async fn create_named_snapshot(&self, name: &str) -> Result<String>
Create a persisted named snapshot that can be retrieved later.
Sourcepub async fn list_snapshots(&self) -> Result<Vec<SnapshotManifest>>
pub async fn list_snapshots(&self) -> Result<Vec<SnapshotManifest>>
List all available snapshots.
Sourcepub async fn restore_snapshot(&self, snapshot_id: &str) -> Result<()>
pub async fn restore_snapshot(&self, snapshot_id: &str) -> Result<()>
Restore the database to a specific snapshot.
Note: This currently requires a restart or re-opening of Uni to fully take effect as it only updates the latest pointer.
Sourcepub async fn label_exists(&self, name: &str) -> Result<bool>
pub async fn label_exists(&self, name: &str) -> Result<bool>
Check if a label exists in the schema.
Sourcepub async fn edge_type_exists(&self, name: &str) -> Result<bool>
pub async fn edge_type_exists(&self, name: &str) -> Result<bool>
Check if an edge type exists in the schema.
Sourcepub async fn list_labels(&self) -> Result<Vec<String>>
pub async fn list_labels(&self) -> Result<Vec<String>>
Get all label names.
Returns the union of schema-registered labels (Active state) and labels
discovered from data (for schemaless mode where labels may not be in the
schema). This is consistent with list_edge_types() for schema labels
while also supporting schemaless workflows.
Sourcepub async fn list_edge_types(&self) -> Result<Vec<String>>
pub async fn list_edge_types(&self) -> Result<Vec<String>>
Get all edge type names.
Sourcepub async fn get_label_info(&self, name: &str) -> Result<Option<LabelInfo>>
pub async fn get_label_info(&self, name: &str) -> Result<Option<LabelInfo>>
Get detailed information about a label.
Sourcepub async fn compact_label(&self, label: &str) -> Result<CompactionStats>
pub async fn compact_label(&self, label: &str) -> Result<CompactionStats>
Manually trigger compaction for a specific label.
Compaction merges multiple L1 files into larger files to improve read performance.
Sourcepub async fn compact_edge_type(
&self,
edge_type: &str,
) -> Result<CompactionStats>
pub async fn compact_edge_type( &self, edge_type: &str, ) -> Result<CompactionStats>
Manually trigger compaction for a specific edge type.
Sourcepub async fn wait_for_compaction(&self) -> Result<()>
pub async fn wait_for_compaction(&self) -> Result<()>
Wait for any ongoing compaction to complete.
Useful for tests or ensuring consistent performance before benchmarks.
Sourcepub async fn bulk_insert_vertices(
&self,
label: &str,
properties_list: Vec<Properties>,
) -> Result<Vec<Vid>>
pub async fn bulk_insert_vertices( &self, label: &str, properties_list: Vec<Properties>, ) -> Result<Vec<Vid>>
Bulk insert vertices for a given label.
This is a low-level API intended for bulk loading and benchmarking. Each properties map should contain all property values as JSON.
Returns the allocated VIDs in the same order as the input.
Sourcepub async fn bulk_insert_edges(
&self,
edge_type: &str,
edges: Vec<(Vid, Vid, Properties)>,
) -> Result<()>
pub async fn bulk_insert_edges( &self, edge_type: &str, edges: Vec<(Vid, Vid, Properties)>, ) -> Result<()>
Bulk insert edges for a given edge type using pre-allocated VIDs.
This is a low-level API intended for bulk loading and benchmarking. Each tuple is (src_vid, dst_vid, properties).
Sourcepub async fn index_rebuild_status(&self) -> Result<Vec<IndexRebuildTask>>
pub async fn index_rebuild_status(&self) -> Result<Vec<IndexRebuildTask>>
Get the status of background index rebuild tasks.
Returns all tracked index rebuild tasks, including pending, in-progress,
completed, and failed tasks. Use this to monitor progress of async
index rebuilds started via BulkWriter::commit() with async_indexes(true).
§Example
let status = db.index_rebuild_status().await?;
for task in status {
println!("Label: {}, Status: {:?}", task.label, task.status);
}Sourcepub async fn retry_index_rebuilds(&self) -> Result<Vec<String>>
pub async fn retry_index_rebuilds(&self) -> Result<Vec<String>>
Retry failed index rebuild tasks.
Resets failed tasks back to pending state and returns the task IDs that will be retried. Tasks that have exceeded their retry limit will not be retried.
§Returns
A vector of task IDs that were scheduled for retry.
Sourcepub async fn rebuild_indexes(
&self,
label: &str,
async_: bool,
) -> Result<Option<String>>
pub async fn rebuild_indexes( &self, label: &str, async_: bool, ) -> Result<Option<String>>
Force rebuild indexes for a specific label.
§Arguments
label- The vertex label to rebuild indexes for.async_- If true, rebuild in background; if false, block until complete.
§Returns
When async_ is true, returns the task ID for tracking progress.
When async_ is false, returns None after indexes are rebuilt.
Sourcepub async fn is_index_building(&self, label: &str) -> Result<bool>
pub async fn is_index_building(&self, label: &str) -> Result<bool>
Check if an index is currently being rebuilt for a label.
Returns true if there is a pending or in-progress index rebuild task for the specified label.
Sourcepub fn list_indexes(&self, label: &str) -> Vec<IndexDefinition>
pub fn list_indexes(&self, label: &str) -> Vec<IndexDefinition>
List all indexes defined on a specific label.
Sourcepub fn list_all_indexes(&self) -> Vec<IndexDefinition>
pub fn list_all_indexes(&self) -> Vec<IndexDefinition>
List all indexes in the database.
Sourcepub async fn shutdown(self) -> Result<()>
pub async fn shutdown(self) -> Result<()>
Shutdown the database gracefully, flushing pending data and stopping background tasks.
This method flushes any pending data and waits for all background tasks to complete (with a timeout). After calling this method, the database instance should not be used.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Uni
impl !RefUnwindSafe for Uni
impl Send for Uni
impl Sync for Uni
impl Unpin for Uni
impl UnsafeUnpin for Uni
impl !UnwindSafe for Uni
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.