Skip to content

v0.23.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 17:43
· 310 commits to main since this release

[0.23.0] - 2026-10-05

Highlights

Writes no longer slow down as the graph grows. Statement atomicity runs
many writes on a copy of the graph. That copy used to cost one refcount per
512 entries, about 220 µs at 2M nodes, and every index insert copied a
1/256th share of its index. Both are now bounded-path copy-on-write
structures. The numbers below are medians at 2M nodes / 8M relationships,
v0.22.3 → v0.23.0:

Write v0.22.3 v0.23.0
SET while any constraint exists 238 µs 11 µs
CREATE on a label with a uniqueness constraint 245 µs 15 µs
Creating an indexed node via the Rust graph API 425 µs 16 µs
Relationship CREATE 290 µs 57 µs

Seek by id. MATCH (n) WHERE id(n) = $id (and IN $list, and
id(r) for relationships) is now a direct lookup instead of a full scan.
At 2M nodes it went from 210 ms to 1.3 µs. Writes such as
MATCH (n) WHERE id(n) = $id SET n.x = $v use it too.

Restarts.

  • A database reopened from a snapshot or the WAL now holds the same index
    memory as the process that wrote it. Before, it was 18–28% more, because
    every property key was hash-indexed on load.
  • Snapshot load is about 2× faster: 17.4 s → 7.9 s at 10M elements.
  • MemoryReport (and wasm memoryReport()) lists each active hash index
    key with its size and whether it is declared.

Read latency is unchanged, except Cypher 2-hop, which is about 6–10% slower
in our runs. Memory per element is unchanged for the graph, and 3–14% lower
for indexes.

Behaviour change

After a restart, the planner has distinct-value statistics only for declared
indexes (RANGE indexes and uniqueness/key constraints), exactly like a
process that never restarted. An equality filter on an undeclared property
can therefore get a different plan than it did after a v0.22 restart, for
example a label scan instead of a property lookup. Query results are
unchanged. If a hot query filters on an undeclared property, declare an
index for it.

Upgrade notes

  • No API, file-format, snapshot or WAL changes. v0.22 snapshots and WALs open
    as before.
  • MemoryReport gains a property_index_keys field (defaulted on
    deserialisation).

Changes

Bug fixes

  • store: Restart rebuilds only declared property indexes (8847a44)

Documentation

  • design: Storage beyond memory, with a storage scaling probe (26f1729)

Features

  • compiler: Seek nodes and relationships by id (21cc9da)

Performance

  • store: Bounded-path copy-on-write index containers (ac83386)
  • store: Clone the graph in O(1) (0cb291e)

Assets

Platform Asset
Linux x86_64 lora-server-v0.23.0-x86_64-unknown-linux-gnu.tar.gz
Windows x86_64 lora-server-v0.23.0-x86_64-pc-windows-msvc.zip
macOS Intel lora-server-v0.23.0-x86_64-apple-darwin.tar.gz
macOS Apple Silicon lora-server-v0.23.0-aarch64-apple-darwin.tar.gz
Full changelog CHANGELOG.md

Each binary archive ships with a matching .sha256 file. An aggregated lora-server-v0.23.0-SHA256SUMS.txt is also attached.

Download, verify, and run instructions: see RELEASING.md and the README.