Troubleshooting
Go from a relate error message or exit code to its fix: symptom tables that link each error to its reference entry and to the guide that resolves it.
clicypherhttpboltmcpagents
Before you start: Install relate
This guide shows you how to get from an error to its fix. Find the message in the tables, follow the reference link for the error's cause and exit code, and follow the fix link for the steps. Every row points at a page; the errors reference holds the complete entry for each one.
Prerequisites
- The error's text from stderr and the command's exit code The number a
relaterun returns to the shell; each nonzero value names a class of failure, such as 2 for usage, 5 for conflict, 6 for a rejected statement. Read more in the glossary. relateon yourPATH(Install relate).- To follow along, the shared example graph as
team.rl:
cat > team.cypher <<'EOF'
CREATE (ada:Person {name: 'Ada', role: 'engineer'}),
(grace:Person {name: 'Grace', role: 'engineer'}),
(noor:Person {name: 'Noor', role: 'maintainer'}),
(relate:Project {name: 'relate', language: 'Rust'}),
(tck:Project {name: 'opencypher-tck', language: 'Gherkin'}),
(ada)-[:WORKS_ON {since: 2024}]->(relate),
(grace)-[:WORKS_ON {since: 2023}]->(relate),
(grace)-[:WORKS_ON {since: 2022}]->(tck),
(noor)-[:MAINTAINS]->(relate),
(ada)-[:KNOWS]->(grace);
EOF
relate query --database ./team.rl < team.cypherRead the error
Run the failing command again with --mode envelope and print the exit code. In this example, the store A relate database: a directory, a single .rl file, or :memory:, opened with --database. Read more in the glossary's name is misspelled, tema.rl, so a read-only open finds nothing to open:
relate --database ./tema.rl --read-only --mode envelope "MATCH (p:Person) RETURN count(p) AS people"
echo "exit=$?"The path starts with the working directory, shown as <dir>. The first line is stderr, the second the error object The JSON object a failed query run prints on stdout in the json, jsonl, envelope and speedscope modes: the class, the kind, the message, the exit code. Read more in the glossary on stdout:
Failed to open Relate: storage error: database not found: <dir>/tema.rl
{"error":{"code":"fatal_error","exit_code":1,"kind":"storage","message":"storage error: database not found: <dir>/tema.rl","retryable":false}}
exit=1The error object's code is the class and exit_code the exit code, kind narrows the class, and retryable says whether running the same command again can succeed. retryable is true for a write-write conflict (exit 5) and for a --concurrent-logical-workspace-limit refusal while other statements hold the shared pool (exit 1, kind resource; reachable when statements run concurrently, as under relate serve). A one-shot CLI run meets only the first. A message's start is enough to find its row: <name> marks a part that varies, and … marks text left out.
Find the symptom
Opening a store
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Failed to open Relate: storage locked: <path> | 5 | cli-conflict-locked | Another process holds the store. Share one store between two processes |
Error: Failed to open Relate: storage locked: <path> when relate serve starts | 1 | cli-conflict-locked | The server needs the writer lock. Share one store between two processes |
storage error: database not found: <path> or storage error: read-only open requires an existing database at <path> | 1 | cli-fatal-error-storage | A read-only open never creates a store. Check the path. --read-only |
storage error: WAL checksum mismatch | 1 | cli-fatal-error-storage | A damaged WAL; restore a backup. Recover from a crash |
storage error: unsupported snapshot version <n> or storage error: unsupported graph value encoding: <n> | 1 | cli-fatal-error-storage | A newer relate wrote the store. Upgrade a store |
semantic error: live freshness (WAL follow) is only supported for native directory databases | 1 | --read-only | Follow a directory store. Share one store between two processes |
Error: final checkpoint failed: <reason> | 1 | cli-final-checkpoint-failed | Free disk space and check permissions. Recover from a crash |
| An operating-system I/O failure, such as a disk with no space left | 1 | cli-fatal-error-io | Check the path, permissions, and free space. Choose a store layout |
| Recent writes missing after a crash | — | — | The store ran under a relaxed durability mode. Choose a durability mode |
Memory and size
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
capacity exceeded: used=… limit=… | 1 | engine-graph-size-cap, cli-fatal-error-capacity | A write reached --logical-graph-size-limit. Size a store and its memory |
This statement tried to commit a single WAL record of at least <used>. … | 1 | engine-wal-payload-cap | Commit in smaller transactions. Size a store and its memory |
This statement tried to build a single value of <size>. … | 1 | engine-expression-memory-cap | Build the value in smaller pieces. Limits and sizing |
| The process ends with no relate error while the graph grows | — | — | The operating system stopped it for memory. Size a store and its memory |
Running statements
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
syntax error: parse error: … | 6 | cli-validation-error-syntax | Fix the statement at the reported column. Cypher overview |
semantic error: ParameterMissing: Expected parameter(s): <names> | 6 | engine-parameter-missing | Bind each $name with --param. Script the CLI |
semantic error: WriteOnReadOnlyAccessDatabase: … | 6 | engine-write-on-read-only | Send the write to a writable open. Share one store between two processes |
syntax error: SafeModeViolation: … | 6 | engine-safe-mode-violation | Add the label or the LIMIT. Keep an agent safe |
semantic error: ConstraintValidationFailed: … | 6 | engine-constraint-requires-properties, engine-constraint-property-type | Set the constrained property, with a value of the required type, in the same write. Indexes and constraints |
semantic error: IndexAlreadyExists, semantic error: ConstraintAlreadyExists, semantic error: ConstraintNotFound | 6 | engine-index-already-exists, engine-constraint-already-exists, engine-constraint-not-found | Add IF NOT EXISTS or IF EXISTS. Indexes and constraints |
Unable to drop '<name>': the index belongs to a constraint., semantic error: AlreadyExists: there already exists an index … | 1 or 6 | engine-index-belongs-to-constraint, engine-constraint-index-already-exists | Drop the constraint, not its index; drop a plain index before a constraint on the same property. Indexes and constraints |
type error: VectorIndexDimensionalityMismatch, type error: vector() dimension does not match list | 6 | engine-vector-index-dimensionality-mismatch, engine-vector-dimension-mismatch | Embed with the model the index was built for. Vector search |
syntax error: TraversalDepthExceeded: … | 6 | engine-traversal-depth-exceeded | Lower the hop bound or raise --max-traversal-depth. Limits and sizing |
syntax error: UndefinedVariable: …, UnknownFunction: …, type error: …, ArithmeticError: rounding necessary | 6 or 1 | engine-undefined-variable, engine-unknown-function, cli-validation-error-type, engine-division-by-zero, engine-rounding-necessary | Fix the statement. Cypher overview |
semantic error: NumberOutOfRange and other rejected argument values | 6 | cli-validation-error-argument | Correct the value. Search by vector similarity |
preview feature '<name>' is not enabled: set RELATE_PREVIEW=<name> | 6 | engine-preview-feature-not-enabled | Opt in to the preview feature. Cypher overview |
semantic error: DatabaseNotFound: Graph not found: <name>, Unsupported administration command: <statement>, a USE or WITH refused on an administration command | 6 | engine-database-not-found, engine-unsupported-administration-command, engine-use-on-administration-command, engine-with-on-system | A store has three fixed namespaces. Differences from Neo4j |
A composite-only function, several USE targets in one statement | — | engine-composite-only-function, engine-multiple-use-targets | A statement runs against one graph. Differences from Neo4j |
This database is not queryable. …, a write to system_ontologies | 6 | engine-system-ontologies-not-queryable, engine-system-ontologies-write | Query the neo4j namespace. Limitations |
NestedEvaluationBudgetExceeded: … | — | engine-nested-evaluation-budget | Flatten the nested subqueries. Limitations |
write-write conflict | 5 | cli-conflict-conflict | Run the statement again in a fresh transaction. Transactions and concurrency |
| A uniqueness constraint violated | — | engine-uniqueness-violation | MERGE on the constrained key, or fix the duplicate. Cypher overview |
Cannot change the namespace while a transaction is open. | — | engine-namespace-change-in-transaction | End the transaction first. Transactions and concurrency |
Error: query timed out after <duration>, query cancelled | 7 | cli-timeout, engine-cancelled | Bound the work or raise the timeout. Tune a query |
| A query execution failure while producing rows | 1 | cli-fatal-error-execution | Read the message; it is not retryable. Exit codes and errors |
internal error | 1 | cli-fatal-error-internal | Not the statement's fault. Collect a report |
Flags, environment, and input
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Error: unknown flag: <flag>, Error: unexpected argument: <arg> | 2 | cli-usage-error | Check the command's flags with relate <command> --help. CLI flags |
Error: invalid --param value: parameter <name>: … | 2 | cli-invalid-param | Quote JSON values. Script the CLI |
Error: invalid --namespace: …, Error: --namespace is not valid with pull … | 2 | cli-invalid-namespace, cli-pull-namespace | Use neo4j, system or system_ontologies, and none with pull. CLI flags |
Error: invalid --durability-mode: …, Error: invalid RELATE_DURABILITY_MODE: … | 2 | cli-invalid-env-durability-mode | Use full, everysecond or snapshot. Choose a durability mode |
Error: invalid --logical-graph-size-limit: …, Error: invalid RELATE_LOGICAL_GRAPH_SIZE_LIMIT: … | 2 | cli-invalid-env-logical-graph-size-limit | Write the size in bytes, mb, mib, gb or gib. Size a store and its memory |
Error: invalid RELATE_MAX_ROWS: …, RELATE_AGENT_MODE, RELATE_SAFE_MODE, RELATE_EXPRESSION_MEMORY_LIMIT, RELATE_CONCURRENT_LOGICAL_WORKSPACE_LIMIT or RELATE_MAX_TRAVERSAL_DEPTH | 2 | cli-invalid-env-max-rows, cli-invalid-env-agent-mode, cli-invalid-env-safe-mode, cli-invalid-env-expression-memory-limit, cli-invalid-env-concurrent-logical-workspace-limit, cli-invalid-env-max-traversal-depth | Fix or unset the variable. CLI flags |
Failed to open Relate: semantic error: SemanticError: invalid RELATE_PREVIEW value: … | 1 | cli-invalid-env-preview | Use a feature name from the message's list. CLI flags |
Error: the '<command>' command is not included in this build of relate | 2 | cli-command-not-included | Install a release binary. Install relate |
parquet snapshot codec is not compiled into this build … | — | cli-parquet-not-compiled | Use the JSON codec or a release binary. Storage formats |
Scripts and the shell
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Warning: exiting with an open transaction; rolling back uncommitted changes. … | 1 | cli-open-transaction-at-exit | End the script with .commit or .rollback. Script the CLI |
Error: could not read query input from stdin: <reason> | 1 | cli-stdin-read-error | Pipe valid UTF-8. Script the CLI |
note: write statement changed nothing; the graph is unchanged | 0 | cli-write-changed-nothing | Not an error: the write matched nothing. Script the CLI |
warning: result truncated to 100 rows … | 0 | cli-row-cap-warning | Not an error: --max-rows 0 prints every row. Agent mode |
LOAD CSV file unavailable, LOAD CSV file exceeds byte limit | 1 | cli-load-csv-unavailable, cli-load-csv-byte-limit | Pass --load-csv-dir and keep files under 8,388,608 bytes. Import a CSV |
Agents and the skill
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Error: skill: refusing to touch <dest>: … | 1 | cli-skill-refusing-to-touch | The folder wasn't written by relate. Install the agent skill |
Error: skill: unknown agent: '<name>' | 2 | cli-skill-unknown-agent | Use a name from the valid agents: line. Install the agent skill |
Only MATCH queries are allowed for read-query, Only write queries are allowed for write-query | — | mcp-read-query-only, mcp-write-query-only | The statement went to the other MCP tool. Connect over MCP |
malformed JSON-RPC message: <detail>, unsupported JSON-RPC version '<version>', an unknown method or bad parameters, Error: internal error | — | mcp-parse-error, mcp-unsupported-version, mcp-method-not-found, mcp-invalid-params, mcp-internal-error | The MCP host and server disagree. Connect over MCP |
Serving over HTTP, MCP and Bolt
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
HTTP 401 Unauthorized, or The client is unauthorized due to authentication failure. over Bolt | — | http-unauthorized, bolt-unauthorized | Send the server's password for the user relate. Share one store between two processes |
transaction <id> expired after <n>s idle, transaction registry full: … | — | http-transaction-expired, http-transaction-registry-full | Commit sooner, or raise the server's limits. relate CLI |
query result exceeds max-result-bytes limit of <N> bytes | — | bolt-result-too-large | Return fewer or smaller rows. Tune a query |
| HTTP 400, 404 or 500, a malformed Bolt message | — | http-malformed-or-syntax, http-not-found, http-general, http-internal, bolt-request-invalid | Read the error in the response body. Errors |
MCP over HTTP answers 415, {"error":"the request content type is browser-\"simple\" …"} | — | mcp-http-unsupported-media-type | Send Content-Type: application/json. Serve a store over MCP |
MCP over HTTP answers 401, {"error":"authentication required"} | — | mcp-http-unauthorized | Send Authorization: Basic with the server's credential. Serve a store over MCP |
MCP over HTTP answers 403, {"error":"origin is not allowed"}, or 405 | — | mcp-http-origin-forbidden, mcp-http-method-not-allowed | Send POST requests without a browser Origin, or from a loopback one. MCP server |
Starting relate serve
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Error: serve has nothing to serve: … | 2 | cli-serve-nothing-to-serve | Pass --http PORT, --mcp PORT|stdio or --bolt PORT. relate serve |
Error: serve --<surface> <port>: cannot bind <host>:<port>: <reason> | 1 | cli-serve-bind-failed | Choose a free port, or stop the process that holds it. Serve a store over MCP |
Error: Failed to open Relate: <detail> from relate serve | 1 | cli-serve-open-failed | Stop the other opener, or serve a directory store --read-only beside its writer. Share one store between two processes |
Error: serve takes --read-only after the verb, not before it … | 2 | cli-serve-read-only-before-verb | Put --read-only after serve. relate serve |
Error: --auth: expected user:password or 'none', Error: RELATE_AUTH: …, Error: --auth requires USER:PASSWORD or none | 1 or 2 | cli-serve-auth-malformed, cli-serve-env-auth-malformed, cli-serve-env-auth-empty-side, cli-serve-auth-missing-value | Pass <user>:<password> or none. Authentication and TLS |
Error: serve --mcp stdio skips auth … | 2 | cli-serve-auth-stdio | Drop --auth from a stdio-only command. Connect over MCP |
Copying stores and Neo4j
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Failed to clone database: storage locked: <path> | 1 | cli-clone-locked | Wait for the writer to exit, or clone a directory store. Clone and convert a store |
Failed to clone database: storage error: database not found: <path>, … wal_dir is not supported for .rl single-file databases … | 1 | cli-clone-source-missing-rl, cli-clone-wal-dir-rl | Correct SOURCE; drop --wal-dir for a .rl source. relate clone |
Failed to clone database: semantic error: markdown body properties are set … | 1 | cli-clone-markdown-body-properties-codec | Add --to-snapshot-format markdown, or drop --markdown-body-properties. Clone and convert a store |
Error: destination database is not empty; pull writes into an empty database only … | 1 | cli-pull-destination-not-empty | Pull into a new path. Pull a subgraph from Neo4j |
Error: <name> missing from environment, Error: <name> missing from env file | 1 | cli-pull-credential-missing, cli-pull-env-file-key | Set NEO4J_URI, NEO4J_USERNAME and NEO4J_PASSWORD. Pull a subgraph from Neo4j |
Error: refusing to send Basic auth credentials in the clear: … | 1 | cli-pull-plaintext | Use an https:// NEO4J_URI. relate pull |
Error: shape query RETURN must be graph elements …, Error: pull cannot target :memory: … | 1 or 2 | cli-pull-shape-query, cli-pull-memory | Return nodes, relationships or paths; name a directory or .rl path. Pull a subgraph from Neo4j |
Error: push takes one of --query, --labels, or --types …, Error: --merge-key "<value>" must be NAME:PROP[,PROP] …, Error: --namespace is not valid with push … | 2 | cli-push-one-scope, cli-push-merge-key-format, cli-push-namespace | Pass one selector and <Label>:<property> merge keys. Push a subgraph to Neo4j |
Extensions
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
Error: no installed action '<name>' …, Error: run requires an action name … | 2 | cli-run-not-installed, cli-run-no-action | Install the extension, then name its action. Install and run an extension |
Error: the extension child exited with <n>: <stderr>, Error: the extension wrote no MCP request within 10s | 1 | cli-extension-child-exited, cli-extension-no-request | Read the child's stderr; check the package with relate extension check. Write an extension |
executable: failed: the extension executable <path> is not executable | 2 | cli-extension-check-not-executable | Set the execute bit on the file the manifest names. Write an extension |
Error: extension install: --url accepts only https URLs … | 2 | cli-extension-url-scheme | Use an https:// URL. Install and run an extension |
Error: extension remove: no installed extension '<name>' …, Error: extension init: <dir> already exists … | 1 | cli-extension-remove-not-installed, cli-extension-init-exists | Check the name with relate extension list; choose another directory. relate extension |
Client libraries and the browser
These errors come from a client library, not the CLI, so they have no exit code.
| Symptom | Exit code | Reference | What fixes it |
|---|---|---|---|
librelate_ffi not found; looked in … (Node.js) | — | node-ffi-not-found | Install the package again with its optional dependencies, or set RELATE_LIB. Use the Node.js client |
query params must be a plain object, query params: <path> … (Node.js) | — | node-params-not-object, node-param-not-cypher, node-param-int64-range | Pass one plain object of numbers, strings, booleans, lists and maps. Use the Node.js client |
a synchronous <call> cannot start while an async query is in flight on this connection (Node.js) | — | node-sync-while-async | Await the async query, or use another connection. Use the Node.js client |
storage error: OPFS needs a dedicated worker, storage error: OPFS is not available in this browser | — | wasm-opfs-needs-worker, wasm-opfs-unavailable | Run the engine in a dedicated worker; use an in-memory store where OPFS is missing. Use relate from a web page |
storage locked: opfs://<name>, OPFS name must be 1-64 characters from [A-Za-z0-9_-] | — | wasm-opfs-locked, wasm-opfs-name | Send statements to the worker that holds the store; rename it. Use relate from a web page |
failed to fetch Wasm: <status> <statusText> fetching '<url>' | — | wasm-fetch-failed | Serve relate_bg.wasm beside relate.js. Use relate from a web page |
null out pointer (C) | — | c-null-out-pointer | Pass a pointer to a variable for the call to fill. Use the C ABI |
Client library errors lists every client message, including the exception classes of each language.
Collect a report
When a row says to report, or no row fits, these four things let someone else reproduce the problem without your data:
| Part | How to get it |
|---|---|
| The relate version | relate --version; relate --version --json adds the operating system and architecture |
| The store's layout, format, and counts | relate info --database <path> --json, which reads metadata only: layout, format, counts, and each index and constraint with its label and property keys, never property values |
| The error object and exit code | The failing command with --mode envelope, then echo "exit=$?" |
| The statement and the flags | The command line as run, with any RELATE_ environment variables that were set |
The version check prints two lines:
relate --versionRelate v0.1.2
License: Apache 2.0 (binary)Verify
After the fix, the command that failed exits 0. With the store's name spelled right:
relate --database ./team.rl --read-only --mode envelope "MATCH (p:Person) RETURN count(p) AS people"
echo "exit=$?"{"columnTypes":["INTEGER"],"columns":["people"],"notifications":[],"planCache":"miss","rows":[{"people":3}],"timings":{"elapsed_ms":0.339834,"execute_ms":0.17541700000000002,"lex_parse_ms":0.028416999999999998,"lower_ms":0.041665999999999995,"parse_ms":0.102959,"plan_ms":0.052375,"result_generation_ms":0.00033299999999999996,"rewrite_ms":0.008291999999999999},"truncated":false}
exit=0If it goes wrong
- The message is in no table. Search the errors reference for its first words; it lists every error with its cause and remedy.
- The exit code is 3, 4, or 8. relate reserves those codes and doesn't produce them. Check which program in the pipeline returned it (exit codes).
internal error. An engine invariant failed, which is not the statement's fault. Collect a report with the statement that caused it.
Related
- Errors: every error, its cause, remedy, and exit code.
- Exit codes and errors: the exit code table and the error object's fields.
- Recover from a crash and Share one store between two processes: the two storage guides this page links most.