Skip to main content

Limitations

A single page for every Cypher feature and operational capability LoraDB does not support today, so you can decide whether LoraDB fits your use case and know what to reach for instead. Every unsupported feature below raises a clear error (a parse error, SemanticError::UnsupportedFeature, or UnknownFunction) — nothing silently misbehaves.

Wording convention used below:

  • Not supported — hard absence with no near-term plan.
  • Not yet supported — absence the docs intentionally signal as future capability.
  • Not implemented — the grammar accepts it but the analyzer or executor rejects it today.

For the machine-checkable feature list see the Cypher support matrix in the internal documentation.

At a glance

ThemeBiggest gaps
StorageWAL-backed open exists on Rust, Node, Python, Go, Ruby, and lora-server; WASM stays snapshot-only; no indexes; no constraints
ConcurrencySingle global lock, no timeouts
ClausesNo CALL, FOREACH, LOAD CSV, DDL
PatternsNo quantified path patterns
OperatorsNo BETWEEN; cross-type comparisons return null
AggregatesNo GROUP BY / HAVING keywords
FunctionsNo APOC; ASCII-only case ops
ParametersNo HTTP-level params; no parse-time type check
SpatialNo WKT I/O, no CRS transforms, no bbox predicate
VectorsNo indexes / ANN; no embedding generation; no list-of-vectors properties

Clauses

FeatureStatus
CALL (standalone)Not supported — parses, analyzer rejects with UnsupportedFeature
CALL … YIELDNot supported — parses, analyzer rejects with UnsupportedFeature
FOREACHNot supported
CREATE INDEX / DROP INDEXNot supported
CREATE CONSTRAINT / DROP CONSTRAINTNot supported
LOAD CSVNot supported
USE <graph> (multi-database)Not supported
PROFILENot supported (EXPLAIN is supported)

Patterns

FeatureStatus
Quantified path patterns ((:X)-[:R]->(:Y)){1,3}Not supported
Inline WHERE inside variable-length relationshipsNot implemented — parses but is not evaluated

Operators and expressions

FeatureStatus
BETWEEN a AND bNot supported — use x >= a AND x <= b
Type-mismatch detection in comparisonsNot implemented — cross-type < / > returns null instead of erroring
Aggregates inside WHERENot supported — use WITH … WHERE instead

Aggregates

FeatureStatus
DISTINCT on stdev, stdevp, percentileCont, percentileDiscNot supported — use collect(DISTINCT x) and aggregate the unwound list
GROUP BY keywordNot supported — non-aggregated columns are the implicit group key
HAVING keywordNot supported — filter post-aggregate through WITH … WHERE

Functions

FeatureStatus
APOC-style utilities (apoc.*)Not supported — no compatibility layer
User-defined functionsNot supported — no registration surface
date.truncate unitsOnly "year" and "month"; "quarter" / "week" / "day" not yet supported
datetime.truncate unitsOnly "day", "hour", and "month"; sub-hour units not yet supported
toLower / toUpperASCII-only — Unicode case folding not yet supported
normalize(str)Not yet implemented — placeholder returns its input unchanged

Data types

FeatureStatus
Binary / byte arraysNot supported — store base64 strings
Fixed-precision decimalsNot supported — use scaled integers or strings
User-defined typesNot supported
Numeric overflow guardingNot supported — Rust panics in debug, wraps in release

Spatial

FeatureStatus
WGS-84 3D distance honouring heightNot yet supported — computes surface great-circle only
point.withinBBox()Not yet supported
point.fromWKT() / WKT outputNot yet supported
CRS transformation between SRIDsNot yet supported — cross-SRID distance returns null
Custom SRIDsNot supported — only 7203, 9157, 4326, 4979

Vectors

FeatureStatus
Vector indexes / approximate nearest neighbourNot yet supported — every similarity / distance call is a linear scan over matched candidates
Built-in embedding generationNot supported — no plugin surface; generate embeddings in host code
List-of-vectors as a propertyNot supported — rejected at write time; hang many embeddings off separate nodes
Dimension > 4096Not supported — rejected at construction time
ORDER BY on a VECTOR columnNot implemented — runs without panicking, but ordering is unspecified; order by a scalar score instead
Metric extensions (e.g. Minkowski, Chebyshev)Not yet supported — current metrics are listed in Vectors → Signed distance metrics
Passing a VECTOR parameter over HTTPBlocked by the HTTP parameters limitation below — build the vector with vector(...) in the query string or use an in-process binding

Parameters

FeatureStatus
Parameter as a label or relationship typeNot supported
Parameter type checking at parse timeNot yet supported
Parameters over HTTPNot yet supported — the /query body ignores params; use an in-process binding

Storage

GapImpact
WAL controls are not uniform across bindingsRust and lora-server expose the full WAL surface. Node, Python, Go, and Ruby expose simple WAL-backed initialization only. WASM remains snapshot-only.
Automatic checkpoint loop — not yet supportedCheckpoints are explicit (checkpoint_to(...), POST /admin/checkpoint, or host-driven snapshot saves). Nothing schedules them in the background for you.
Uniqueness constraints — not supportedDuplicates can be created silently; enforce in application code or match before creating
Property indexes — not yet supportedProperty filters without a label are O(n) full scans
Explicit transactions — not supportedEach query is atomic; no multi-query transaction boundary
ID reuse — not supportedDeleting an entity does not free its u64 id

Concurrency

  • A single global lock serialises every query. Concurrent reads do not parallelise.
  • Query timeouts — not supported; a pathological query can hold the lock indefinitely.
  • HTTP rate limiting — not supported.

HTTP server

  • Authentication — not supported. TLS — not supported. Bind to 127.0.0.1 only in production until this changes; see the security notes on the Contact page.
  • Admin endpoints (POST /admin/snapshot/save and /admin/snapshot/load, plus /admin/checkpoint, /admin/wal/status, and /admin/wal/truncate when WAL is enabled) are opt-in via --snapshot-path / --wal-dir and have no authentication. The optional path body field is passed straight to the OS. Do not enable them on a network-reachable host without authenticated ingress in front.
  • Parameters over HTTP — not yet supported (see Parameters above).
  • Multi-database — not supported. One process serves exactly one in-memory graph; run multiple processes for isolation.

Workarounds cheatsheet

Instead ofUse
BETWEEN a AND bx >= a AND x <= b
HAVINGWITH … WHERE
GROUP BY colsNon-aggregated columns in RETURN / WITH
CREATE INDEX ON :L(prop)Scope to a label in MATCH (n:L {…})
CONSTRAINT UNIQUEMERGE on the key + SET
LOAD CSVParse on host, pass as $rows, UNWIND $rows
CALL apoc.…Re-implement in the host language
point.withinBBox()Explicit lat/lon >= / <=
point.fromWKT()Parse host-side, pass as a point param
GROUP BY yearRETURN e.at.year AS year, count(*)
IF/THEN/ELSE expressionsCASE … WHEN … THEN … END
Window function row_number() per groupORDER BY … collect(…)[..N] pipeline
COUNT(*) FILTER (WHERE …)count(CASE WHEN … THEN 1 END)

Out of scope (for now)

These are part of standard Cypher but not on the short-term roadmap:

  • Stored procedures (CALL family)
  • LOAD CSV-based ingestion
  • Schema constraints / indexes at the DDL level
  • Multi-database USE

See Why LoraDB for the project's intended direction.

See also