Web extra · not in the printed book · Part II territory

Chemical Space Has a Shape

Picture a shoebox with 2,200 pinpricks of light floating inside — each pinprick is one molecule, and the three walls it hangs between are how heavy it is, how oily it is, and how much of its skin is polar. Those three readings — molecular weight, logP, and polar surface area — are the molecule’s numeric fibers, the little bundle of numbers each row carries. A row-store sees 2,200 rows; a fiber bundle sees a shape: the drug-like core packed tight in the middle, the fragment corner down low, the greasy tail out along one wall, and a dozen points that sit nowhere at all. Each dot’s brightness is its curvature (κ) — how far from the crowd’s center of gravity that molecule lives — so the corpus itself prices how strange each molecule is. Then a COVER clause carves a slab out of the box and you can watch exactly which geometry a one-line query buys.

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.

x molecular weight · y logP · z TPSA · brightness = κ against the corpus · red = the twelve weirdest
drag to orbit · wheel to zoom

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.