The problem — Free-text metadata fields look flexible and prove brittle. The same biological object gets labelled "nucleus," "nuclei," "DAPI channel," and "nuclear mask" in four consecutive experiments; the same instrument appears as "Zeiss LSM 880," "LSM880," and "confocal" in three runs from the same facility. Downstream, those strings do not join. A query for all datasets using a particular modality misses half the records; a graph traversal that should connect tools to tasks fragments into isolated nodes. Free-text metadata is not metadata — it is annotation entropy.
What it is / how it works — A controlled vocabulary is a curated, finite set of canonical terms with defined meanings, where each concept has exactly one preferred label and optional synonyms that all resolve to it. In microscopy metadata the primary controlled vocabularies are drawn from OBO Foundry ontologies — the Biological Imaging Ontology (BIBO), the Ontology for Biomedical Investigations (OBI), and the Cell Line Ontology — plus community-specific term lists like those in the REMBI schema and the JUMP-CP plate-metadata standard. When a pipeline writes modality: cell-painting rather than a free-text string, it is committing to a term from the platform taxonomy; when it tags organism: Homo sapiens (NCBI:9606) it is linking to a shared identifier that any database can resolve. The payoff is computable metadata: records annotated with shared terms can be joined across labs, queried by traversal, and validated by schema rather than by human review. This is the mechanism Why Fovea Lab Uses a Knowledge Graph relies on to make tool recommendations that span modalities — every tasks, modalities, and sample_types field resolves to a shared term, so the graph connects what a free-text search would scatter.
Where it breaks — Controlled vocabulary only works if it is enforced at ingestion, not applied retrospectively. A schema that allows free-text fallback will accumulate free-text entries; a pipeline that validates terms on write will not. The second failure mode is vocabulary drift: a term list maintained in a spreadsheet diverges from the schema version the pipeline validates against, and a batch of annotations that passed six months ago fails today. The discipline is to version-pin vocabulary references alongside code — the same way a software dependency is pinned — and validate at ingest.