Introduction
patinaDB is a lightweight graph database written in Rust. It stores a property graph — vertices (nodes) and directed edges (relationships), each carrying typed properties — on top of redb, an embedded ACID key-value store with native cross-tree atomic commits. You query it with a Cypher-like language, and every write is recorded as a engram so you can inspect history and travel back in time.
patinaDB runs in two shapes from the same core engine:
- Embedded — reach it from Python via the bindings, from the
patinadbcommand-line tool, or from an AI agent via the MCP server, and open a database directory directly. No server, no network, no separate process. - The server (
patinadb-raft) — a standalone node that replicates writes with the Raft consensus protocol, hosts multiple databases, and speaks both a JSON REST API and the native Bolt protocol used by Neo4j drivers and the Neo4j Browser. A single node with--bootstrapis a drop-in lightweight server; add peers to get automatic failover.
What makes patinaDB distinct
- Versioned by construction. Every mutation is committed as an
engram — a git-like commit for your graph. List the history,
view a git-style diff of any single change, diff two arbitrary
points in time, tag a
meaningful state, and run read queries against the past with
USE … AS OF. No audit table to bolt on — the history is the database. - Provenance, for free. Because the history is a first-class change stream,
patinaDB’s Anamnesis system auto-projects it into a queryable PROV
graph in a companion database — who / what / when, and optional source /
confidence /
derived_fromat commit, type, attribute, or per-entity granularity, enriched straight from Neo4j transaction metadata. Where Neo4j leaves you to assemble this from APOC triggers or CDC, here it ships in the engine. See Anamnesis. - Cypher-compatible. The engine passes ~95% of the openCypher Technology Compatibility Kit (TCK). See Cypher Support for exactly what is and isn’t covered.
- Neo4j-tooling-compatible. The server’s Bolt endpoint works with the official Neo4j drivers and the Neo4j Browser, so you can point existing tools straight at patinaDB.
- Search is built in. Full-text search with BM25 ranking and
vector/embedding search (an IVF ANN index, cosine &
euclidean) ship in the engine — with the same procedure syntax as Neo4j
(
db.index.fulltext.queryNodes,db.index.vector.queryNodes). No external search service, no separate vector database. - Single binary, scales down and up. A one-node cluster (quorum of 1) behaves like a plain embedded server with no consensus latency; add peers for automatic failover (High Availability). Snapshots and time-travel reconstruction stream in O(chunk) memory, so the graph isn’t bounded by RAM.
Who this manual is for
This is the user manual — how to install, query, operate, and integrate patinaDB. It documents every user-facing feature and, just as importantly, its limitations.
A note on scope
patinaDB deliberately implements a subset of Neo4j/Cypher. It is not a drop-in Neo4j replacement for every workload — it targets embedded use, versioned/auditable graphs, and small-to-medium replicated deployments. Where behaviour differs from Neo4j, this manual calls it out explicitly. Read the Limitations chapter before committing to a production workload.