Skip to main content

Uni

Struct Uni 

Source
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

Source

pub fn locy(&self) -> LocyEngine<'_>

Create a Locy evaluation engine bound to this database.

Source§

impl Uni

Source

pub async fn explain(&self, cypher: &str) -> Result<ExplainOutput>

Explain a Cypher query plan without executing it.

Source

pub async fn profile( &self, cypher: &str, ) -> Result<(QueryResult, ProfileOutput)>

Profile a Cypher query execution.

Source

pub async fn query(&self, cypher: &str) -> Result<QueryResult>

Execute a Cypher query

Source

pub async fn query_cursor(&self, cypher: &str) -> Result<QueryCursor>

Execute query returning a cursor for streaming results

Source

pub fn query_with(&self, cypher: &str) -> QueryBuilder<'_>

Execute a query with parameters using a builder

Source

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?;
Source

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

Source

pub fn schema(&self) -> SchemaBuilder<'_>

Source

pub async fn load_schema(&self, path: impl AsRef<Path>) -> Result<()>

Source

pub async fn save_schema(&self, path: impl AsRef<Path>) -> Result<()>

Source§

impl Uni

Source

pub async fn begin(&self) -> Result<Transaction<'_>>

Source

pub async fn transaction<'a, F, T>(&'a self, f: F) -> Result<T>
where F: for<'b> FnOnce(&'b mut Transaction<'a>) -> BoxFuture<'b, Result<T>>,

Source§

impl Uni

Source

pub fn xervo(&self) -> Result<UniXervo>

Access Uni-Xervo runtime facade configured for this database.

Source§

impl Uni

Source

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.

Source

pub fn open_existing(uri: impl Into<String>) -> UniBuilder

Open an existing database at the given path. Fails if it does not exist.

Source

pub fn create(uri: impl Into<String>) -> UniBuilder

Create a new database at the given path. Fails if it already exists.

Source

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.

Source

pub fn in_memory() -> UniBuilder

Open an in-memory database (alias for temporary).

Source

pub fn config(&self) -> &UniConfig

Get configuration

Source

pub fn procedure_registry(&self) -> &Arc<ProcedureRegistry>

Returns the procedure registry for registering test procedures.

Source

pub fn get_schema(&self) -> Arc<Schema>

Get current schema (read-only snapshot)

Source

pub fn bulk_writer(&self) -> BulkWriterBuilder<'_>

Create a bulk writer for efficient data loading.

Source

pub fn session(&self) -> SessionBuilder<'_>

Create a session builder for scoped query context.

Source

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.

Source

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.

Source

pub async fn create_named_snapshot(&self, name: &str) -> Result<String>

Create a persisted named snapshot that can be retrieved later.

Source

pub async fn list_snapshots(&self) -> Result<Vec<SnapshotManifest>>

List all available snapshots.

Source

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.

Source

pub async fn label_exists(&self, name: &str) -> Result<bool>

Check if a label exists in the schema.

Source

pub async fn edge_type_exists(&self, name: &str) -> Result<bool>

Check if an edge type exists in the schema.

Source

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.

Source

pub async fn list_edge_types(&self) -> Result<Vec<String>>

Get all edge type names.

Source

pub async fn get_label_info(&self, name: &str) -> Result<Option<LabelInfo>>

Get detailed information about a label.

Source

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.

Source

pub async fn compact_edge_type( &self, edge_type: &str, ) -> Result<CompactionStats>

Manually trigger compaction for a specific edge type.

Source

pub async fn wait_for_compaction(&self) -> Result<()>

Wait for any ongoing compaction to complete.

Useful for tests or ensuring consistent performance before benchmarks.

Source

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.

Source

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).

Source

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);
}
Source

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.

Source

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.

Source

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.

Source

pub fn list_indexes(&self, label: &str) -> Vec<IndexDefinition>

List all indexes defined on a specific label.

Source

pub fn list_all_indexes(&self) -> Vec<IndexDefinition>

List all indexes in the database.

Source

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§

Source§

impl Drop for Uni

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

Source§

fn is_within(&self, b: &G2) -> bool

Source§

impl<T> Fruit for T
where T: Send + Downcast,

Source§

impl<T> MaybeSend for T
where T: Send,