Monarch KG ⇄ dismech gene–disease comparison
Date: 2026-07-30
Issue: #7175 — tripartite gap-exchange (dismech ⇄ Monarch KG ⇄ Mondo)
Scope: the 1,077 kb/disorders entries with a MONDO primary anchor and curated genes (genetic[] or has_subtypes[].genes[]).
Source: Monarch v3 API (api-v3.monarchinitiative.org), Causal + Correlated gene-to-disease edges.
Regenerate:
uv run python scripts/kg_gene_gap_audit.py --tsv research/kg_gene_gap.tsv # resumable via local cache
This is the Monarch KG ⇄ dismech flow of #7175 (two directions at once). For each disease it diffs dismech's curated gene set against the KG's gene–disease edges for the same MONDO term:
kg_only— KG links the gene, dismech does not → dismech coverage gapdismech_only— dismech curates the gene, KG does not → dismech → KG candidate (or to verify)overlap— agreement
Headline
| Metric | Value |
|---|---|
| Diseases compared (MONDO + genes) | 1,077 |
| …with ≥1 KG gene edge | 957 |
| …with no KG gene edge | 120 |
| fetch errors (skipped, ≠ no-edge) | 0 |
| dismech gene assertions | 2,823 |
| KG gene assertions | 6,492 |
| Overlap | 1,989 |
kg_only (raw) |
4,503 |
dismech_only |
834 |
dismech genes are read from both genetic[] and has_subtypes[].genes[]; KG fetches
paginate the full result set; and a fetch that exhausts retries is reported as a
fetch_error (0 here), never cached as a false "no edge."
The raw kg_only is inflated by broad anchors — tier before reading it
28 diseases return >30 KG genes and contribute 3,037 (67%) of the raw kg_only.
These are entries anchored to a broad grouping/parent MONDO term, so the KG returns the
whole family's genes — an anchoring problem, not a per-disease gene gap. This
independently cross-validates the Mondo-anchoring audit:
e.g. ANK2_Related_… and BLOC1S1-related_… both anchor to MONDO:0100038 (complex NDD)
and both return the same 250 genes — the exact shared-anchor pair flagged there.
| Tier (by KG gene count) | Diseases | Reading |
|---|---|---|
| no KG gene edge | 120 | dismech-original curation, or the MONDO term has no KG genes |
| broad-anchor (n_kg > 30) | 28 | broad/mis-anchor — fix the anchor, don't chase "gaps" |
| clean (1–30) | 929 | interpretable; clean kg_only = 1,466 real coverage-gap candidates |
Worst broad anchors: PGM2L1_Deficiency (MONDO:0700092, 702 KG genes vs 1 dismech),
Mediator_Complex_Neurodevelopmental_Disorder (391), Epilepsy (MONDO:0005027, 215),
Inherited_Retinal_Dystrophy (193), MYO6_Hearing_Loss (145). (Full list in the TSV
where n_kg > 30.)
A. dismech coverage gaps (KG has the gene, dismech doesn't)
From the clean subset (interpretable), the highest-value examples where dismech is under-curated relative to the KG:
Glioma(MONDO:0021042): KG adds BRAF, KRAS, FGFR1/3, NF2, NTRK2, TP53, ROS1, MYB…Type_2_Diabetes_Mellitus(MONDO:0005148): KG adds the MODY/T2D panel — GCK, HNF1A/1B/4A, ABCC8, PDX1, NEUROD1, IRS1/2…Brugada_Syndrome(MONDO:0015263): dismech 1 gene vs KG 22 (the SCN/CACN/KCN channel panel)Congenital_Hypothyroidism,Kallmann_Syndrome,Nephronophthisis,Jeune_Asphyxiating_Thoracic_Dystrophy,Inherited_Ichthyosis— each missing much of the KG's established gene panel.
B. Zero-overlap disagreements (both have genes, none shared) — 31
The most diagnostic tier. Two distinct causes, which must be told apart:
B1 — genuine dismech gaps (dismech missing the canonical gene(s)):
- Lynch_Syndrome (MONDO:0005835): dismech has only RPS20; KG has the canonical
MMR set MLH1, MSH2, MSH6, PMS2, EPCAM — a clear, important gap.
- Medullary_Thyroid_Carcinoma (MONDO:0015277): dismech has RAS genes; KG has RET
(the defining MTC gene).
- Ewing_Sarcoma (MONDO:0012817): dismech has STAG2/TP53/CDKN2A; KG has the defining
fusion genes EWSR1, FLI1, ERG, ETV1/4.
- Diffuse_Large_B_Cell_Lymphoma: dismech MYD88; KG BCL2, BCL6, ALK, XPO1.
B2 — anchoring mismatch (dismech curates a valid but different aspect, or the anchor is
too generic):
- Chemotherapy_Induced_Neutropenia → MONDO:0001475 (generic neutropenia): dismech
has the pharmacogenomic UGT1A1; KG returns the congenital neutropenia panel
(ELANE, HAX1, G6PC3…). The dismech concept is anchored to a too-generic term.
- Chemotherapy_Induced_Diarrhea → MONDO:0001673 (diarrheal disease): dismech
UGT1A1/DPYD (pharmacogenomic) vs KG congenital-diarrhea genes — same too-generic anchor,
reinforcing the diarrheal-disease finding in the anchoring audit's Tier 3.
- Type_I_Diabetes: dismech autoimmune-susceptibility panel (CTLA4, PTPN22, INS,
IL2RA…) vs KG HNF1A/IL6 — different, both defensible; a modeling/framing difference.
(Full 31 in the script output and TSV.)
C. dismech_only — genes dismech curates that the KG lacks (834)
The reverse direction — potential dismech → KG contributions, or curation to verify.
This set is less noisy than raw kg_only (a dismech entry rarely over-lists genes). It
includes legitimately dismech-specific curation (e.g. the Type I Diabetes autoimmune
panel above) and is the natural feed for a dismech → Monarch KG hand-off. Per-disease
values are the dismech_only column of the TSV.
Caveats
- Anchor quality gates everything. Read tiered — never the raw
kg_only. Broad/mis-anchored entries (§ tier table) must be fixed at the anchor before any gene-gap reading is valid. - Causal + Correlated only. Other edge types (GenotypeToDisease, variant-level) are not
counted; a gene present only via those routes reads as
kg_only/dismech_onlyhere. - Curation intent differs from the KG. dismech genes carry a
relationship_type(causal / susceptibility / modifier); the KG mixes causal and correlated. Some disagreements are framing, not error (see B2).
Machine-readable worklist
research/kg_gene_gap.tsv — one row per disease: disorder, mondo_id, n_dismech,
n_kg, n_overlap, kg_only, dismech_only (gene lists as HGNC:id(SYMBOL)).
Follow-ups (#7175)
- Disease → phenotype (HP) axis — delivered in
kg-phenotype-gap-audit-2026-07-31.md. - Feed §A/§B1 into curation; feed §C into a dismech → KG contribution set.
- Fix the 28 broad anchors (overlaps the record-altitude policy call, #7178).