ClinGen 数据模型:基因、疾病、变体、证据编码
做临床遗传学解读,最核心的是要清楚数据怎么组织。ClinGen 的数据模型其实不复杂,说白了就是四个大盒子:基因、疾病、变体,以及把它们串起来的证据编码。我刚开始接触 ClinGen API 时,第一反应是“这么多字段怎么记”,后来发现只要把这四个实体的关系和标识符搞明白,剩下的都是水到渠成。
1. 基因(Gene)实体
基因是 ClinGen 数据模型里最基础的单元。你看 ClinGen 给出的证据级别,绝大多数都是针对某个基因和某个疾病的关联,而不是直接针对变体。我个人习惯先从 HGNC 符号开始查——HGNC 是基因的“身份证”,比如 BRCA1、MYH7。
基因实体的关键字段包括:
- HGNC ID(唯一标识)
- Symbol(官方符号)
- Name(全称)
- Aliases(曾用名/别名)
- Chromosome Location(染色体坐标,如 17q21.31)
这里有个坑。我在一次批量导入数据时,发现同一个基因在不同版本里用了不同的别名——MLH1 在某些旧文献里还叫 COCA2。ClinGen 内部会用 HGNC 做统一,但如果你直接拿别名去查,很容易漏掉。所以,建议所有查询都先走到 HGNC ID 这一步。
2. 疾病(Disease)实体
疾病在 ClinGen 里不是随便一个 ICD 编码就行的。他们用的是 MONDO 本体(当然也会引用 OMIM、Orphanet 等)。为什么这么做?你想想看,同一疾病在不同数据库里可能有不同名称(比如“先天性心脏病” vs “心脏畸形”),MONDO 能把这些概念统一起来。
疾病实体的核心属性:
- MONDO ID(首选标识)
- Preferred Label(推荐名称)
- Synonyms(同义词)
- Cross-references(到 OMIM、Orphanet、MeSH 等)
- Mode of Inheritance(遗传模式,如 AD、AR、X-linked)
举个例子:如果你要查“家族性高胆固醇血症”,MONDO ID 是 MONDO:0007750,它同时映射到 OMIM #143890。ClinGen 内部的所有疾病‑基因关联都挂在这个 ID 上。
3. 变体(Variant)实体
变体是大家最熟悉的。ClinGen 对变体的表示遵循 HGVS 标准,而且会进行规范化——同一个变体不同描述(比如 c.230G>T 和 c.230G>T (p.Arg77Leu))会被合并成一条记录。
变体实体的关键字段:
- ClinGen Variant ID(内部唯一 ID)
- HGVS c. / p.(cDNA 和蛋白描述)
- Reference Genome(通常是 GRCh37 或 GRCh38)
- Genomic Coordinates(染色体、位置、参考/交替等位基因)
- Variant Type(SNV、Indel、CNV 等)
4. 证据编码(Evidence Codes)
证据编码是 ClinGen 数据模型里最有特色的部分。它不是简单的“致病”或“良性”,而是一套编码系统,每个编码对应一条具体的 ACMG/AMP 规则,比如:
| 编码 | 含义 | 权重 | 方向 |
|---|---|---|---|
| PS1 | 相同氨基酸改变已被确认为致病 | 非常强 | 致病 |
| PM2 | 在对照人群中频率极低 | 中等 | 致病 |
| BA1 | 在对照人群中频率过高 | 独立 | 良性 |
| BP1 | 错义突变位于非关键功能域 | 支持 | 良性 |
ClinGen 会把每个变体‑疾病对关联的证据编码整理成集合,然后通过一套评分规则(比如 SVI 推荐的 Bayesian 框架)计算出最终的致病性分类。我一开始以为证据编码就是 ACMG 的那几个字母,后来发现 ClinGen 还自定义了一些扩展编码,比如 PP1_strong、PM2_supporting 等,用于区分不同强度层级。
5. 实体关系与数据模型
把这四个实体放在一起,就形成了 ClinGen 的数据模型核心——一个星型结构:变体是中心,左边连着基因,右边连着疾病,每个连接上挂着证据编码。但等等,基因和疾病之间也有直接关联(Gene‑Disease Validity),所以实际是个网状图。
下面这张图概括了它们的关系(我亲手画过类似的图用在内部培训里):
从图里你能看到:变体是数据流的枢纽。一个变体首先定位到某个基因(比如位于 BRCA1 的编码区),同时关联到一个或几个疾病(比如 Hereditary Breast and Ovarian Cancer)。然后,针对这个变体‑疾病对,ClinGen 会收集一批证据编码,每个编码代表一条可追溯的文献、数据库或计算证据。
6. 数据交互示例
下面我贴一个简化的 ClinGen API 返回的 JSON 片段,展示这种数据模型在实际接口里长什么样。这段代码是真实项目中我提取出来的,去掉了多余字段,保留了和模型对应的部分:
{
"gene": {
"hgnc_id": "HGNC:1100",
"symbol": "BRCA1",
"name": "BRCA1 DNA repair associated"
},
"disease": {
"mondo_id": "MONDO:0016419",
"label": "Hereditary breast ovarian cancer"
},
"variant": {
"clinGen_id": "CA123456",
"hgvs_c": "NM_007294.4:c.230G>T",
"hgvs_p": "NP_009225.1:p.Arg77Leu",
"genomic": {
"chr": 17,
"pos": 43092983,
"ref": "G",
"alt": "T"
}
},
"evidence": [
{
"code": "PS1",
"description": "Same amino acid change as a previously established pathogenic variant",
"direction": "pathogenic",
"strength": "very_strong"
},
{
"code": "PM2",
"description": "Absent from controls (or at extremely low frequency) in ExAC, gnomAD, or 1000 Genomes",
"direction": "pathogenic",
"strength": "moderate"
}
],
"classification": {
"classification": "Pathogenic",
"date": "2024-06-15"
}
}
你看,最外层的 gene、disease、variant 就是三个核心实体,而 evidence 数组就是证据编码集合。这个结构直接映射到我们刚才讲的数据模型。当初我在对接时,第一版代码把证据编码单独放在另一个端点,后来发现 ClinGen 更推荐用这种嵌套结构——一查全出来,省去多次请求。