Skip to main content
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 · Raw data in repo

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 PointGet Performance PointGet FixedQPS

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 OneHop Performance OneHop FixedQPS

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 OneHopFilter Performance OneHopFilter FixedQPS

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: github.com/helixdb/graph-vector-bench