Cypher in Syncretic
The graph is a LadybugDB database, which speaks the Kuzu dialect of Cypher. The same notes the app gives the AI apply to anything you write in Raw Cypher or send through MCP.
Names
Node tables are PascalCase (Concept, FreeEnergyPrinciple), relationship tables UPPER_SNAKE (RELATES_TO; a keyword gets an underscore: CONTAINS_), columns snake_case (year_published). Every table has id STRING PRIMARY KEY. Raw Cypher’s completion and the MCP get_shape tool list them.
Dialect notes
label(n)gives a node’s or relationship’s label; there is nolabels()ortype().- Variable-length paths:
-[:REL*1..3]->, always with an upper bound; shortest:-[:REL* SHORTEST 1..6]->. - A property missing on a node is
NULL:IS NULL/IS NOT NULL. - Strings:
lower,upper,contains,starts_with,ends_with,regexp_matches. - Aggregates group implicitly by the other returned columns.
- Match an id exactly:
MATCH (n {id: upper('5f3a…')})orWHERE r.id = upper('…'). - Two-way connections are stored one way; match them without direction:
(a)-[:RELATES_TO]-(b).
What’s refused
Before running, the guard refuses any of CREATE, MERGE, SET, DELETE, DETACH, REMOVE, DROP, ALTER, COPY, INSTALL, LOAD, ATTACH, USE, EXPORT, IMPORT, BEGIN, COMMIT, ROLLBACK, CHECKPOINT, CALL used as keywords, and more than one statement. What passes runs in a read-only transaction and keeps at most 500 rows (1,000 through MCP).
Queries that work
MATCH (c:Concept) RETURN cMATCH (t:Thinker)-[:PROPOSED]->(c:Concept) RETURN t, cMATCH (c:Concept) WHERE c.year < 1950 RETURN c ORDER BY c.yearMATCH (c:Concept)-[r]-() RETURN c.name AS concept, count(r) AS connections ORDER BY connections DESC LIMIT 5MATCH (s:Source)-[r:SUPPORTS]->(c:Concept) WHERE lower(s.name) CONTAINS 'theory' RETURN s, r, cMATCH p = (a:Concept)-[:RELATES_TO*1..3]-(b:Concept) WHERE a.name = 'Entropy' RETURN pMATCH (c:Concept) RETURN count(c) AS conceptsReturn whole nodes and relationships to see them lit on the canvas; return values for a table or a single stat.