Scope corrected 2026-09-20. This was filed as "three prefixes are missing". An ignore-independent scan of every record in all nine measured corpora shows the omission is far wider: the census misses twelve of ProteinTraitsMech's namespaces, several larger than anything it does count.
What the census does not count
Structured CURIEs only (id:/list-item position), excluding each Mech's own minted ids and schema metamodel prefixes (biolink, rdfs, skos):
| occurrences |
prefix |
Mech |
| 617,470 |
CATH |
ProteinTraitsMech |
| 446,166 |
CDD |
ProteinTraitsMech |
| 336,591 |
PROSITE |
ProteinTraitsMech |
| 152,324 |
ECOD |
ProteinTraitsMech |
| 68,418 |
SCOP |
ProteinTraitsMech |
| 44,728 |
IEDB |
ProteinTraitsMech |
| 40,653 |
GOC |
ProteinTraitsMech |
| 27,720 |
AlphaFoldDB |
ProteinTraitsMech |
| 20,000 |
OrthoDB |
ProteinTraitsMech |
| 17,835 |
SMART |
ProteinTraitsMech |
| 15,541 |
PANTHER |
ProteinTraitsMech |
| 14,863 |
pdb.ligand |
ProteinTraitsMech |
| 3,611 |
UNII |
AntibioticMech |
| 3,449 |
genbank |
NaturalProductMech |
| 3,236 |
komodo.medium |
CultureMech |
| 2,833 |
TOGO |
CultureMech |
| 2,829 |
mediadive.medium |
CultureMech |
| 2,058 |
pubchem.aid |
NaturalProductMech |
| 1,732 |
reaxys |
AntibioticMech |
| 1,232 |
pubchem |
NaturalProductMech |
| 1,176 |
mediadive.solution |
CultureMech |
| 1,062 |
patent |
AntibioticMech |
Smaller: kegg.compound 862, wikipedia.en 738, kegg.drug 598, uniprot.location 583, MEDIADB 459, drugcentral 435, kgmicrobe.ingredient 366, kgmicrobe.compound 232, CCAP 76, cyanometdb 56, bergey 55, chembl 41, UO 17, lotus 9, RNAcentral 3, RCSB_PDB 3, CryoETDataPortal 2, HAO 2.
For scale: CATH alone is the fleet's fourth-largest namespace, behind only InterPro (1.56M), UniProt (770k) and PMID (658k). ProteinTraitsMech's card already names CATH, SCOPe, ECOD, PROSITE and CDD among its sources, so the page advertises groundings its own heatmap does not count.
Two genuine normalisation bugs
pubchem (lowercase, 1,232 in NaturalProductMech) is not folded into PubChem, although pubchem.compound is. The same registry is counted under one spelling and dropped under another.
RCSB_PDB is not folded into PDB.
Candidates for the same treatment: kegg.compound/kegg.drug → KEGG, mediadive.medium/.solution/.ingredient → MediaDive (only mediadive.compound is mapped today).
Why this is not a quick fix
The alternation P is a hand-maintained allowlist, so every omission is silent — nothing fails when a namespace is missed. Extending it is not mechanical, because it forces a definition the pipeline has never written down: what counts as a vocabulary?
- Each Mech's own minted ids (
proteintraitsmech: 91,559, CultureMech: 7,951, naturalproductmech: 6,604 …) are identity, not citation, and must stay out.
- Schema metamodel prefixes (
biolink 184,587, skos, rdfs) describe the model, not the records.
- Cross-Mech references (
MediaIngredientMech: 1,166 in CultureMech) are already the cross-reference list's job, not the heatmap's.
- Registry identifiers (
genbank, patent, reaxys, UNII) are not ontologies. The page's own note already hedges on this for IMG and BacDive.
Adding twelve columns also reshapes the heatmap: the vocabulary tile jumps, column ordering shifts, and ProteinTraitsMech's row would dominate the scale even more than it already does.
Suggested approach
- Decide the inclusion rule and write it in
roots.py beside CITATION, which already records one such decision.
- Derive the allowlist from each Mech's schema
prefixes: block rather than hand-maintaining P, so a new namespace cannot be silently dropped again.
- Fix the two normalisation bugs regardless — they are wrong under any rule.
- Rerun
prefix_census.py → build_subsets.py → build_data.py → assemble_page.py and look at the heatmap before committing.
Evidence produced by scanning all 448,844 records across the nine measured corpora (~4 min). Not fixed in #89: that branch refreshes the numbers within the current methodology, and this changes the methodology and the figure.
Scope corrected 2026-09-20. This was filed as "three prefixes are missing". An ignore-independent scan of every record in all nine measured corpora shows the omission is far wider: the census misses twelve of ProteinTraitsMech's namespaces, several larger than anything it does count.
What the census does not count
Structured CURIEs only (
id:/list-item position), excluding each Mech's own minted ids and schema metamodel prefixes (biolink,rdfs,skos):Smaller:
kegg.compound862,wikipedia.en738,kegg.drug598,uniprot.location583,MEDIADB459,drugcentral435,kgmicrobe.ingredient366,kgmicrobe.compound232,CCAP76,cyanometdb56,bergey55,chembl41,UO17,lotus9,RNAcentral3,RCSB_PDB3,CryoETDataPortal2,HAO2.For scale: CATH alone is the fleet's fourth-largest namespace, behind only InterPro (1.56M), UniProt (770k) and PMID (658k). ProteinTraitsMech's card already names CATH, SCOPe, ECOD, PROSITE and CDD among its sources, so the page advertises groundings its own heatmap does not count.
Two genuine normalisation bugs
pubchem(lowercase, 1,232 in NaturalProductMech) is not folded intoPubChem, althoughpubchem.compoundis. The same registry is counted under one spelling and dropped under another.RCSB_PDBis not folded intoPDB.Candidates for the same treatment:
kegg.compound/kegg.drug→ KEGG,mediadive.medium/.solution/.ingredient→ MediaDive (onlymediadive.compoundis mapped today).Why this is not a quick fix
The alternation
Pis a hand-maintained allowlist, so every omission is silent — nothing fails when a namespace is missed. Extending it is not mechanical, because it forces a definition the pipeline has never written down: what counts as a vocabulary?proteintraitsmech:91,559,CultureMech:7,951,naturalproductmech:6,604 …) are identity, not citation, and must stay out.biolink184,587,skos,rdfs) describe the model, not the records.MediaIngredientMech:1,166 in CultureMech) are already the cross-reference list's job, not the heatmap's.genbank,patent,reaxys,UNII) are not ontologies. The page's own note already hedges on this for IMG and BacDive.Adding twelve columns also reshapes the heatmap: the vocabulary tile jumps, column ordering shifts, and ProteinTraitsMech's row would dominate the scale even more than it already does.
Suggested approach
roots.pybesideCITATION, which already records one such decision.prefixes:block rather than hand-maintainingP, so a new namespace cannot be silently dropped again.prefix_census.py→build_subsets.py→build_data.py→assemble_page.pyand look at the heatmap before committing.Evidence produced by scanning all 448,844 records across the nine measured corpora (~4 min). Not fixed in #89: that branch refreshes the numbers within the current methodology, and this changes the methodology and the figure.