Raw queries against the cell_field table.
Named-relation primitive: each row is (source_id, name) → target_id,
a JSON-object-shaped edge from one cell to another. (source_id, name)
is unique — one target per name per source. Multiplicity by composition
(target a collection cell whose items[] are the multi-valued tags),
not by allowing duplicate field rows.
Reads filter both endpoints by cell.deleted_at IS NULL so relations
dangling off a soft-deleted cell don't surface to the live graph.
query_cell_field_set upserts on the (source_id, name) PK so
re-pointing a name updates target_id in place — JSON-object semantics
(obj.foo = bar overwrites whatever was there).