What makes TuringDB so fast?

Most graph databases bolt analytics onto an engine built for transactional workloads. We took the opposite path. TuringDB is performance-first, borrowing the columnar, vectorized architecture proven in modern analytical databases and leveraging it for graphs. The result: millisecond traversals that stay that way as your graph grows.

Traditional graph databases (Neo4j, Memgraph) store each node as a self-contained record with all its properties and references to edges, efficient for single lookups but wasteful for analytical scans. TuringDB stores data column-oriented: each property in its own contiguous array, proven in engines like ClickHouse and DuckDB.

  • Label scans touch only the label column, not full node records.
  • Property filters scan a single column instead of deserializing nodes.
  • Aggregations operate on dense integer arrays.
Learn more

Neo4j and Memgraph use the Volcano (iterator) model, processing one row at a time, with per-row overhead and no vectorization. TuringDB uses a streaming columnar execution engine: each operator processes a whole batch (a column) at once.

  • SIMD vectorization: many values per CPU instruction.
  • Reduced overhead: one function call per batch, not per row.
  • Better branch prediction on homogeneous data.
Learn more

TuringDB's immutable DataPart architecture means read queries never contend with writes. Even for a single query with no concurrent load, the zero-locking design skips the entire lock-management code path, so there's no lock-acquisition overhead at all.

Learn more

Neo4j and Memgraph rely on indexes to accelerate property lookups, and here they use the indexes from the dataset dump. TuringDB uses no explicit index structures: its columnar layout makes property scans inherently fast, the column itself acting as a natural index. Even with the competitors' indexes available, TuringDB still wins most property-filter queries.

Learn more
turingdb — bench — 80×24
benchmark.v01> turingdb bench --point
 
turingdb
0 ms
neo4j
0 ms
memgraph
0 ms
benchmark.v01>
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
How we measured
DatasetReactome
Nodes2,978,202
Relationships11,537,843
CPUXeon 5412U
Cores · RAM48 · 256 GB

Cold runs only: no caching, no indexes on TuringDB, no engine-specific tuning. Same hardware, one database at a time. Neo4j and Memgraph kept their native indexes from the dump; Memgraph ran in IN_MEMORY_ANALYTICAL mode. Versions: TuringDB 1.0, Neo4j 5.26.19, Python 3.13.11, turingdb SDK 1.20.0.

Conservative in TuringDB's favor: TuringDB is queried over HTTP, while Neo4j and Memgraph use the faster Bolt binary protocol, so TuringDB's times include higher protocol overhead.