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.
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.
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 moreNeo4j 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 moreBenchmarks
| 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 |
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.