FAQ¶
Answers to recurring questions about how ClinVar content appears in ClinVar-GKM. Each answer states where the behavior comes from in the pipeline and how to see it in the data.
Where does an SCV proposition's gene context come from?¶
The gene in an SCV proposition's geneContextQualifier always comes from the variant, never from the
submitter. The submitter's own gene symbols are kept alongside it, in the submittedGeneSymbols extension. From
1.1.0, a geneContextSource extension says where the gene came from.
How the qualifier is built¶
Step 2 of gkm_scv_statement_proc (see Propositions) builds the
qualifier as follows:
- The gene is the variant's single representative gene, taken from the upstream
single_gene_variationtable (built byclinvar-ingest-bq-tools). That table picks at most one gene per variant by rules applied in order, strongest evidence first: the gene named in the variant's own name (a MANE transcript, an HGVS-style name or a star allele), then ClinVar's gene associations, then the shared gene of a haplotype's or genotype's alleles. Several rules are calculated upstream rather than supplied by ClinVar. See the Single Gene Variation method for the rules, the reasons for them and their known limitations. - The gene sets the qualifier's
name(the gene symbol), itsprimaryCoding(the NCBI Gene id) and its HGNCmappings. The symbol and HGNC id are the ones the upstream method used for that release, so they come with the gene, even for a gene ClinVar names in the variant title without associating it. - The submitter's genes are the symbols the submitter gave in their submitted variant record. They are
attached to the qualifier as the
submittedGeneSymbolsextension, verbatim and in submitted order. They never choose the gene. - The source is the
geneContextSourceextension, on every qualifier from 1.1.0:submittedSymbolMatches: the submitter's symbols include the qualifier's symbolsubmittedSymbolDiffers: the submitter gave symbols, but none equals the qualifier's symbolinferredFromVariant: the submitter gave no symbolssubmittedNotNormalized: the placeholder (next item)
Symbols are compared after trimming spaces and ignoring case, so C19ORF12 matches C19orf12. The schema
accepts only these four values.
- The placeholder applies when the variant has no single representative gene but the submitter named one.
From 1.1.0, the qualifier's name is the submitter's symbol, verbatim; several symbols are joined with
, in submitted order. It has no primaryCoding, the submitter's symbols are in submittedGeneSymbols, and
geneContextSource is submittedNotNormalized. The 1.0.1 releases name it with the literal text
submitted genes were not normalized.
- When neither source has a gene, the proposition has no geneContextQualifier.
VCV and RCV propositions carry no gene context qualifier.
For example, SCV000024718-PATH has a qualifier gene of GBA1 (NCBI Gene 2629), while the submitter
wrote GBA, the gene's previous symbol. The symbols differ, but the gene is the same:
"geneContextQualifier": {
"type": "MappableConcept",
"conceptType": "gene",
"name": "GBA1",
"primaryCoding": {
"code": "2629",
"name": "GBA1",
"system": "https://www.ncbi.nlm.nih.gov/gene/",
"iris": ["https://identifiers.org/ncbigene:2629", "https://www.ncbi.nlm.nih.gov/gene/2629"]
},
"mappings": [
{
"coding": {
"code": "4177",
"system": "https://www.genenames.org",
"iris": ["https://identifiers.org/hgnc:4177", "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/4177"]
},
"relation": "exactMatch"
}
],
"extensions": [
{ "name": "submittedGeneSymbols", "value": ["GBA"] },
{ "name": "geneContextSource", "value": "submittedSymbolDiffers" }
]
}
How the two sources compare¶
Across the 6.74 million SCV propositions in the 1.0.1 2026-10 monthly (built from the 2026-09-28 release and
frozen under v1/1.0/), the last release before geneContextSource, with symbols compared exactly:
| Case | Propositions | Share |
|---|---|---|
| The submitter's gene is the qualifier gene | 5,781,673 | 85.8% |
| The submitter gave the qualifier gene plus others | 101 | <0.1% |
| The submitter's gene differs from the qualifier gene | 27,817 | 0.4% |
| The gene is inferred from the variant; the submitter gave none | 881,325 | 13.1% |
| Placeholder: the submitter gave a gene, the variant has no single gene | 4,814 | 0.1% |
| No gene from either source | 40,849 | 0.6% |
The 27,817 differing cases break down as follows:
| Kind of difference | Propositions | Example |
|---|---|---|
The submitted symbol is not a gene symbol in the release's gene list — mostly a previous symbol of the same gene (GBA → GBA1, MUT → MMUT, C10orf2 → TWNK, IKBKAP → ELP1) |
24,545 | SCV000024718-PATH |
| The submitted gene is another gene ClinVar associates with the variant | 2,541 | SCV000425435-PATH: ITGA4 vs submitted CERKL |
| The submitted gene is a gene ClinVar does not associate with the variant | 731 | SCV004053541-PATH: PRAMEF18 vs submitted PRAMEF22 |
The two sources therefore agree almost everywhere. In the 1.0.1 releases (frozen under v1/1.0/), three gaps
remained:
- Inferred genes were not marked. For 881,325 propositions the qualifier states a gene the submitter never
stated, and nothing in the record distinguished an inferred gene from a submitted one. You had to compare
namewithsubmittedGeneSymbols: when the extension is absent, the gene is inferred. - Placeholder names were not genes. For the 4,814 placeholder propositions, the submitter's gene was only
in
submittedGeneSymbols. Grouping or filtering on the qualifiernametreatedsubmitted genes were not normalizedas if it were a gene. - A differing symbol is usually a renamed gene. Matching the submitter's symbol to the qualifier's symbol by string comparison over-reports disagreement. Only the last two rows of the table above are different genes.
From 1.1.0, the first two gaps are closed and the third is labeled:
- Inferred genes are marked
geneContextSource=inferredFromVariant. - Placeholder names carry the submitter's symbol and are marked
submittedNotNormalized. A placeholder is still not a normalized gene, so filter onprimaryCoding(or the Parquetgene_context_id) when you need one. Filtering onnamealone now also matches placeholders: 29TP53placeholders in 2026-10-18, for example. submittedSymbolDifferssays only that the symbols differ, not that the genes do. With the case-insensitive comparison it covers 28,507 propositions in 2026-10-18, where an exact comparison finds 28,653. The other 146 differ only by case and are nowsubmittedSymbolMatches.
How to see it in the data¶
The qualifier is part of each SCV proposition in the bundle and in the data column of the proposition Parquet
tables:
-- Extensions are picked by name: the qualifier can carry two. (`lambda e:` needs DuckDB 1.3 or later.)
SELECT id,
data->>'$.geneContextQualifier.name' AS qualifier_gene,
data->>'$.geneContextQualifier.primaryCoding.code' AS ncbi_gene,
list_filter(CAST(data->'$.geneContextQualifier.extensions' AS JSON[]),
lambda e: e->>'$.name' = 'submittedGeneSymbols')[1]->'$.value' AS submitted_gene_symbols,
list_filter(CAST(data->'$.geneContextQualifier.extensions' AS JSON[]),
lambda e: e->>'$.name' = 'geneContextSource')[1]->>'$.value' AS gene_context_source
FROM 'propositionPathogenicity.parquet'
WHERE id IN ('SCV001494816-PATH', 'SCV000024718-PATH', 'SCV005419060-PATH', 'SCV000039919-PATH');
With 1.1.0 data:
id qualifier_gene ncbi_gene submitted_gene_symbols gene_context_source
SCV005419060-PATH TTN 7273 ["TTN","TTN-AS1"] submittedSymbolMatches
SCV001494816-PATH KCNT1 NULL ["KCNT1"] submittedNotNormalized
SCV000024718-PATH GBA1 2629 ["GBA"] submittedSymbolDiffers
SCV000039919-PATH SERPINC1 462 NULL inferredFromVariant
In the 1.0.1 releases (frozen under v1/1.0/), SCV001494816-PATH is named submitted genes were not
normalized and has no geneContextSource.
From 1.1.0, the four proposition Parquet tables also carry typed gene_context_id (the qualifier's
ncbigene: id, NULL for the placeholder), submitted_gene_symbols and gene_context_source columns.
Gene context is not the variant's gene list¶
The qualifier holds one representative gene. A variant's full set of ClinVar gene associations — every gene it
lies in, overlaps or is near, each with a relationship type — is a different relationship. It is carried on the
variant as the clinvarGeneList extension (see GeneListItem).
Use the gene list to find all variants touching a gene, and the gene context qualifier for the gene a
classification is framed around.