Lattice · Cross-engine benchmarks

Six for six, at every scale.

Against Kùzu and DuckDB on the LDBC SNB reads — and against Memgraph and Neo4j on the Pokec social graph — Lattice wins every interactive query, from a 33 µs point lookup to a two-hop traversal. It pays for that with a larger store and, at the largest scale, a slower load. Here is the whole picture, wins and trade-offs together.

Lattice vs Kùzu 0.11.3 · DuckDB 1.5.5 · Memgraph · Neo4j Ryzen 9 9950X3D · 62 GB · NVMe One shared dataset, loaded identically Answers proven identical ✓
SNB reads 6 / 6 queries won at SF1, SF10 and SF100 — against both embedded engines.
Peak lead vs Kùzu ≈111× on the indexed point lookup at SF10 (47 µs vs 5,207 µs).
Graph incumbents · geomean 11–26× faster than Memgraph & Neo4j across pattern and traversal queries on Pokec.
Where it cedes SF100 load only SF100 bulk load — 11.9 s vs Kùzu's 5.8 s (the bidirectional CSR that powers the traversal wins). SF1 and SF10 load are wins, on-disk stays within 1.15× of Kùzu, and every Pokec query — pattern, traversal, scan and aggregation — is a win.
01 — Interactive reads

LDBC SNB: six queries, three engines

Median latency over 200 random Person.id parameters, prepared statements, measured uniformly through Python so per-call overhead is identical for all three. Lower is better; the axis is logarithmic because the engines are orders of magnitude apart.

← faster  ·  median µs (log)  ·  ● marks the fastest engine · hover for p99 & speed-up
Data table — median / p99 µs

The multi-hop reads, once the weak spot, now lead too. "Friends' messages" and the variable-length 2-hop were 3–19× behind at the first comparison; late materialization, a batched frontier expand, and serving checkpointed pages straight from cache turned them into wins at every scale.

02 — Getting data in

Load time & on-disk footprint

The honest counterweight. Load is the whole "ready to serve" cost — parse, bulk build, index, checkpoint. Lattice wins load at SF1 and SF10 — beating both Kùzu and DuckDB — and trails only Kùzu at SF100 (11.9 s vs 5.8 s), where the bulk build writes the bidirectional CSR adjacency the traversal wins above are built on. On disk it stays within 1.15× of Kùzu at every scale. A load-vs-query trade, by design.

← faster  ·  seconds (log)  ·  ● marks the winner
Data table — load s · elements/s · on-disk MB
03 — Graph databases

Head-to-head on Pokec: Memgraph & Neo4j

The real Pokec-medium social graph (100k users, 1.77M edges), same Cypher string on each engine over Bolt. Lattice takes every pattern and traversal query, wins scan-and-return, and — after two-phase parallel aggregation — sweeps whole-graph aggregation too, up to 10× ahead. On single-statement writes it wins durably against Neo4j (3–4×) and, at the same durability level, against non-durable Memgraph too (relaxed mode, 1.3–11×) — uniquely offering both full durability and Memgraph-class latency. Every tab below is real Pokec data, answers proven identical.

← faster  ·  median µs (log)  ·  ● marks the fastest engine
Data table — median µs

04 — In-memory graph: Traverse

Head-to-head on Pokec: Traverse

Truespar Traverse is a new in-memory graph database — Bolt + Cypher, like Memgraph, held entirely in RAM. Its free tier caps at 10,000 nodes / 50,000 edges, so this panel is a smaller Pokec cut — 9,000 users, 45,000 edges — run on all four engines at that scale for a fair comparison (the 100k charts above exceed Traverse's ceiling). Same Cypher, answers proven identical. Lattice — embedded and on-disk — takes every query: every seeded pattern and traversal (~20× ahead, no socket to cross), every whole-graph aggregation, and every scan — including the filtered and multi-hop counts an in-memory engine would be expected to own, because Lattice answers them from node degrees and edge-pair statistics rather than walking (see the Scan tab). Being embedded pays off under load too: concurrent point reads run ~20× Traverse's over Bolt (31k vs 1.5k ops/s, a single client). Concurrent writes can't be put on the same axis at all — a sustained write burst exceeds Traverse's 10,000-node cap and drops the server; the Lattice write-throughput story is the 100k section below (relaxed 11.7k writes/s, past every engine).

← faster  ·  median µs (log)  ·  ● marks the fastest engine
Data table — median µs

05 — Under concurrent load

1, 4, 12 clients: throughput

Throughput, not latency: a 3-second burst of point reads or vertex creates spread across N clients, in ops/second on the Pokec graph. Lattice is embedded — a client is a thread in the process, so a read never pays a socket — where Memgraph and Neo4j answer every op over Bolt. On writes it takes a single writer, but shows two lines: relaxed wins outright at every client count, and durable — crash-safe, one fsync per commit — still scales, because group commit batches those fsyncs, past non-durable Memgraph by 12 clients.

→ more  ·  ops / second (log)  ·  ● marks the highest throughput
Data table — ops / second

06 — The other side of the ledger

What Lattice trades away

No cherry-picking. Two places the numbers go against Lattice, and why.

Trade-off SF100 load

11.9 s vs Kùzu's 5.8 s — the one durable loss (SF1 and SF10 load are wins). The bulk build, most of it, writes the bidirectional CSR adjacency that makes traversals fast: more bytes at lower throughput. Clawing it back would cost the query lead.

Trade-off On-disk size

1.70 GB at SF100 — 1.15× Kùzu, 1.67× DuckDB (and smaller than Kùzu at SF1). Integers are frame-of-reference compressed and strings dictionary-encoded; the bidirectional CSR is the deliberate remainder.