Docs
View as markdown

Changelog

What each relate release added, changed, deprecated, removed and fixed, newest first, with the deprecation policy and a JSON feed.

Releases are newest first. Each is at the anchor #<version>, and #since-<version> marks where the changes after that version begin. The same entries are a JSON feed at /docs/changelog.json.

No release after 0.1.2 is listed yet.

0.1.2

Released 2026-11-09. Changes since 0.1.1.

Element ids carry the database's name, and a shortest path between two endpoints matched by property maps is searched from both ends.

Changed

  • Breaking. elementId() names the database: the first node of the default database is 4:relate-neo4j:n0 and its first relationship 5:relate-neo4j:r0, where 0.1.1 returned 4:relate:n0 and 5:relate:r0, and the clients, JSON output and Bolt carry the same strings. See Types and values, Functions.
  • A shortestPath whose two endpoints are matched by property maps looks up both endpoints and searches from both ends at once.
  • Opening a store whose write-ahead log replays nothing no longer rebuilds its indexes.
  • relate upgrade no longer prints the notice of the rename after its status line.

0.1.1

Released 2026-11-09. Changes since 0.1.0.

Full-text search reads the index's query syntax and ranks by BM25, and the Parquet codec can store each promoted property in a column of its own.

Added

  • --snapshot-format parquet-wide, on a query run and on relate serve, which gains the flag: the Parquet codec writes one typed column per promoted property key, and from the store's next checkpoint on every later open keeps it wide. See Storage formats, CLI flags.
  • Full-text search pages with SKIP and OFFSET, and WITH ANALYZER is evaluated per row, English stemming included.

Changed

  • Breaking. Full-text search passes the query string to the index's query syntax, so AND and NOT are operators while a lowercase and stays a term, and it ranks hits by BM25 scores, so a hit's score and the order of hits can differ from 0.1.0. See Full-text and hybrid search, Search.
  • Breaking. The Java client's QueryType, Namespace, Severity and Category are enums instead of strings, and PlanActual carries the whole plan shape. See Java API.
  • POINT indexes seek radius and bounding-box queries through an R*-tree.
  • The variable-shadowing notification also looks inside the bodies of EXISTS, COUNT and COLLECT subqueries.

Fixed

  • round() on a decimal, the sort order of temporal values, and the type of a nested list whose elements have mixed types.
  • A list value at a WHERE or FILTER position is coerced to a predicate.
  • FINISH is accepted after a catalog command that returns rows, and a schema command runs only as a statement of its own.

0.1.0

Released 2026-11-09. Changes since 0.16.1.

The first release published as relate, which restarts the version line at 0.1.0 after cypherlite's 0.16.1: the release assets are relate-<os>-<arch> and relate-ffi-<target>.tar.gz, and the signer and the signature namespace are relate-release, with the same key.

Added

  • Every machine-readable result carries per-phase timings and the plan cache's outcome: --mode envelope and --mode json add a timings object and planCache, --mode jsonl ends each statement with a line holding both, --mode toon ends with timings: and planCache: entries, the envelope of MCP and the WebAssembly build adds lex_parse_ms, rewrite_ms, lower_ms, result_generation_ms and plan_cache, and the Rust crate's QueryResult adds the same four timings and plan_cache(); the C ABI and the other clients expose none of them yet. See Output modes.
  • The FOR clause runs without a preview gate.

Changed

  • Breaking. --mode json prints an object for every statement, {"data": [...], "planCache": ..., "timings": {...}}, where 0.16.1 printed a bare array for a result the row cap did not cut. See Output modes.
  • Breaking. --mode jsonl prints one more line per statement, its timings, so a statement with no rows prints that one line instead of nothing. See Output modes.
  • Breaking. relate clone refuses a markdown store as the source of a .rl bundle unless --to-snapshot-format names parquet or json, with Failed to clone database: semantic error: markdown body properties are set but the store's snapshot codec is parquet, not markdown; the configuration would be ignored. See relate clone.
  • Usage metrics are written to a local spool at exit and sent by the next run, so an exit never waits on the network, and RELATE_TELEMETRY_FLUSH_MS is removed; relate telemetry off deletes the spool. See Privacy and telemetry.

Fixed

  • coll.max() returns null when the list holds a null, as Neo4j does.
  • toString() of a path and an index into a null string return what Neo4j returns.
  • A count-style aggregate over a repeated node variable counts only self-loops.
  • In the Swift client, transaction(_:) rolls back when commit() throws.

0.16.1

Released 2026-11-04. Changes since 0.16.0.

The last release published under the name cypherlite: its release assets carry that name, and a successful cypherlite upgrade ends with a notice of the rename and the relate install command.

Changed

  • Breaking. The C ABI is the typed ABI v2: relate_abi_version() returns 2, values are read through typed accessors instead of JSON strings, parameters are passed through a typed builder instead of a JSON string, and an error arrives as one object with code, gql_status, stage, retryable and message.
  • The Python binding and the Java, JavaScript, Go and Swift clients use the typed ABI v2.
  • The typed parameter builder is bounded: at most 100,000 entries per container, 4 KiB per name, and 16 MiB in all.
  • A bookmark carries the engine's commit sequence, through the C ABI, Python and Bolt.
  • An error of the internal class crosses the C ABI with a generic message; the internal detail stays inside the engine.
  • Breaking. A non-boolean value where Cypher requires a boolean, such as a quantifier's WHERE or an operand of AND, OR or XOR, fails with InvalidArgumentType instead of a generic syntax error.
  • Breaking. A clause that reads an entity it creates fails with Entity, '<name>', cannot be created and referenced in the same clause, and a CREATE or MERGE whose node is bound to null fails instead of creating a new node.
  • Breaking. An administration command with a USE clause that names a graph other than system fails with UseClauseWithAdministrationCommand. See Errors.

Removed

  • Breaking. The apoc.coll.sort spelling: a call fails as an unknown function, UnknownFunction: unknown function apoc.coll.sort(), and coll.sort is the replacement. See Errors.

Fixed

  • A frontier search that exhausts its re-arrival budget falls back to the plain walk instead of dropping endpoints, which could make count(DISTINCT n) return 0 on a dense clique.
  • push keeps a node's secondary labels and merges on its keyed label, so an update no longer creates a second node.

Deprecation policy

relate is pre-1.0. Its releases follow semantic versioning, under which anything can change in a 0.x release, a patch release included: 0.16.1 removed the apoc.coll.sort spelling and replaced the C ABI with an incompatible typed one.

A change that can make working code or statements fail is marked Breaking in the entry of the release that ships it, under Changed or Removed, with its replacement when there is one. A feature that still works but is to be removed is listed under Deprecated in the release that deprecates it.