← Back to Blog

Introducing Traverse: A High-Performance Graph Database Built in Rust

We're releasing Traverse — a graph database we built from scratch because the existing ones were too slow, too heavy, or both. Single binary. openCypher. Bolt-compatible. Faster than anything else we've tested.

What is Traverse?

Traverse is an in-memory graph database. It runs openCypher queries over the Bolt wire protocol (v5.1–6.0), so any Neo4j driver works without changes. It also exposes an HTTP API, gRPC, WebSocket, and MCP for AI tooling. Everything ships in one binary — including Studio, a web UI for querying and exploring your graphs visually.

No runtime dependencies. Download, run, connect.

Why we built it

We kept running into the same problems with existing graph databases:

  • Import is painfully slow. Loading data through Cypher statements takes forever on large datasets, and even CSV imports feel outdated for modern stacks. We built a BulkWriter that produces a ready-to-use database file you can upload directly into memory — orders of magnitude faster.
  • You can't hot-swap databases. Need to swap out a graph without downtime? Not an option in Neo4j or Memgraph. We took inspiration from Typesense's collection aliases and built first-class hot-swap and aliasing support.
  • Query performance disappointed us. We expected graph databases to be fast at graph queries. They weren't. So we wrote a query engine from scratch — cost-based optimizer, parallel execution, low memory overhead.

We wanted something fast, embeddable, and simple enough for any developer to run it on any platform.

Performance

We ran extensive tests on Traverse against Neo4j 2025.01.0 and Memgraph 3.2.0 on the Pokec social network dataset (100K nodes, 1.77M edges) — 33 query patterns covering scans, aggregations, expansions, path finding, and writes.

Test setup: A garage-idling machine: Intel i7-12700KF (12C/20T, P-cores at 4.9 GHz), 64 GB DDR5, Ubuntu 24.04. 10 seconds per query, 3 warmup iterations, pinned to P-cores.

Single-threaded (c=1)

ComparisonGeo. Mean SpeedupQueries Won
Traverse vs Neo4j7x32 / 33
Traverse vs Memgraph3.6x31 / 33

Under load (c=12)

ComparisonGeo. Mean SpeedupQueries Won
Traverse vs Neo4j6.3x31 / 33
Traverse vs Memgraph2.8x28 / 33

High concurrency (c=24)

ComparisonGeo. Mean SpeedupQueries Won
Traverse vs Neo4j6.6x31 / 33
Traverse vs Memgraph3.2x29 / 33

The numbers get more interesting on complex queries. Multi-hop expansions with filters: 38x faster than Memgraph. Global aggregations: 130x. Two-hop scan-and-expand: 60x.

Memory

Traverse uses 300–850 MB on this dataset. Neo4j sits at 1.2–2.8 GB and spikes to 17 GB under high concurrency. Traverse stays under 1.1 GB.

What ships in the box

You get five binaries:

  • traverse-server — The database. Bolt, HTTP, gRPC, MCP, and the embedded Studio UI.
  • traverse-cli — openCypher REPL with syntax highlighting and tab completion.
  • traverse-admin — Offline tools: bulk CSV import, openCypher script import, updates.
  • traverse-bench — Benchmark suite for performance testing and comparison.
  • traverse-ffi — C ABI for embedding. Ships as DLL, .so, and .dylib with .NET NuGet packages.

The server binary is under 20 MB.

Studio

Studio is the built-in web UI. Auto-complete for queries, Sigma.js for WebGL graph rendering, schema browser, CSV and openCypher import, per-label styling rules. It's baked into the binary — start the server and open your browser.

Embeddable

Traverse was designed as a library first, server second. The FFI layer gives you a C API, and we ship NuGet packages (Traverse.Embedded, Traverse.Bolt, Traverse.Http) for .NET. Run a full graph database in-process, no external dependencies.

Single-file storage

One database = one .tvdb file. Back it up by copying a file. Deploy by shipping a file. Point a directory of them at the server and each becomes a named database. SQLite model, but for graphs.

MCP for AI

There's a built-in MCP server so AI agents can query your graphs directly.

Driver compatibility

Traverse speaks Bolt. Every Neo4j driver works: Python, JavaScript, Java, Go, Rust, .NET. Change the port in your connection string and you're done.

We also wrote our own .NET Bolt driver. The official Neo4j driver was too slow and too heavy for our use case. Ours uses pipelined RUN+PULL over a single TCP write, ArrayPool-based buffers, and has zero dependencies.

How it's built

Two years of work, starting from what didn't work in Neo4j and Memgraph:

  • Query engine. Full openCypher implementation with a cost-based optimizer, join ordering, and rewrite rules.
  • Wire protocols. Bolt, HTTP/2, TLS — implemented from scratch. One wrong byte and every driver breaks.
  • Tight integration. The database engine, query planner, web server, Studio UI, and licensing system all fit in a ~20 MB binary.

Get started

# Start the server with Studio
traverse-server

# Docker
docker run -p 7690:7690 -p 7691:7691 -v traverse-data:/data truespar/traverse

Open http://localhost:7691 for Studio. The API key prints on startup.

Read the docs or reach out if you want a demo.