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 这一步。

提示:ClinGen 的基因实体会关联到 NCBI Gene、Ensembl,必要时可以交叉验证。

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 等)
注意:我曾遇到一个 case,某个变体在 dbSNP 里的 rs 号对应的是 GRCh38 的坐标,但 ClinGen 里同时保留了 GRCh37 的坐标。如果你直接用 rs 号去对接,必须确认基因组版本一致,否则坐标可能错位。

4. 证据编码(Evidence Codes)

证据编码是 ClinGen 数据模型里最有特色的部分。它不是简单的“致病”或“良性”,而是一套编码系统,每个编码对应一条具体的 ACMG/AMP 规则,比如:

编码 含义 权重 方向
PS1 相同氨基酸改变已被确认为致病 非常强 致病
PM2 在对照人群中频率极低 中等 致病
BA1 在对照人群中频率过高 独立 良性
BP1 错义突变位于非关键功能域 支持 良性

ClinGen 会把每个变体‑疾病对关联的证据编码整理成集合,然后通过一套评分规则(比如 SVI 推荐的 Bayesian 框架)计算出最终的致病性分类。我一开始以为证据编码就是 ACMG 的那几个字母,后来发现 ClinGen 还自定义了一些扩展编码,比如 PP1_strong、PM2_supporting 等,用于区分不同强度层级。

关键点:证据编码必须绑定一个具体的变体‑疾病对,不能单独存在。也就是说,一个变体可能对疾病 A 有 PS1 证据,但同一变体对疾病 B 可能只有 PM2 证据。

5. 实体关系与数据模型

把这四个实体放在一起,就形成了 ClinGen 的数据模型核心——一个星型结构:变体是中心,左边连着基因,右边连着疾病,每个连接上挂着证据编码。但等等,基因和疾病之间也有直接关联(Gene‑Disease Validity),所以实际是个网状图。

下面这张图概括了它们的关系(我亲手画过类似的图用在内部培训里):

ClinGen 数据模型核心实体关系 Gene HGNC ID · Symbol Disease MONDO ID · OMIM Variant HGVS · Coordinates Evidence Codes PS1, PM2, BA1 … associates associates Gene‑Disease Validity scored by 💡 变体是连接基因和疾病的桥梁,每个变体‑疾病对可绑定多条证据编码。 基因‑疾病关联(虚线)与变体‑疾病关联相互独立,共同支撑临床解读。

从图里你能看到:变体是数据流的枢纽。一个变体首先定位到某个基因(比如位于 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 更推荐用这种嵌套结构——一查全出来,省去多次请求。