Subtrack 2 — Submission Format
One ranking per query — a best-first order over that query's 100 candidates, in either LIST or BLOCK TSV form, using full OWL IRIs.
For each query in a pair’s local.test.cands.tsv, your system submits one ranking of that query’s 100 candidates, best-first. See the Subtrack 2 task description for the setting and metrics.
Candidates are full OWL IRIs (Track 1 serialisation). The scorer aligns submissions to pools by the source entity, and every candidate in a query’s pool must appear exactly once in your ranking (the validator rejects a ranking that is not a permutation of the pool).
Two accepted TSV encodings
validate_ranking.py and score_local.py accept either encoding; pick whichever your pipeline emits.
LIST format — one row per query
A tab-separated file with a header SrcEntity and RankedCandidates, where RankedCandidates is a JSON array of all 100 pool IRIs ordered best-first:
SrcEntity RankedCandidates
http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C3262 ["http://purl.obolibrary.org/obo/DOID_162", "http://purl.obolibrary.org/obo/DOID_1612", "..."]
BLOCK format — one row per candidate
A tab-separated file with a header SrcEntity, TgtCandidate, Score, holding 100 rows per query (one per candidate). The scorer groups rows by SrcEntity and ranks each block by descending Score:
SrcEntity TgtCandidate Score
http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C3262 http://purl.obolibrary.org/obo/DOID_162 0.98
http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C3262 http://purl.obolibrary.org/obo/DOID_1612 0.41
...98 more rows for this source entity...
Both encodings express the same thing: a total order over each query’s 100 candidates. In LIST form you commit to the order directly; in BLOCK form the order is induced by the scores (ties are broken by the scorer deterministically).
Worked example
Given a query whose gold target is http://purl.obolibrary.org/obo/DOID_162, a strong system ranks it first. In LIST form:
SrcEntity RankedCandidates
http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C3262 ["http://purl.obolibrary.org/obo/DOID_162", "http://purl.obolibrary.org/obo/DOID_1612", "..."]
Because the gold is at position 1, this query contributes Hits@1 = Hits@5 = Hits@10 = 1 and reciprocal rank 1.0.
Validate (participant) — scoring is organiser-side
The official gold is private, so you validate the format and submit; the organisers score. validate_ranking.py checks that every query in the pool is present and that each ranking is a permutation of its 100-candidate pool:
python scoring_kit/validate_ranking.py bio-ml/NCIT-DOID/local.test.cands.tsv my_ncit-doid.tsv
To estimate MRR / Hits@k before submitting, self-score against the gold-bearing validation pool (local.valid.cands.tsv doubles as the gold TSV — its SrcEntity / TgtEntity columns are the answer):
python scoring_kit/score_local.py my_dev_ranking.tsv bio-ml/NCIT-DOID/local.valid.cands.tsv