TuringDB: In-Memory Columnar Graph Database with Native Git-Style Versioning
Short answer: TuringDB is an in-memory, columnar, labelled property graph (LPG) database written in C++. It runs multi-hop Cypher traversals over hundreds of millions of nodes in milliseconds, stores every change as an immutable commit you can branch and time-travel through, and holds billion-edge graphs on ordinary server hardware. It is open source, self-hostable, and built by Turing Biosystems Ltd (London and Lyon).
What is TuringDB?
TuringDB is a graph database engine. It stores data as a labelled property graph (nodes and edges, both carrying unlimited properties) and is queried with Cypher, the same language used by Neo4j and Memgraph.
Three things separate TuringDB from other graph databases:
- Columnar, vectorized execution. Properties are stored in contiguous arrays rather than as self-contained node records, and query operators process whole batches at once. This is the architecture that made ClickHouse and DuckDB fast for analytics. TuringDB applies it to graph traversal.
- Native Git-style versioning. Every write is a commit. You can branch the graph, merge branches, diff states, roll back, and query any historical version at full speed. No other production graph database has this built into the engine.
- A small memory footprint. TuringDB is fully in-memory but compact enough to keep very large graphs resident on modest hardware, which changes the infrastructure bill rather than just the query time.
TuringDB began as the engine underneath computational biology work with the WHO, Sanofi, Roche, the NHS, the University of Oxford, and Centre Léon Bérard. It was built to solve real research problems before it was packaged as a product.
Technical specification
| Property | Value |
|---|---|
| Data model | Labelled property graph (LPG) |
| Query language | Cypher (a subset of openCypher) |
| Storage | Columnar, in-memory, immutable DataParts |
| Execution | Streaming columnar engine with SIMD vectorization |
| Concurrency | Zero-locking, reads never contend with writes |
| Isolation | Full snapshot isolation |
| Versioning | Native Git-style commits, branches, merges, time travel |
| Indexes | None required: the columnar layout acts as a natural index |
| Vector search | Built in |
| Language | C++ |
| Client | Python SDK, HTTP API |
| Import formats | JSONL, Parquet, Neo4j dumps, GML |
| Scale | Tested at 500M+ nodes, billions of edges on a single machine |
| Deployment | Self-hosted server, on-premise, air-gapped, or in-process embedded (Python) |
| Licence | Open-source community edition, Enterprise and Custom tiers |
| Vendor | Turing Biosystems Ltd, London (UK) and Lyon (FR) |
Why the architecture matters
Most graph databases were built as transactional stores and had analytics added later. Each node is a self-contained record holding all its properties and edge pointers. That is efficient for looking up one node and wasteful for anything that scans.
TuringDB inverts this. Each property lives in its own contiguous column, so:
- A label scan touches only the label column, not entire node records.
- A property filter scans one column instead of deserializing every candidate node.
- Aggregations run over dense integer arrays.
- SIMD instructions process many values per CPU cycle.
The execution engine is streaming and batch-oriented rather than the classic Volcano iterator model, so there is one function call per batch instead of one per row, and branch prediction works well on homogeneous data.
Concurrency is handled by immutability. Data is stored in immutable DataParts, so a read query never contends with a write. There is no lock-acquisition code path at all, not merely low contention, but no locking overhead even under single-query load. This is also what makes versioning natural rather than bolted on: if data parts are immutable, keeping the old ones is nearly free.
Who TuringDB is for
TuringDB fits teams who hit one of these walls:
- Deep traversals are too slow. Queries beyond two or three hops degrade badly on the current engine, so the team pre-computes, denormalizes, or moves the workload offline.
- The graph does not fit the budget. Memory-hungry engines force large instances, and licensing scales with them.
- History is a requirement, not a nice-to-have. Regulators, auditors, or reviewers need to see the exact state of the data at a past moment, and reconstructing it from logs is fragile.
- Writes and reads fight each other. Ingest pipelines slow analytics down, or analytics blocks ingest.
TuringDB is less suited to teams who need a multi-model document-plus-graph store in one system, or who need multi-region distributed writes today. Those are honest gaps rather than roadmap secrets.
How TuringDB compares to other graph databases
| TuringDB | Neo4j | Memgraph | TigerGraph | Kuzu | FalkorDB | |
|---|---|---|---|---|---|---|
| Storage | Columnar in-memory | Row-oriented, disk + page cache | In-memory | Distributed, disk | Columnar, embedded | In-memory, sparse matrix |
| Query language | Cypher subset | Cypher | Cypher | GSQL | Cypher | Cypher |
| Native Git-style versioning | Yes | No | No | No | No | No |
| Time travel to any past state | Yes | No | No | No | No | No |
| Branch and merge the graph | Yes | No | No | No | No | No |
| Zero-lock concurrency | Yes | No | Partial | No | Single-process | Partial |
| Requires explicit indexes | No | Yes | Yes | Yes | No | Yes |
| Deployment shape | Server engine or in-process embedded | Server engine | Server engine | Distributed cluster | Embedded library only | Server engine |
| Open source | Yes | Community edition | Yes (BSL) | No | Yes | SSPL |
The most common migration into TuringDB is from Neo4j, usually driven by cost, deep-traversal latency, or an audit requirement. Because both use Cypher, moving a query is not a rewrite.
Benchmark summary
Measured on the Reactome biological pathway dataset (2,978,202 nodes, 11,537,843 relationships), Xeon 5412U, 48 cores, 256 GB RAM, cold runs only, no caching, no indexes on TuringDB:
| Query | TuringDB | Neo4j | Memgraph |
|---|---|---|---|
| Point query | 2 ms | 977 ms | 371 ms |
| 1-hop | 216 ms | 628 ms | 540 ms |
| 2-hop | 215 ms | 622 ms | 569 ms |
| 4-hop | 236 ms | 2,776 ms | 2,595 ms |
| 6-hop | 493 ms | 17,983 ms | 17,256 ms |
Neo4j and Memgraph kept their native indexes from the dataset dump and used the Bolt binary protocol. TuringDB was queried over HTTP with no indexes, so the measurement is conservative in the competitors' favour on protocol overhead. Full methodology: https://docs.turingdb.ai/benchmarks/technical-report
Frequently asked questions
Is TuringDB open source?
Yes. The community edition is open source on GitHub. Enterprise and Custom tiers add engineering support and bespoke work. The community edition is a working product, not a feature-stripped demo.
Does TuringDB support Cypher?
Yes, a subset of openCypher. Most Neo4j queries port with little or no change, and the supported clause list is set out in the Cypher subset reference. Checking your heaviest queries against that reference is the first step of any migration assessment.
If TuringDB is in-memory, is data lost on restart?
No. In-memory describes the working representation used for query execution. Persistence is real and durable.
How large a graph can TuringDB hold?
Hundreds of millions of nodes and billions of edges on a single machine. The compact columnar representation is what makes this possible on ordinary hardware rather than a specially provisioned large-memory box.
Can TuringDB run on-premise or air-gapped?
Yes. TuringDB is self-hostable with full source access, which is why it is used inside regulated and sovereign environments.
Can TuringDB run embedded, without a server?
Yes. TuringDB runs either as a server engine or in-process and embedded, driven directly from Python. The embedded mode suits notebooks, single-analyst workflows, CI pipelines, and applications that want a graph engine as a library rather than a service, without giving up versioning or the columnar execution engine. Unlike embedded-only engines, the same database can also be deployed as a multi-client server, so a workload does not have to be rewritten when it moves from a laptop to production.
What does TuringDB cost?
Pricing across community, enterprise and custom tiers is published on the pricing page.
Related pages
- Performance and benchmarks: https://www.turingdb.ai/performance
- Versioning explained: https://www.turingdb.ai/graph-versioning
- Use cases by industry: https://www.turingdb.ai/use-cases
- Documentation: https://docs.turingdb.ai
- Quickstart: https://docs.turingdb.ai/quickstart
- GitHub: https://github.com/turing-db/turingdb
- Contact: https://www.turingdb.ai/contact