uni-db: Python Bindings for Uni Graph Database
Python bindings for the Uni embedded graph database.
Part of The Rustic Initiative by Dragonscale Industries Inc.
Installation
pip install uni-db
Quick Start
from uni_db import Uni
# Open or create a database (`Uni.in_memory()` for an ephemeral one)
db = Uni.open("./my_graph")
# Define schema
db.schema() \
.label("Person") \
.property("name", "string") \
.property_nullable("age", "int64") \
.index("name", "btree") \
.apply()
# Write data. `Uni` is lifecycle and admin only: reads go through a Session,
# writes through a transaction on one.
session = db.session()
tx = session.tx()
tx.execute("CREATE (p:Person {name: 'Alice', age: 30})")
tx.execute("CREATE (p:Person {name: 'Bob', age: 25})")
tx.commit()
# Query (read-only)
results = session.query(
"MATCH (p:Person) WHERE p.age > $min RETURN p.name",
{"min": 28},
)
print(results) # [{'p.name': 'Alice'}]
Schema Operations
# Labels, edge types, properties and indexes are all declared through the
# schema builder and committed together by a single `.apply()`.
db.schema() \
.label("Person") \
.property("name", "string") \
.property_nullable("age", "int64") \
.vector("embedding", 384) \
.index("name", "btree") \
.index("embedding", {"type": "vector", "metric": "cosine"}) \
.done() \
.edge_type("KNOWS", ["Person"], ["Person"]) \
.property_nullable("since", "date") \
.apply()
# Introspection
db.schema().current() # dict view of the whole schema
db.schema().current_typed() # typed `Schema` object
Transactions
tx = db.session().tx()
tx.execute("CREATE (p:Person {name: 'Charlie'})")
tx.commit() # or tx.rollback()
Bulk Loading
The bulk writer is built from a transaction.
tx = db.session().tx()
writer = tx.bulk_writer().build()
vids = writer.insert_vertices("Person", [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
])
writer.insert_edges("KNOWS", [
(vids[0], vids[1], {}), # (src_vid, dst_vid, properties)
])
writer.commit()
tx.commit()
Vector Search
# Declare the vector column and its index
db.schema() \
.label("Document") \
.property("text", "string") \
.vector("embedding", 128) \
.index("embedding", {"type": "vector", "metric": "cosine"}) \
.apply()
session = db.session()
tx = session.tx()
tx.execute("CREATE (d:Document {text: 'hello world', embedding: $v})", {"v": my_embedding})
tx.commit()
db.flush()
# K-NN search. `k` is required.
results = session.query('''
CALL uni.vector.query('Document', 'embedding', $vec, 10)
YIELD node, score
RETURN node.text AS text, score
ORDER BY score DESC
''', {"vec": my_embedding})
# K-NN with pre-filter (SQL WHERE expression)
results = session.query('''
CALL uni.vector.query('Document', 'embedding', $vec, 10, 'category = "tech"')
YIELD node, score
RETURN node.text AS text, score
''', {"vec": my_embedding})
# K-NN with a similarity floor. `threshold` is a MINIMUM SIMILARITY on the
# same scale as `score` (larger is a better match), not a maximum distance.
results = session.query('''
CALL uni.vector.query('Document', 'embedding', $vec, 10, NULL, 0.8)
YIELD node, score
RETURN node.text AS text, score
''', {"vec": my_embedding})
YIELD columns: node (the matched vertex), score (similarity, larger is better) and distance (the raw metric distance).
Async API
from uni_db import AsyncUni
db = await AsyncUni.open("./my_graph")
# or: db = await AsyncUni.temporary()
session = db.session()
tx = await session.tx()
await tx.execute("CREATE (p:Person {name: 'Alice', age: 30})")
await tx.commit()
results = await session.query("MATCH (p:Person) RETURN p.name")
await db.flush()
Forks
Named, durable, isolated branches of the graph. A fork lets a session reason about an alternate version of the database — what-if analysis, audit hold, scenario sandboxing — that survives across restarts.
import uni_db
from datetime import timedelta
db = uni_db.Uni.builder().build()
db.schema().label("Person").property("name", "string").apply()
primary = db.session()
# Open or create a fork (Phase 2: writable; Phase 3: nestable;
# Phase 4a: TTL + tags + budget).
fork = primary.fork("scenario_1").ttl(timedelta(hours=1)).build()
tx = fork.tx()
tx.execute("CREATE (:Person {name: 'fork-only'})")
tx.commit()
# Fork sees primary state + its own writes; primary unchanged.
print(fork.query("MATCH (p:Person) RETURN count(p) AS n"))
# Pin a Lance tag for audit retention; the tag survives the drop.
db.tag_fork("scenario_1", "audit-2026-q1")
del fork
db.drop_fork("scenario_1")
print(db.list_fork_tags("scenario_1")) # tag still resolvable
The async surface mirrors this exactly through AsyncUni /
AsyncSession. See examples/fork_quickstart.py and
examples/fork_audit.py for runnable demos, and the full
Python API reference
for every method, type, and error variant.
Query Utilities
# Parameterized queries
results = db.query(
"MATCH (p:Person) WHERE p.name = $name RETURN p",
{"name": "Alice"},
)
# Explain / profile
plan = db.explain("MATCH (p:Person) RETURN p")
results, stats = db.profile("MATCH (p:Person) RETURN p")
Development
git clone https://github.com/rustic-ai/uni-db
cd uni-db/bindings/uni-db
uv sync --group dev
uv run maturin develop # builds and installs the extension module
uv run pytest # run tests
Links
License
Apache 2.0
Metadata
Release files for uni-db 4.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| uni_db-4.0.0.tar.gz | 6.4 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| uni_db-4.0.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| uni_db-4.0.0-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| uni_db-4.0.0-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| uni_db-4.0.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 387.1 MB
Release files / uni_db-4.0.0.tar.gz
| Download URL | uni_db-4.0.0.tar.gz |
|---|---|
| Size | 6.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
89e70e13fe164dd05f92ae1a8a7fb658fe90209edcc75f135245f187b2ca4e34
|
|
BLAKE2b-256 checksum How to use checksums |
94fe9d3840fcda2ae31f7482c166abddf5791ec478e415f36102884ade2ad50d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / uni_db-4.0.0-cp310-abi3-win_amd64.whl
| Download URL | uni_db-4.0.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 101.1 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
495c7ad8ee9f94ff18702d36a1bb01449a5db87b0a585b1344290174d0308f9d
|
|
BLAKE2b-256 checksum How to use checksums |
c73c07e48e4b1a682258ab40f35cc09b1f8189e5dacd0792f84556232408e8a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / uni_db-4.0.0-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | uni_db-4.0.0-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 99.1 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c993c087119c86ca1a8785339cc2dad0482112e29568717a06101022073c104a
|
|
BLAKE2b-256 checksum How to use checksums |
a7bf74069c9b830ab7741fd9863e0ff5c8da353cb02189cc8f274e0633b820b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / uni_db-4.0.0-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | uni_db-4.0.0-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 94.7 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
c9d683a4f37abab165346483383404331eeefe53663517cd90f8d598607810ae
|
|
BLAKE2b-256 checksum How to use checksums |
3c17a8703f368771e8e063a513bfb05b6ef1105910daff25dfc164bfa7bdb686
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / uni_db-4.0.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | uni_db-4.0.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 85.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b92170ba3fb87ebeae242dbf4b9e282f9db64fca25968c0cfc02e4ccc22c4933
|
|
BLAKE2b-256 checksum How to use checksums |
9b210bf097e72e86a30aaf1f65b46db4c3b964e1c2ac2e5dd4896780259866ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|