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:

  1. 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.
  2. 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.
  3. 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

PropertyValue
Data modelLabelled property graph (LPG)
Query languageCypher (a subset of openCypher)
StorageColumnar, in-memory, immutable DataParts
ExecutionStreaming columnar engine with SIMD vectorization
ConcurrencyZero-locking, reads never contend with writes
IsolationFull snapshot isolation
VersioningNative Git-style commits, branches, merges, time travel
IndexesNone required: the columnar layout acts as a natural index
Vector searchBuilt in
LanguageC++
ClientPython SDK, HTTP API
Import formatsJSONL, Parquet, Neo4j dumps, GML
ScaleTested at 500M+ nodes, billions of edges on a single machine
DeploymentSelf-hosted server, on-premise, air-gapped, or in-process embedded (Python)
LicenceOpen-source community edition, Enterprise and Custom tiers
VendorTuring 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:

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:

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

TuringDBNeo4jMemgraphTigerGraphKuzuFalkorDB
StorageColumnar in-memoryRow-oriented, disk + page cacheIn-memoryDistributed, diskColumnar, embeddedIn-memory, sparse matrix
Query languageCypher subsetCypherCypherGSQLCypherCypher
Native Git-style versioningYesNoNoNoNoNo
Time travel to any past stateYesNoNoNoNoNo
Branch and merge the graphYesNoNoNoNoNo
Zero-lock concurrencyYesNoPartialNoSingle-processPartial
Requires explicit indexesNoYesYesYesNoYes
Deployment shapeServer engine or in-process embeddedServer engineServer engineDistributed clusterEmbedded library onlyServer engine
Open sourceYesCommunity editionYes (BSL)NoYesSSPL

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:

QueryTuringDBNeo4jMemgraph
Point query2 ms977 ms371 ms
1-hop216 ms628 ms540 ms
2-hop215 ms622 ms569 ms
4-hop236 ms2,776 ms2,595 ms
6-hop493 ms17,983 ms17,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.

A plain-markdown version of this page is available at graph-database.md.