A PDF is not something you can reason about.
A clause inside it is.
Declare
Entities are the objects that matter. Edges are how they relate. Both are DDL.
CREATE ENTITY research.Paper ( doi TEXT KEY, title TEXT ) ROOT SINGULAR PER DOC;
Extract
Bind a corpus to the ontology and run it. Documents are read in place, with lineage kept.
BIND CORPUS library TO ONTOLOGY research; RUN BINDING library.research;
Query
Traverse the edges you declared. Aggregate, search, join to external APIs.
SELECT a.full_name, COUNT(*) AS n FROM library.Paper p JOIN library.Author a VIA p.written_by GROUP BY a.full_name;
Self-hosted
A single Go binary against Postgres, pgvector and OpenSearch. Documents are read in place from the source system, never copied into a new store.
You define it
No fixed shape to bend to. CREATE ENTITY and CREATE EDGE declare what matters; extraction fills it, with lineage back to the source on every row.
Fail-closed reads
Corpus grant, corpus membership and per-document ACL are AND-composed into the scan. An entity scan cannot be built without a document filter.
Everything, documented.
What SerchaQL is
The four nouns, the permission model, and why KEY is not a primary key.
A worked example
A document corpus taken end to end, one statement at a time.
Language reference
Every DDL, DML and access-control statement, with runnable examples.
API reference
The full REST surface, generated from the OpenAPI spec.
One endpoint. Every statement.
DDL, DCL, DML, SHOW, DESCRIBE, EXPLAIN and RUN BINDING all go through POST /api/v1/query.