kg_microbe/utils/mapping_file_utils.py:load_metpo_mappings (around L270, L315) reads:
biolink_equivalent = row.get("biolink equivalent", "").strip()
and uses tree-traversal logic to find the closest ancestor that has a biolink_equivalent value, then maps that to a Biolink predicate via range_to_predicate.
The METPO classes-tab template (Google Sheet 1_Lr-9_5QHi8QLvRyTZFSciUhzGKD4DbUObyTpJ16_RU, exported to berkeleybop/metpo:src/templates/metpo_sheet.tsv) does not have a column called biolink equivalent. The Biolink-mapping columns that exist are:
biolink close match (col 9, ROBOT directive AI skos:closeMatch)
biolink broad match (col 24, added today; ROBOT directive AI skos:broadMatch)
Result: biolink_equivalent is the empty string for every row, the tree-traversal never finds a non-empty parent value, and downstream predicate selection silently falls back to the default ("has phenotype") and to the subject_label/notes heuristics in _resolve_biolink_predicate. The METPO sheet's SKOS mappings are not consumed at all.
Suggested fix: read from biolink close match (and optionally biolink broad match) instead of biolink equivalent. METPO maintainers use SKOS predicates deliberately; this is the canonical signal, not a missing parallel column.
Discovered while investigating berkeleybop/metpo#423.
🤖 Generated with Claude Code
kg_microbe/utils/mapping_file_utils.py:load_metpo_mappings(around L270, L315) reads:and uses tree-traversal logic to find the closest ancestor that has a
biolink_equivalentvalue, then maps that to a Biolink predicate viarange_to_predicate.The METPO classes-tab template (Google Sheet
1_Lr-9_5QHi8QLvRyTZFSciUhzGKD4DbUObyTpJ16_RU, exported toberkeleybop/metpo:src/templates/metpo_sheet.tsv) does not have a column calledbiolink equivalent. The Biolink-mapping columns that exist are:biolink close match(col 9, ROBOT directiveAI skos:closeMatch)biolink broad match(col 24, added today; ROBOT directiveAI skos:broadMatch)Result:
biolink_equivalentis the empty string for every row, the tree-traversal never finds a non-empty parent value, and downstream predicate selection silently falls back to the default ("has phenotype") and to thesubject_label/notesheuristics in_resolve_biolink_predicate. The METPO sheet's SKOS mappings are not consumed at all.Suggested fix: read from
biolink close match(and optionallybiolink broad match) instead ofbiolink equivalent. METPO maintainers use SKOS predicates deliberately; this is the canonical signal, not a missing parallel column.Discovered while investigating berkeleybop/metpo#423.
🤖 Generated with Claude Code