Cypher Compatibility Matrix
This section provides a comprehensive overview of Cypher language features and their support status in ArcadeDB’s native OpenCypher implementation.
OpenCypher TCK Compliance
ArcadeDB’s OpenCypher implementation has been validated against the official OpenCypher Technology Compatibility Kit (TCK) version 9, developed by Neo4j and released under the Apache License 2.0.
| Metric | Value | Status |
|---|---|---|
TCK Pass Rate |
97.8% |
✅ Production Ready |
Total Scenarios |
3,897 |
Official OpenCypher v9 test suite |
Passed |
3,812 |
Full compatibility with core features |
Failed |
0 |
All executable tests pass |
Skipped |
85 |
Documented limitations (2.2%) |
|
Verify TCK Compliance Yourself To run the OpenCypher TCK tests on your system:
The TCK test suite is located at: For more information about the OpenCypher TCK, visit: https://github.com/opencypher/openCypher/tree/master/tck |
Known Limitations
The 85 skipped scenarios (2.2%) represent either architectural design choices or edge cases that rarely occur in production use. The following limitations affect 85 TCK scenarios (2.2%) and represent either design choices or rare edge cases.
1. Temporal Range Limitation (Java Platform Constraint)
TCK Impact: 4 scenarios (temporal sorting with extreme date ranges)
Reason: ArcadeDB uses Java’s LocalDateTime with nanosecond precision stored as a 64-bit long, limiting the date range to approximately 1677-2262.
Examples that don’t work:
// Year 0001 with nanoseconds - exceeds range
CREATE (:Event {datetime: localdatetime({year: 1, month: 1, day: 1,
hour: 1, minute: 1, second: 1,
nanosecond: 1})})
// Year 9999 with nanoseconds - exceeds range
CREATE (:FutureEvent {datetime: localdatetime({year: 9999, month: 9, day: 9,
hour: 9, minute: 59, second: 59,
nanosecond: 999999999})})
Workaround: Use dates within the 1677-2262 range (covers virtually all real-world data), or store historical dates as strings.
2. Case-Insensitive Identifiers (By Design)
TCK Impact: ~40 scenarios (case-sensitive type/property names)
Reason: ArcadeDB follows SQL conventions where identifiers are case-insensitive, providing consistency across query languages.
Examples that don’t work:
// These create a collision - T2 and t2 are considered the same type
CREATE ()-[:T2]->()
CREATE ()-[:t2]->() // ❌ Conflicts with :T2
Workaround: Use distinct type names (e.g., :Type2 and :Type2Alt).
3. Variable-Length Path with USING Clause (Advanced Feature)
TCK Impact: ~20 scenarios (VLP with relationship list constraints)
Reason: The USING clause for constraining VLP traversal to specific relationship lists is an advanced feature rarely used in production.
Examples that don’t work:
// Collect relationships, then traverse using only those relationships
MATCH ()-[rels]->()
MATCH (a)-[*2 USING rels]->(b) // ❌ USING clause not implemented
RETURN a, b
Workaround: Use standard VLP with relationship type filters:
MATCH (a)-[:TYPE*2]->(b) // ✅ Works - filters by type
RETURN a, b
4. Cross-Type Comparison Strictness (Semantic Edge Case)
TCK Impact: ~20 scenarios (incompatible type comparisons)
Reason: Comparing fundamentally different types (nodes vs strings, paths vs primitives) in production code typically indicates a query error.
Affected: Strict null-return semantics for cross-type comparisons.
5. User Functions Support
TCK Impact: 0 scenarios (extension feature)
ArcadeDB enhances OpenCypher with user-defined functions in 4 languages:
// Define in SQL
DEFINE FUNCTION math.sum "SELECT :a + :b" PARAMETERS [a,b] LANGUAGE sql
// Define in JavaScript
DEFINE FUNCTION js.greet "return 'Hello ' + name" PARAMETERS [name] LANGUAGE js
// Define in OpenCypher
DEFINE FUNCTION cypher.double "RETURN $x * 2" PARAMETERS [x] LANGUAGE opencypher
// Call from any query language
RETURN math.sum(3, 5) // Works in Cypher, SQL, Gremlin, etc.
See User Functions for complete documentation.
Not Implemented Features
The following Cypher features are not currently implemented:
-
Index hints:
USING INDEX n:Person(name)- Query planning is automatic via cost-based optimizer
Architectural Differences from Neo4j
While implementing the OpenCypher standard, ArcadeDB differs from Neo4j in these intentional design choices:
-
Case-Insensitive Identifiers: Type names and property keys follow SQL conventions
-
Multi-Model Database: Supports Document, Key-Value, and Graph models in one database
-
Native Indexing: Uses LSM-Tree indexes optimized for write-heavy workloads
-
Query Language Flexibility: Supports SQL, Cypher, Gremlin, GraphQL, and MongoDB Query Language on the same data
-
User Functions: Dynamic functions in 4 languages (SQL, JavaScript, OpenCypher, Java) vs Neo4j’s Java-only compiled plugins