Every dot in the cube above is one row in GIGI. The chembl
bundle holds 2,200 records — one per molecule — keyed by
chembl_id (the ChEMBL-style handle like CHX-0042) and
carrying three numeric readings per row: mw (molecular weight in
daltons), logp (how greasy vs. how water-friendly), and
tpsa (polar surface area, in square ångströms). Twelve of
those rows are planted troublemakers — the red dots you can see wandering
the empty corners.
Because GIGI is a fiber-bundle database, the corpus’s own shape
rides along with every read: each row’s curvature (κ) — how
far it sits from where the crowd lives — is computed against the other
2,199, no sidecar service asked. The queries below let you carve slabs out of
that cube with a one-line COVER and watch the slab’s average
κ tell you whether you cut through the drug-like core or slid out along
a greasy edge.
The corpus here is synthetic but ChEMBL-shaped (the public instance
allowlists a chembl bundle for exactly this experiment) — three seeded
populations plus dust plus twelve planted outliers. The point survives the
simulation: κ found all twelve without being told there were twelve, because an
outlier in any fiber pays in the same currency. And notice what the COVER
slabs teach — WHERE logp > 5 doesn't just filter rows, it selects a
region, and the region's average κ tells you whether you carved through the
core or out along an edge of the distribution.
The same thing in GQL — run it against an engine
Create the bundle on your own engine (start it with
GIGI_CORS_ORIGIN=* for browser access — dev only), insert a few rows — sections, one per molecule —, and the COVER/INTEGRATE statements below are the queries the buttons
above are imitating.
—