Back to Blog
Graph Benchmarks V1

Graph Benchmarks V1

Founders HelixDB

Founders HelixDB

benchmarks

At HelixDB we've been focused on performance for the last few weeks. Here are our benchmarks for HelixDB, Neo4j, and Postgres (edges as joins) on a realistic graph dataset.

We're still working on Vector benchmarks - stay tuned!

TL;DR

  • (10,000 users, 500,000 items, ~4M edges).

  • HelixDB crushes graph workloads (5–20x faster) and is your best bet for production graph workloads (GraphRAG, recommendations, social graphs)

  • Neo4j 5-20x slower than HelixDB

  • Postgres is 10–80x slower

  • Dataset hash ffed7c34a46dc90e · Conducted November 2025 · https://github.com/helixdb/graph-vector-bench

How to Read This

TermMeaning
P50 / P95 / P9950th / 95th / 99th percentile latency
ops/secSuccessful operations per second (throughput)
FixedConcurrencySustained load at N concurrent clients
FixedQPSConstant request rate, measures latency stability

Test Environment

  • Hardware: AWS c6g.2xlarge (eu-west-2) · 8 vCPUs (ARM Neoverse-N1) · 16 GB RAM · 500 GB gp3 EBS=

  • Software: Ubuntu 24.04 LTS · HelixDB v2.1.0 · Neo4j 2025.09.0 (G1GC) · PostgreSQL 16.10

  • Benchmark: 2s warmup · 5s measurement window · FixedConcurrency (100/200/400/800) + FixedQPS (400/800/1600)

  • Dataset: 10k users across 25 countries · 500k items across 1k categories · ~4M edges (~400/user)

Workloads Tested

IDNameDescriptionExample Use
1PointGetRetrieve entity by IDProduct detail fetch
2OneHopTraverse all user -> item edgesWatch history
3OneHopFilterTraverse + filter by category"Action movies watched"

Results Summary

WorkloadRaw WinnerPerformance Gap
PointGetHelixDB12x Postgres, 16x Neo4j
OneHopHelixDB5.9x Neo4j, 13x Postgres
OneHopFilterHelixDB4.2x Neo4j, 20x Postgres

Detailed Results

1 · PointGet — Simple ID Lookup

Retrieve single item by ID (product detail, user profile).

Winner: HelixDB — 12x Postgres, 16x Neo4j

FixedConcurrency Results

DatabaseConcurrencyThroughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB10090,238.41.071.291.41
Neo4j10011,706.08.439.1111.30
Postgres10015,435.06.466.616.71
HelixDB200156,136.01.201.621.94
Neo4j20011,802.016.7718.7219.78
Postgres20015,307.413.0513.3413.47
HelixDB400186,642.41.922.813.44
Neo4j40011,592.234.1237.6138.86
Postgres40015,685.625.4725.8626.16
HelixDB800186,590.83.576.738.62
Neo4j80011,771.867.5270.9071.72
Postgres80015,670.251.0551.9552.94

FixedQPS Results

DatabaseTarget QPSActual Throughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB400400.20.870.900.97
Neo4j400400.20.870.910.93
Postgres400400.20.420.440.46
HelixDB800800.20.870.900.96
Neo4j800800.20.870.940.97
Postgres800800.00.420.500.53
HelixDB16001,600.00.930.991.10
Neo4j16001,600.00.920.991.03
Postgres16001,600.00.711.331.36

2 · OneHop — Graph Traversal

Fetch all items a user interacted with (~400 edges/user).

Winner: HelixDB — 5.9x Neo4j, 13x Postgres

FixedConcurrency Results

DatabaseConcurrencyThroughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB10014,964.66.0911.8715.30
Neo4j1002,555.038.7542.9646.08
Postgres1001,138.287.8489.3890.38
HelixDB20015,129.212.7218.7422.21
Neo4j2002,574.077.5381.0482.36
Postgres2001,148.4174.13176.07177.03
HelixDB40015,122.825.9632.0035.50
Neo4j4002,560.0156.40160.08161.52
Postgres4001,148.4348.39350.02351.22
HelixDB80014,996.852.8458.8862.44
Neo4j8002,562.2311.93317.19318.83
Postgres8001,144.6696.85698.79699.19

FixedQPS Results

DatabaseTarget QPSActual Throughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB400400.21.702.512.65
Neo4j400400.23.523.974.09
Postgres400400.21.271.371.44
HelixDB800800.21.512.452.67
Neo4j800800.23.624.194.72
Postgres800800.21.702.702.84
HelixDB16001,600.01.532.432.73
Neo4j16001,600.24.065.095.90
Postgres16001,143.8349.81351.85352.76

3 · OneHopFilter — Filtered Traversal

Find items a user interacted with in a specific category.

Winner: HelixDB — 4.2x Neo4j, 20x Postgres

FixedConcurrency Results

DatabaseConcurrencyThroughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB10032,030.22.945.197.54
Neo4j1007,826.012.5614.8016.85
Postgres1001,654.460.4461.3261.61
HelixDB20033,277.05.848.9612.93
Neo4j2007,660.225.8728.4929.41
Postgres2001,663.6120.12121.57122.07
HelixDB40033,540.811.6716.3119.85
Neo4j4007,832.050.6853.6554.84
Postgres4001,653.0240.47254.54256.58
HelixDB80033,438.623.6428.3232.03
Neo4j8007,935.8100.48104.09105.07
Postgres8001,659.8482.84485.47486.47

FixedQPS Results

DatabaseTarget QPSActual Throughput (ops/sec)P50 Latency (ms)P95 Latency (ms)P99 Latency (ms)
HelixDB400400.21.161.211.23
Neo4j400400.21.201.251.31
Postgres400400.20.991.131.31
HelixDB800800.21.091.151.19
Neo4j800800.01.221.281.32
Postgres800800.01.001.621.67
HelixDB16001,600.21.091.281.38
Neo4j16001,600.01.201.351.68
Postgres16001,600.04.636.507.40

Performance Highlights

DatabaseBest AtLatency (P50)
HelixDBGraph operations0.9–2.5 ms
Neo4jGraph operations2.0–2.1 ms
PostgresSQL5–40 ms

Limitations & Reproducibility

What we didn't test:

- Cold-start latency

- Insertion times

- Memory footprint during ingestion

- Operational complexity

How to reproduce:

- Dataset hash: ffed7c34a46dc90e

- Raw JSON results, configs, and benchmark driver in repo

- Tests: November 2025, AWS c6g.2xlarge (eu-west-2)

The Bottom Line

For graph workloads (GraphRAG, Agentic systems, recommendations, social graphs):

-> Use HelixDB. The 5–20x graph advantage dominates in real-world scenarios where traversals are frequent.

Benchmark data + scripts: https://github.com/helixdb/graph-vector-bench