Skip to main content

🚀 TuringDB Benchmarks

This page showcases the performance of TuringDB vs Neo4j across a series of real-world graph analytics queries using the Reactome biological knowledge graph. The goal of this first benchmark is to compare the out-of-the-box performance of TuringDB with Neo4J on a few basic queries on the Reactome knowledge graph, without any particular indexing or optimization put in place on either side. Both TuringDB and Neo4J are started in a cold setting out of the box.

🧪 Benchmark Setup

We use the open-source turing-bench suite to evaluate performance. It runs equivalent queries across TuringDB and Neo4j, measuring latency, throughput, and result sizes.

Tools:

Neo4j may fail to load the Reactome database on first boot. If this happens: Restart the Neo4j instance manually (details in the Neo4j README)

🔧 How to Run the Benchmarks

# Clone the benchmarking repo
git clone <https://github.com/turing-db/turing-bench>
cd turing-bench

Run a benchmark (Neo4j)

cd src/neo4j
python3 bench.py -q "samples/reactome/neo4j-str-prop-multihop.cypher" -r 3

Run a benchmark (TuringDB)

cd build/build_package
./turing-bench -l reactome -q samples/reactome/str-prop-multihop.cypher -r 100 -p

📊 Summary of Results

📍 Multi-hop Queries From A Set of Seed Nodes

Query DepthNeo4j MeanTuringDB MeanSpeedup
1-hop1390ms12ms115x
2-hop1420ms11ms129x
4-hop1568ms14ms112x
7-hop51264ms172ms298x
8-hop98183ms476ms206x
Details: MATCH query returning node IDs from a set of 15 seed nodes with an increasing number of hops through outgoing edges. Example for 1 hop:
match (n{displayName:"Autophagy"})-->(m) return id(m)
TuringDB’s columnar architecture and streaming engine allow it to scale even for long path queries.

🔖 Labelset Matching & Few-Hop Traversals

QueryNeo4j MeanTuringDB MeanSpeedup
match (n:Drug)525ms0.43ms1200x
match (n:Drug:ProteinDrug)644ms0.16ms4025x
match (n)--(m:Interaction)--(o)7519ms141ms53x
TuringDB’s label-based scans and columnar indexing drastically outperforms Neo4j’s node-by-node traversal.

🧵 Edge-Type Queries

QueryNeo4j MeanTuringDB MeanSpeedup
match (n)-[:release]->(m)3881ms822ms5x
match (n)-[:hasEvent]->(m)5447ms843ms6x
match (n:Pathway)-[:hasEvent]->(m:Event)3224ms64ms50x
match (r:Reaction)-[:output]->(s:Entity)5031ms170ms30x

🔁 Deep Multidirectional Traversals

QueryNeo4j MeanTuringDB MeanSpeedup
match (n:DatabaseObject{isChimeric:false}) return n4496ms7ms642x
match (b)--(a:Pathway)10874ms17ms640x
match (c)--(b)--(a:Pathway) return a, c78079ms8348ms9x
match (c)--(b)--(a:Pathway) return b52249ms8171ms6x

Observations

  • TuringDB is orders of magnitude faster for long-path traversals (e.g., 8-hop queries).
  • Cold-start queries in Neo4j are significantly slower due to record-oriented execution and lack of built-in versioning/indexing on properties.
  • Columnar memory layout and streaming execution give TuringDB consistent low-latency performance for both analytical and graph-native operations.

Performance Insights

TuringDB delivers high performance due to:
  • Columnar Execution: Vectorized, SIMD-friendly query engine
  • Streaming Pipeline: Efficient execution on batches of node/edge chunks
  • Snapshot Isolation: No locks or blocking during deep reads
  • DataParts: Enable massive import parallelism & memory efficiency
Learn more:
  • Columnar System
  • Streaming Execution Engine
  • Versioning & Snapshot Isolation

🔍 Benchmark Data

Full benchmarking data and instructions on Github: 📂 TuringDB Benchmark Suite

🧪 Try It Yourself

You can replicate these results on your own instance using the Reactome dataset. Follow the setup steps in the Benchmark README

❓Need Help?

Join our Discord or open an issue on GitHub.

🛣️ Roadmap

We will be expanding this benchmarks to other graph databases (such as Memgraph or TigerGraph) as well as other criteria to try and build the most reliable benchmark possible and have an honest view of where we may shine and where we may not.
I