Skip to main content
Neo4j is Warden’s third engine, and its first statement-shaped one since PostgreSQL. Agents write Cypher strings, so the connector parses what they wrote with a small refuse-by-default grammar rather than with regular expressions — a regex guard is defeated by a comment, a stacked statement, or a write nested in a read-shaped clause.

What it provides, and who provides it

Identity stays gateway-enforced even on Enterprise: Community has no per-user roles, and per-lease database users are a follow-up, not something this connector mints quietly. A policy requiring more than enforced identity refuses to start on a Neo4j connection.

The governed subset

One leading MATCH with an optional WHERE, followed by exactly one of RETURN, CREATE, SET, or DELETE/DETACH DELETE — or a standalone CREATE. Parameters are positional ($0, $1, ...) and stay bound all the way to the driver. A parameter in a label or relationship-type position is refused: it would let the agent choose the label at execution time. Everything else is refused outright: WITH, UNION, MERGE, CALL (and so every apoc.* procedure), LOAD CSV, FOREACH, UNWIND, OPTIONAL MATCH, REMOVE, whole-node assignment, function calls in RETURN, variable-length relationships, and stacked statements. A filter the subset accepts but cannot normalize — a regex, a function call, a nested expression — fails the statement instead of executing with a filter Warden did not understand. Comments are inert by construction: what the lexer strips cannot execute, so MATCH (o:Order) // DETACH DELETE o is a read and nothing else.

Writes carry the scope too

Reads and deletes are restricted by conjoining the lease’s bindings into the filter, on every variable bound to a scoped label — a label matched under two variables with the condition on only one would still read the other’s records. Writes are restricted by what they write: a CREATE must state the lease’s value inline for every scoped label it creates, and a SET may not move a node out of scope. Anything else is refused rather than corrected, so the operation that executes is the one a reviewer approved.

Setting it up

database defaults to neo4j, which is the only database Community serves — refusing an empty value would make every Community deployment fail to start over a setting it cannot use. Set labels on any non-trivial graph; without it the catalog includes every label. Use a least-privilege role: the connector needs to read and write data, never to manage users or databases.

Known gaps

  • Native per-lease principals. Not minted on any edition yet; Enterprise RBAC could back them in a follow-up.
  • Relationship scoping is not supported.
  • The subset is narrow on purpose. MERGE, aggregations, and path queries are refused today; broadening it means proving each addition against the adversarial corpus first.