Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Cypher Language Support

MarsDB implements a real subset of openCypher, checked against the openCypher Technology Compatibility Kit (TCK) — 220 feature files, 3,880 scenarios, vendored as a git submodule and run for real (not just claimed) on every push. The full, exhaustive breakdown — every supported clause/expression/temporal-type shape, the error taxonomy, and this same table with contributor-level detail — lives in CYPHER_COVERAGE.md in the repo root. This page is the condensed, end-user version.

Conformance, by category

categorytotalpasspass %
clauses/call5252100.0%
clauses/create7878100.0%
clauses/delete4141100.0%
clauses/match381381100.0%
clauses/match-where3434100.0%
clauses/merge7575100.0%
clauses/remove3333100.0%
clauses/return6363100.0%
clauses/return-orderby3535100.0%
clauses/return-skip-limit3131100.0%
clauses/set5353100.0%
clauses/union1212100.0%
clauses/unwind1414100.0%
clauses/with2929100.0%
clauses/with-orderBy292292100.0%
clauses/with-skip-limit99100.0%
clauses/with-where1919100.0%
expressions/aggregation3535100.0%
expressions/boolean150150100.0%
expressions/comparison7272100.0%
expressions/conditional1313100.0%
expressions/existentialSubqueries1010100.0%
expressions/graph6161100.0%
expressions/list185185100.0%
expressions/literals131131100.0%
expressions/map4444100.0%
expressions/mathematical66100.0%
expressions/null4444100.0%
expressions/path77100.0%
expressions/pattern5050100.0%
expressions/precedence104104100.0%
expressions/quantifier604604100.0%
expressions/string3232100.0%
expressions/temporal*1004100299.8%
expressions/typeConversion4747100.0%
useCases/countingSubgraphMatches1111100.0%
useCases/triadicSelection1919100.0%
TOTAL3880387899.9%

* The 2 non-passing expressions/temporal scenarios need dates at year ±999,999,999 — a real, structural storage/library-range limitation (not a bug), explained in full in CYPHER_COVERAGE.md.

Reproduce this table yourself:

git submodule update --init marsdb-tck/openCypher
cargo run --release -p marsdb-tck

What’s supported

  • Patterns: MATCH/OPTIONAL MATCH, undirected/bracketless/multi-type/ variable-length relationship patterns, named-path capture (including over variable-length hops), shortestPath(), pattern comprehension, pattern predicates.
  • Reading & filtering: WHERE (property/identity/label comparisons, pattern predicates, STARTS WITH/ENDS WITH/CONTAINS), exists { ... } (both the simple pattern form and the full nested-subquery form, including nested exists {}), UNWIND, any number of chained WITH boundaries, ORDER BY/SKIP/LIMIT, DISTINCT.
  • Writing: CREATE, MERGE (with ON CREATE/ON MATCH), SET, REMOVE, DELETE/DETACH DELETE, MATCH ... CREATE, arbitrary chaining of mutating clauses via trailing WITH or RETURN. MERGE is capped at one relationship hop.
  • Aggregation: implicit GROUP BY, count/sum/avg/min/max/ collect/percentileCont/percentileDisc, DISTINCT inside an aggregate call, aggregate expressions composed with arithmetic.
  • Functions: the standard scalar/string/math/list function set (coalesce, toInteger/toFloat/toString/toBoolean, keys/ labels/type/properties/id, size/length/nodes/ relationships/head/tail/last/range, toUpper/toLower/ trim/replace/split/substring, abs/ceil/floor/round/ sqrt/sign).
  • Temporal types: Date/LocalTime/Time/LocalDateTime/ DateTime/Duration — construction from strings, maps, or another temporal value; comparison; calendar-aware arithmetic; full component access; ISO-8601 string round-tripping.
  • Stored procedures: CALL proc(args) [YIELD ...], both standalone and in-query forms, against a caller-supplied ProcedureProvider — see Embedding in Rust. MarsDB itself ships no built-in procedures.
  • Parameters: $name scalars, lists (including nested lists), and maps.

Known limitations

  • Extreme-year temporal values (year beyond roughly ±262,000): a real storage/library range limit, not planned to change without a breaking on-disk format migration — see the table footnote above.
  • Node/relationship-valued $parameters aren’t supported (a map-valued parameter is).
  • No cost-based query optimizer — index seeks and top-k ORDER BY ... LIMIT selection exist, but join/traversal ordering isn’t cost-estimated. See Architecture.
  • CALL needs an embedder-supplied ProcedureProvider — there’s no built-in procedure catalog.