信息速览
DGVa 的全称是 Database of Genomic Variants archive,由 EMBL-EBI 运营,是本库里唯一一个为「大于 50 个碱基的结构变异」专门设置的原始提交归档。它的工作不是判断某个缺失到底常不常见,而是替全球实验室把提交上来的结构变异调用原样保存下来,连同这批变异是在什么平台、什么装配、什么样本集上得到的,一并留档。官方结构变异研究接口在 2026-10-26 返回 204 个研究,覆盖 35 个分类单元。
它最值得单独写一篇的原因不在规模,而在一个极为常见的混淆:DGV(Database of Genomic Variants,加拿大 TCAG 维护)与 DGVa(EMBL-EBI 维护)名字只差一个字母,却是两个性质相反的库。前者是从归档数据中挑选研究再二次整理的人群对照集,后者就是那个被挑选的归档层本身。大量方法学段落写「变异已与 DGV 比对过滤」,实际查的可能是 DGVa,反过来也一样。这一个字母的错位,会让一整段过滤逻辑站不住。
本篇要回答三件事:它在结构变异这条技术路线上补上了库内缺的那一环;它的坐标语义与文件版本为什么会让取数代码悄悄出错;以及什么情况下你应该转身去用 dbVar、DGV 或 gnomAD 的 SV 集合。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方名称 | DGVa — Database of Genomic Variants archive |
| 维护机构 | EMBL-EBI;与 NCBI dbVar 组成双档案 |
| 首次可用 | 2009 年前后上线,2010 年前后开始接收直接提交 |
| 上级入口 | European Variation Archive(EVA),2014 年起整合 |
| 变异类型 | 结构变异,官方口径为大于 50 bp |
| 规模(研究数) | 结构变异研究接口返回 204 个 study(2026-10-26) |
| 规模(物种) | 35 个分类单元;人类研究 155 个 |
| 编号体系 | EBI 侧 estd,dbVar 侧 nstd,EVA 侧 PRJEB |
| 文件格式 | GVF(GFF3 派生)、VCF(提交端要求) |
| 坐标版本 | Submitted(提交时装配)与 Remapped(重映射后装配)两套 |
| 访问方式 | FTP 目录下载、REST 接口、EVA 网页浏览器 |
| 许可 | EMBL-EBI 使用条款,研究用途开放获取 |
| 与本库同类 | 与 dbSNP/ClinVar/gnomAD 构成「小变异—结构变异」两条路线 |
| AI 就绪度 | 三星半:格式规范、编号稳定;扣分在无频率、无标签、元数据空值多 |
§1 它要解决的具体麻烦
1.1 结构变异没有地方可存,是它存在的第一理由
短变异与结构变异在技术上是两条完全不同的路线。一个单核苷酸替换,可以用基因分型芯片或测序读段直接读到具体位点,结果是一条「染色体:位置 参考碱基>替代碱基」的记录;一个跨越几十万碱基的缺失,只能靠探针信号强度、克隆重叠、读段对方向、读段深度突变这些间接证据推断出来,结果是一段区间,两端各带一个不确定范围。前者天然适配 dbSNP 那种「一个 rs 编号对应一个位点」的模型,后者放进去就会被压扁。
DGVa 的第一个设计决定,就是承认结构变异的最小单元是「研究里的一个变异调用」,而不是「基因组上的一个位点」。所以它的主键是 study:一个 study 对应一次提交,一次提交来自一个课题组、一个联盟或一次重分析。变异挂在这个 study 之下,带着自己的样本名与提交者编号。同一个人群在两次独立分析里得到的两段重叠缺失,在 DGVa 里就是两个 study 下的两条记录,官方不做合并。
这个决定带来一个直接后果:DGVa 无法回答「这个缺失在人群里有多常见」。它只能回答「有谁提交过、用什么方法、在哪个装配上」。这是归档层的本分,不是缺陷,但用错场景时它就是缺陷。§4.3 的案例会把这一点展开。
1.2 三条常见的错误期待
第一条:以为 DGVa 里的人和 DGV 里的人是同一批。不少人把它当成「DGV 的欧洲镜像」,默认两边数据一致。实际上 DGV 官方描述自己收集了 55 个已发表研究,这些研究是从 dbVar 与 DGVa 的归档数据里挑选出来的,挑选之后还做了准确性整理。也就是说,DGV 是 DGVa 的下游,而且只取了其中一小部分。归档里有 204 个研究,下游汇总只用了 55 个,中间那部分不是被丢弃,而是没被选中。
第二条:以为「归档」意味着静态。DGVa 的文件带日期戳,同一 study 会有 2012 年版与 2014 年版,坐标也会从 NCBI35 一路重映射到 GRCh38。取数时按目录名固定写死,半年后可能已经指向旧文件。
第三条:以为 SV 记录可以像 SNP 一样用 ID 去查。SNP 有 rs 编号可以全球对齐,结构变异的编号是分层的:study 有 estd 或 PRJEB,变异有 essv 或 esv 这类前缀,两者在 NCBI 侧又各有一套 nstd 与 nsv。同一个结构变异在不同库里拿到的编号不同,跨库对齐必须靠坐标与样本,不能靠 ID 字符串相等。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 找到某个已发表 SV 研究的原始调用文件 | 按 study 分目录的 GVF,含 README | 够 |
| 知道某个 SV 研究用了什么平台、多少样本 | 研究级元数据,但样本数常为空 | 部分够,需回原文核 |
| 把某段缺失对齐到 GRCh38 坐标 | Remapped 文件加 remap_score | 够,但须核对是否缺记录 |
| 判断某个缺失在健康人群里多常见 | 不提供统一频率 | 不够,改用 DGV 或 gnomAD SV |
| 得到带致病性标签的训练集 | 无标签 | 不够,改用 ClinVar 或 ClinGen |
| 按基因组区间查询所有结构变异 | REST 区域查询接口 | 够,注意限流 |
| 跨库对照 NCBI 的同一研究 | 部分 study 有 nstd 对应目录 | 部分够,需逐个人工核对 |
| 找非人类物种的结构变异 | 小鼠、牛、猪、犬等 19 个非人分类单元 | 够,但深度远不如人类 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 复现一篇 2010 年代的 CNV 论文,找不到原始调用表 | 论文的 SV 数据多半以 study 形式归档在此 | 先查论文补遗里的 estd 编号,再进 FTP 目录 |
| 做临床 CNV 判读,需要「健康人群里见过吗」 | 只能给原始提交,给不了频率 | 转去 DGV 或 gnomAD 的 SV 集合,本篇不当频率源 |
| 训练一个 SV 检测模型,需要多种平台的正负样本 | 平台与实验类型字段可以筛出微阵列、CGH、测序三类 | 先按 platform 分层抽样,再核对研究类型 |
| 想把一组 GRCh37 坐标的 CNV 挪到 GRCh38 | Remapped 文件直接可用,带质量分 | 用 §5 的重映射代码做区间比例检查,别盲信 |
| 正在写方法学,要交代「过滤用了哪个库」 | 澄清 DGV 与 DGVa 的分工 | 按 §3 的对照表写明维护方与版本 |
| 教学演示「结构变异长什么样」 | GVF 行可读性远好于 VCF | 取一个样本量小的 study 的 Submitted 文件 |
| 需要跨物种比较 SV 结构 | 19 个非人分类单元有数据 | 先确认装配是不是 Ensembl 支持版本,否则没有注释 |
1.5 一句话判断
DGVa 是结构变异这条路上的「投稿收件箱」,它保证你拿到的是别人真的提交过的东西,但不保证那些东西被验证过、被汇总过、被换算成人群频率过。
1.6 不适合谁:四条边界
第一条,不适合任何需要人群频率的场合。它不是频率库,硬把多个 study 的频率合并起来,得到的数字没有统计意义,因为各 study 的样本集彼此重叠情况未知。
第二条,不适合把「变异是否存在」当标签做监督学习。归档里没有阴性样本的概念,一个 study 没报某段缺失,只说明那批数据里没找到,不说明那段缺失不存在。
第三条,不适合要求结果稳定可复现的长周期项目。FTP 文件会被新版覆盖,Remapped 文件的内容会随重映射流程变化,旧版本只保留在 previous 子目录,长期复现必须自己冻结快照。
第四条,不适合把它当作 dbVar 的完整镜像。两边互相同步,但同步有滞后,处理状态也会不同,做跨库计数时不能假设数目相等。
§2 数据构成与规格
2.1 study / sample / variant 三层
DGVa 的结构可以理解为三层,但三层的存储位置不同,这是取数代码最容易踩空的地方。
第一层是 study,也是最完整的一层。研究级元数据在 REST 接口里可以整体拉取,一次请求就返回全部 study 的列表,字段包括名称、描述、物种、装配、平台、文献编号与研究类型。这一层的记录数就是 204。
第二层是 sample。样本信息没有被独立建模成一张表,它散落在两处:研究级元数据里有一个 numSamples 字段,变异文件里的 sample_name 属性。前者在本次查询的 204 个 study 里全部为缺失值,后者只对有基因型的 VCF 才可靠。想统计一个 study 有多少样本,通常得回到原始文献。
第三层是 variant。变异只存在文件里,不在 REST 的研究接口里返回。要拿到变异,要么下载 FTP 上的 GVF 文件,要么走区域查询接口。这意味着「DGVa 一共有多少条结构变异」这个问题在归档层没有廉价答案,官方页面也没有给出一个汇总数字。
| 层 | 载体 | 是否可整表取 | 本次核验到的规模 |
|---|---|---|---|
| study | REST 研究列表 / FTP 目录名 | 是,一次请求 | 204 个 |
| sample | 研究元数据字段 + 文件内属性 | 否,需回原文 | 元数据字段全缺失 |
| variant | GVF 或 VCF 文件 / 区域接口 | 否,需逐文件或分区 | 未核实 |
2.2 字段与记录的完整字典
下面这张表覆盖研究级元数据的全部字段,以及变异文件里最常被读错的属性。字段名保持接口原样,便于直接对照返回的 JSON。
| 字段 | 层级 | 类型 | 含义 | 取数注意 |
|---|---|---|---|---|
| id | study | 字符串 | 研究编号,estd 或 PRJEB 前缀 | 两套前缀并存,别假设单一格式 |
| name | study | 字符串 | 研究短名,常为「作者_年份」 | 与文献标题不完全一致 |
| description | study | 长文本 | 提交者写入的研究描述 | 平均长度约五百字符,可直接做检索语料 |
| taxonomyId | study | 整数数组 | 分类单元编号,一个 study 可含多个 | 小鼠复合种会返回多个编号 |
| speciesCommonName | study | 字符串 | 物种俗名 | 与学名偶有对不上 |
| speciesScientificName | study | 字符串 | 物种学名 | 过滤物种优先用这个 |
| type | study | 枚举 | 研究类型,如 CONTROL、CASE、SOMATIC | CONTROL 占多数 |
| typeName | study | 字符串 | 研究类型的人类可读名 | 如 Control Set |
| experimentType | study | 字符串 | 实验方法,逗号分隔 | 混有微阵列与测序 |
| platform | study | 长文本 | 平台型号清单 | 值很长,需自己拆分 |
| assembly | study | 字符串 | 该研究涉及的装配版本 | 一格可能写四五个版本 |
| assemblyAccession | study | 字符串 | 装配的 GCA 或 GCF 编号 | 可用于脚本校验 |
| publications | study | 数组 | PubMed 编号 | 有 178 个 study 带文献 |
| numVariants | study | 整数 | 变异条数 | 本次查询全为缺失值 |
| numSamples | study | 整数 | 样本数 | 本次查询全为缺失值 |
| center | study | 字符串 | 提交中心 | 本次查询全为缺失值 |
| browsable | study | 布尔 | 是否已进入浏览器 | 旧 study 多为假 |
| ID | 变异 | 字符串 | 文件内行号式编号 | 不跨文件唯一 |
| Name | 变异 | 字符串 | essv 或 esv 编号 | 这个才是变异标识 |
| type 列 | 变异 | 字符串 | copy_number_gain 等 | SO 术语的通俗写法 |
| variant_call_so_id | 变异 | 字符串 | SO 本体编号 | so 编号比文字更稳定 |
| Start_range | 变异 | 字符串 | outer_start,inner_start | 缺失值写作点号 |
| End_range | 变异 | 字符串 | inner_end,outer_end | 缺失值写作点号 |
| sample_name | 变异 | 字符串 | 样本名 | NA 开头的是 HapMap 编号 |
| submitter_variant_call_id | 变异 | 字符串 | 提交者自己的调用编号 | 溯源到原始数据的唯一线索 |
| remap_score | 变异 | 浮点 | 重映射质量分 | 不是可信度分数 |
| parent | 变异 | 字符串 | 所属变异簇编号 | esv 前缀,指向聚类后的位点 |
2.3 一条记录的完整解剖
取一个真实的 study 做解剖。estd1 是 Redon 等人 2006 年的第一代人类 CNV 图谱,270 名 HapMap 个体,用基因分型芯片与克隆比较基因组杂交两种方法筛出拷贝数变异。它的研究级元数据在接口里是这样的形态。
{
"name": "Redon_et_al_2006",
"id": "estd1",
"taxonomyId": [9606],
"speciesScientificName": "Homo sapiens",
"type": "CONTROL",
"typeName": "Control Set",
"experimentType": "Probe signal intensity, SNP genotyping analysis",
"platform": "Affymetrix GeneChip Early Access Mapping 500K Set Array, Agilent",
"assembly": "GRCh37, GRCh37.p13, GRCh38, NCBI35",
"assemblyAccession": "GCA_000001405.14, GCA_000001405.15, GCF_000001405.11, GCA_000001405.13",
"publications": ["PubMed:17122850"],
"numVariants": -1,
"numSamples": -1,
"browsable": false
}
注意几个细节。numVariants 与 numSamples 都是负一,这是接口用来表示缺失的约定,不是真的负一个样本。assembly 一格写了四个版本,说明这个 study 的文件在四个装配上都有表示。browsable 为假,意味着它不在网页浏览器里可直接点开,只能从 FTP 取文件。
它的变异在 FTP 上按装配分成多个文件。README 里写明了一件事:只有标注 Submitted 的文件才可以认为包含该 study 的全部提交变异,标注 Remapped 的文件因为大片段重映射的局限,可能缺记录。这一点决定了取数时应优先用 Submitted 文件。
1 DGVa copy_number_gain 10377 177417 . + . ID=1;Name=essv10172;Alias=NA19130_Chr1_1;variant_call_so_id=SO:0001742;parent=esv2757715;Start_range=.,10377;End_range=177417,.;submitter_variant_call_id=NA19130_Chr1_1;sample_name=NA19130;remap_score=1.00082;Variant_seq=.
1 DGVa copy_number_loss 10377 707652 . + . ID=3;Name=essv1421;Alias=NA18944_Chr1_1;variant_call_so_id=SO:0001743;parent=esv2757715;Start_range=.,10377;End_range=707652,.;submitter_variant_call_id=NA18944_Chr1_1;sample_name=NA18944;remap_score=1.02162;Variant_seq=.
逐列读:第一列是染色体,第二列是来源,第三列是类型,第四第五列是起止,第七列是链方向。关键全部在第九列的属性里。Start_range 写作「.,10377」,意思是 outer_start 缺失、inner_start 为 10377;End_range 写作「177417,.」,意思是 inner_end 为 177417、outer_end 缺失。也就是说这条增益的起点只给到碱基级精确,终点也只给到碱基级精确,外边界没有给出。
这个坐标模型来自 DGVa 与 dbVar 共用的约定:start 与 end 表示碱基级精确的断点;outer_start 与 inner_start 一起表示起点落在某个范围内;inner 坐标是已知受影响的第一个或最后一个碱基,outer 坐标是变异外侧已知未受影响的最近碱基。归一化之后,插入变异的参考等位可能被记为空串,这一点在 EVA 的帮助页里有明确说明。
2.4 研究构成的分布表
按物种看,人类占绝对主导,近四分之三。非人类中,小鼠是第二位,数量约为人类的十三分之一;牛、犬、猪、果蝇各有个位数到十位数的 study。这个分布决定了 DGVa 在跨物种 SV 研究里的实际可用性:够做方法学的补充验证,不够做物种特异的频率模型。
| 物种 | study 数 | 相对人类 | 常见用途 |
|---|---|---|---|
| 人 Homo sapiens | 155 | 1.0 | 人群 CNV 图谱、临床 CNV 对照 |
| 小鼠 Mus musculus | 13 | 0.08 | 品系间 SV 差异、模型验证 |
| 牛 Bos taurus | 9 | 0.06 | 家畜 CNV 与性状关联 |
| 犬 Canis lupus familiaris | 5 | 0.03 | 品种特异 CNV |
| 黑腹果蝇 Drosophila | 4 | 0.03 | 结构变异的方法学演示 |
| 猪 Sus scrofa | 4 | 0.03 | 家畜 CNV |
| 其余 29 个分类单元 | 各 1 至 3 | 极低 | 零散补充 |
按研究类型看,对照集占多数,这与 DGVa 的历史定位一致:最初的主要任务是把已发表研究里的健康人群 CNV 收进来,供对照使用。病例、病例对照与肿瘤类型的 study 也存在,但数量少得多。
| 研究类型 | study 数 | 说明 |
|---|---|---|
| Control Set 对照集 | 117 | 健康或未标注疾病的人群样本 |
| Case 病例 | 36 | 单一疾病队列 |
| Collection 集合 | 25 | 混合来源或多种子集的合并提交 |
| Case-Control 病例对照 | 19 | 同时含病例与对照 |
| Somatic 肿瘤 | 4 | 体细胞结构变异 |
2.5 与同类资源的字段差异
| 字段或能力 | DGVa | dbVar | DGV | gnomAD SV |
|---|---|---|---|---|
| 主单元 | study | study | study(已筛选) | 数据集版本 |
| 变异编号 | essv / esv | nssv / nsv | esv 沿用 | 无对外编号 |
| 是否给人群频率 | 否 | 否 | 部分汇总 | 是 |
| 是否做研究筛选 | 否 | 否 | 是 | 是 |
| 坐标重映射 | 有,带质量分 | 有 | 有 | 有 |
| 提交元数据完整度 | 中,多字段缺失 | 中 | 低 | 高 |
| 更新节奏 | 随提交,接口实时 | 随提交 | 周期性整版 | 版本发布 |
§3 归档层与汇总层的分工:它到底站在哪一环
3.1 一张链路图:原始调用如何走到频率表
结构变异数据从实验室到「人群频率」要经过四道手。第一道是提交者把算法输出整理成符合要求的文件;第二道是归档库做格式校验与归一化,给编号;第三道是汇总库从归档里挑研究、做二次整理;第四道才是使用者按自己的样本集重算频率或做过滤。DGVa 只负责第二道,DGV 负责第三道,gnomAD 的 SV 集合把第三和第四道都做了。
把这个链条讲清楚,很多争论会自动消失。比如有人说「DGVa 的数据不准」,他实际想说的是第三道的整理没做;有人说「DGV 覆盖不全」,他实际想说的是第三道只挑了归档里的一小部分。两边说的都不是同一件事。
| 环节 | 谁做 | 产出 | 失败时的后果 |
|---|---|---|---|
| 调用与整理 | 提交实验室 | VCF 或 GVF | 文件不合规则退回,合规但方法差则照样入库 |
| 归档与编号 | DGVa / dbVar | estd / nstd,essv / nssv | 编号可用,但内容未经复核 |
| 筛选与整理 | DGV | 55 个研究的人群对照集 | 覆盖窄,但单条记录更干净 |
| 频率与注释 | gnomAD SV 等 | 统一频率与约束指标 | 依赖上游质量,样本偏倚继承下来 |
3.2 编号体系:estd、nstd、PRJEB 三种前缀为什么并存
EBI 与 NCBI 在 2010 年前后商定了一套互操作方案:双方对同一批研究各自分配编号,并定期交换。EBI 侧的分到 estd,NCBI 侧的分到 nstd。所以同一个 Redon 2006 研究,在 EBI 叫 estd1,在 NCBI 叫 nstd 系列的某个编号。FTP 根目录里同时存在 estd 与 nstd 两类目录,共 227 个 study 目录,比接口返回的 204 个更多,多出来的部分是历史目录、改名后的重复目录与已停止维护的旧目录。
2014 年之后,EVA 成为统一入口,新提交改用 ENA 的项目编号 PRJEB。所以在接口返回的 204 个 study 里有大量 PRJEB 编号,而 FTP 上主要仍是 estd 与 nstd 目录。这三套编号描述的是同一类对象,但不能互换使用:REST 的 study 查询接受 PRJEB 与部分 estd,却不一定接受 nstd。
| 前缀 | 分配方 | 出现在 | 可用于接口查询 |
|---|---|---|---|
| estd | EBI(DGVa 时代) | FTP 目录名、旧接口 | 部分可用 |
| nstd | NCBI dbVar | FTP 目录名 | 通常不可用 |
| PRJEB | ENA / EVA | 新接口、新提交 | 可用 |
| essv / esv | EBI | 变异文件内 | 区域查询可用 name 精确匹配 |
| nssv / nsv | NCBI | 变异文件内 | 需用 NCBI 接口 |
3.3 与 DGV 的对照表:一字之差的六个区别
这是本篇最该被记住的一张表。逐行对照,任何一行对不上,说明你打开的是另一个库。
| 对照项 | DGV | DGVa |
|---|---|---|
| 全称 | Database of Genomic Variants | Database of Genomic Variants archive |
| 维护方 | 加拿大 TCAG(多伦多) | EMBL-EBI(英国 Hinxton) |
| 定位 | 汇总层:已发表研究里报告的 SV | 归档层:原始提交记录 |
| 数据来源 | 从 dbVar 与 DGVa 中挑选研究 | 提交者直接提交 |
| 研究数口径 | 官方论文称收集 55 个已发表研究 | 结构变异研究接口返回 204 个 |
| 是否算人群频率 | 面向频率统计设计 | 不算频率,只记各 study 频率 |
| 网页入口 | dgv.tcag.ca | ebi.ac.uk/dgva |
| 典型用法 | 过滤常见良性 CNV | 溯源原始调用、复现研究 |
需要说明可达性:撰写时对 dgv.tcag.ca 的访问未能完成,本文关于 DGV 的规模数字全部来自其 2014 年发表于 Nucleic Acids Research 的数据库论文摘要,属于论文口径而非官方页面实时口径。DGVa 一侧的数字则来自官方接口的实时返回。
3.4 与 dbVar 的关系:互为镜像,但不是同步镜像
两边的镜像关系在文件层面看得很清楚:FTP 根目录里既有 estd 目录,也有 nstd 目录,同一个研究常常两侧各有一份。差异在于处理状态。镜像的机制是定期交换提交内容,交换有延迟,延迟期间新研究可能只在一边出现。此外,两侧的归一化流程不完全相同,同一个变异在两边记录的起止坐标可能有一个碱基的差异。
实践上的建议是把 DGVa 当主档案、dbVar 当交叉核对。当两侧对同一研究的变异数不一致时,不要判断哪边错了,而要承认存在两个口径:一边是 EBI 处理管线给出的数量,一边是 NCBI 管线给出的数量,差额构成官方未说明,通常与重映射取舍、重复记录处理有关。
| 场景 | 以哪边为准 | 理由 |
|---|---|---|
| 溯源到提交者原始文件 | 提交时所在的那一侧 | 另一侧是转存的副本 |
| 需要每研究最新处理状态 | 两边都查,取更新时间较晚者 | 同步有滞后 |
| 需要与最新 GRCh38 坐标一致 | 两边都做,取 remap 质量高者 | 归一化流程不同 |
| 需要与 DGV 交叉验证 | DGVa 优先 | DGV 官方声明其研究来自归档 |
3.5 它在结构变异这条线上的不可替代性
结构变异这一侧,本库此前是空的。dbSNP 覆盖单核苷酸与小于五十个碱基的插入缺失,ClinVar 覆盖有临床意义的变异解读,gnomAD 覆盖以频率为主的频率集合。这三者都不回答「某项已发表研究的原始 SV 调用在哪里」。DGVa 补的正是这一段。
这种不可替代性有个前提:你要的是原始记录。一旦你要的是「结论」,它就不是首选。§7 的评分会按这个前提来打。
§4 格式、坐标与那批会被悄悄丢掉的记录
4.1 GVF 与 VCF 的双轨
同一条结构变异在 DGVa 里可能有两份表示。GVF 是 GFF3 的派生格式,一行一个变异调用,属性列用分号分隔的键值对,人眼可读性好,最适合教学与逐条核对。VCF 是 EVA 时代的提交规范,一行一个位点,样本基因型放在 FORMAT 与样本列,适合下游群体分析。
FTP 上的旧 study 以 GVF 为主,EVA 侧的新 study 以 VCF 为主。两边并不是同一批文件的两种编码,而是不同时代的产物。想统一处理,最稳的是用 EVA 的区域接口逐段取,让服务端做归一化,而不是自己写两个解析器。
| 维度 | GVF | VCF |
|---|---|---|
| 行义 | 一个变异调用 | 一个位点 |
| 样本信息 | sample_name 属性,单一样本 | FORMAT 列,多类型基因型 |
| 断点不确定度 | Start_range / End_range 显式给出 | 常借 CIPOS / CIEND INFO 字段 |
| 类型表达 | SO 术语文字加编号 | SVTYPE 与 SVLEN |
| 典型来源 | DGVa 时代归档 | EVA 时代提交 |
| 适合的人 | 溯源、核对、教学 | 群体分析、流程对接 |
4.2 Submitted 与 Remapped:一个必须记住的取舍
官方 README 明确写了两句话:每个 GVF 文件对应的是映射到某个装配上的变异,不一定是原始提交的装配;只有标注 Submitted 的文件才可以认为包含该 study 的全部提交变异。第二句是关键。大片段结构变异重映射到新装配时,如果断点落在新装配的缺口或重复区,映射会失败,那条变异就不在新文件里。
这意味着两件事。第一,如果你要「全」,用 Submitted;如果你要「新」,用 Remapped,但要接受缺失。第二,Remapped 文件里的 remap_score 不是可信度分数。它的数值可以大于一,也不是概率。它回答的是「这条变异在新装配上映射得好不好」,与「这条变异是不是真的」无关。
§4.4 的案例会把这一点放到一条具体记录上。
4.3 案例:estd1 里那条从 177417 到 707652 的缺失
用 estd1 的一条记录看完整链路。这条缺失来自样本 NA18944,提交者编号 NA18944_Chr1_1,落在染色体 1 的 10377 到 707652 之间。它的 esv 父编号是 esv2757715,意味着提交者或归档方把它归入了一个变异簇——同一段区域内多个样本的相似调用被聚到一起,成为逻辑上的一个位点。
这条记录同时出现在 GRCh38 的 Remapped 文件与 NCBI35 的 Submitted 文件里。按 §4.2 的逻辑,两者都应该看:Submitted 版本是原始坐标,Remapped 版本是新坐标,两者长度比例应当接近。如果某条记录只在 Remapped 里出现、Submitted 里找不到,那是重映射产生的新表示;反过来,只在 Submitted 里有,说明它在新装配上映射失败,被丢掉了。丢弃比例从未被官方公开,所以「Remapped 文件缺多少条」这件事只能自己对两个文件求差。
这个案例的核心教育点在编号语义:esv 是聚类后的位点编号,essv 是单样本调用编号。做计数时用哪个,答案取决于你要数「有多少个不同的位点」还是「有多少条样本级调用」。两者数量差别很大,混用会让一个 study 的「变异数」凭空放大几倍。
这条案例还会在 §4.4、§5.3、§7.3 与 §9.2 再度出现,每次都指向不同的操作要点。
4.4 案例的延伸:三个会丢记录的地方
第一个地方是重映射。§4.3 的案例里同一条缺失同时出现在 Submitted 与 Remapped 两个版本中,看起来可以互换,但 Remapped 文件可能缺记录,且缺多少没人告诉你。
第二个地方是容器格式。同一个 study 的不同装配文件,有的给纯文本 GVF,有的只给 gzip 压缩的副本。写脚本时用通配符抓文件,容易把同一装配的两种格式各数一遍。
第三个地方是样本列缺失。GVF 的 sample_name 是属性,VCF 的样本在列头。若一个 study 的 VCF 只有等位频率没有基因型,样本名就不在文件里,靠文件算样本数会得到零。§4.3 的案例里 NA18944 是从属性里读到的,一旦换成没有样本列的文件,同样的读法会静默返回空值。
4.5 标签与注释:它能给什么、不能给什么
DGVa 自身不带致病性标签。EVA 侧会对可支持装配的变异用 Variant Effect Predictor 做后果注释,注释走 Sequence Ontology 术语,比如基因内变异、剪接位点变异这类。这类注释描述的是「变异落在基因组的什么位置」,不是「这个变异会不会致病」。
把后果注释当临床意义用,是另一类常见错位。Sequence Ontology 里没有任何一个术语表示「致病」,它的粒度是分子层面的后果。临床意义需要 ACMG 那套分类,那是 ClinVar 与 ClinGen 的工作。
| 注释类型 | 来源 | 例子 | 能回答的问题 |
|---|---|---|---|
| 结构类型 | 提交者 | copy_number_loss | 是缺失还是重复 |
| 后果注释 | EVA 的 VEP 流程 | 剪接区变异 | 落在什么功能区域 |
| 重映射质量 | EVA 重映射流程 | remap_score | 新装配上映射得好不好 |
| 临床意义 | 无 | 无 | 会不会致病,答不了 |
| 人群频率 | 无统一口径 | study 内频率 | 这批人里有多常见,仅限该 study |
§5 取数:FTP、接口与那一行会返回两条记录的查询
5.1 三条取数路径与它们的适用边界
第一条是 FTP 目录下载,按 study 名进入,取 gvf 子目录。优点是拿到提交时的原样文件,缺点是文件名带日期戳,需要脚本解析版本。
第二条是 EVA REST 的研究列表接口,DGVa 的路径 meta/studies/all 一次返回全部结构变异研究。这是拿元数据最快的方式,也是唯一能一次看到全部 204 个研究的入口。
第三条是区域查询接口,按物种与区间取变异。它返回的是归一化后的记录,带来源 study 与文件编号,适合做区间抽样与流程联调。三条路径都能追到同一个对象:§4.3 的案例里那条缺失,既能从 FTP 目录直接取到 GVF 文件,也能用染色体 1 上的区间在接口里查到。
三条路径的取舍可以压成一张表。
| 路径 | 一次拿到什么 | 延迟 | 最适合 |
|---|---|---|---|
| FTP 目录 | 一个 study 的全部文件 | 低 | 复现、溯源、教学 |
| 研究列表接口 | 全部 study 的元数据 | 低 | 选研究、建索引 |
| 区域查询接口 | 一个区间的变异 | 中 | 抽样、联调、跨研究汇总 |
| 网页浏览器 | 单个 study 或单个变异 | 高 | 人工核对 |
5.2 拉取研究清单并做粗筛
下面这段可以直接运行,把结构变异研究清单拉到本地并落成表格。它只依赖标准库与 requests,输出按物种与类型两个维度做交叉统计。
#-- 拉取 DGVa 结构变异研究清单并做粗筛(Python 3.10+)
import json
from collections import Counter
import requests
URL = "https://www.ebi.ac.uk/dgva/webservices/rest/v1/meta/studies/all"
resp = requests.get(URL, timeout=120)
resp.raise_for_status()
payload = resp.json()["response"][0]
studies = payload["result"]
print("study 总数:", payload["numTotalResults"])
#-- 按物种统计:taxonomyId 是数组,一个 study 可能挂多个分类单元
taxa = Counter()
for s in studies:
for t in (s.get("taxonomyId") or []):
taxa[t] += 1
print("人类研究:", taxa.get(9606, 0), "分类单元数:", len(taxa))
#-- 按研究类型统计
print(Counter(s.get("type") for s in studies).most_common())
#-- 落盘为可复核的清单,字段按需保留
keep = ["id", "name", "type", "speciesScientificName", "assembly", "publications"]
with open("dgva_studies.json", "w", encoding="utf-8") as fh:
json.dump([{k: s.get(k) for k in keep} for s in studies], fh, ensure_ascii=False, indent=1)
#-- 有文献可溯源的 study 才适合做方法学引用
with_pmid = [s for s in studies if s.get("publications")]
print("带 PubMed 编号:", len(with_pmid))
三次数字要留意:总计 204、人类 155、带文献 178。三个数不是层层包含关系——带文献的 178 个里既有人的也有小鼠的。做引用核查时应当按需过滤,而不是拿 178 当「可用于文献核对的人类 study 数」。
5.3 用提交者编号把一条记录追回原文
§4.3 的案例里,那条 NA18944 的缺失带一个 submitter_variant_call_id。这个字段的价值在于它是唯一能连回原始表格的线。做法是先按 esv 编号在区域接口里定位,再从返回结果的来源文件编号反推 study,最后用 study 的 PubMed 编号去查原文补充材料。
#-- 追溯一条 SV 记录:坐标 -> 区域接口 -> 来源 study -> 原文
import requests
API = "https://www.ebi.ac.uk/eva/webservices/rest/v1"
params = {"species": "hsapiens_grch38", "limit": 1000}
#-- 用 estd1 案例的区间做一次区域查询
region = "1:10000-750000"
r = requests.get(f"{API}/segments/{region}/variants", params=params, timeout=180)
r.raise_for_status()
items = r.json()["response"][0].get("result", [])
for v in items[:5]:
for src_key, src in (v.get("sourceEntries") or {}).items():
study_id = src.get("studyId")
file_id = src.get("fileId")
attrs = src.get("attributes") or {}
print(v.get("chromosome"), v.get("start"), v.get("end"), v.get("type"),
"study=", study_id, "file=", file_id, "svtype=", attrs.get("SVTYPE"))
这段代码的要点是把 sourceEntries 当主线索,而不是当补充信息。一条区域查询结果可能同时带多个来源,等于把多个 study 的相似变异叠在了一起。做计数时若不按 study 去重,同一段区域会被重复计入。
5.4 拆分 GVF 的不确定度坐标
GVF 的 Start_range 与 End_range 是本篇最容易被跳过的字段。下面这段把区间拆成结构化的起止范围,并标记哪些记录有外边界缺失。
#-- 解析 GVF 的 Start_range / End_range,还原断点不确定度
import gzip
import re
def parse_range(text):
#-- 形如 ".,10377" 或 "177417,." 或 ".,."
left, _, right = (text or ".,.").partition(",")
left = None if left in ("", ".") else int(left)
right = None if right in ("", ".") else int(right)
return left, right
def read_attrs(col9):
out = {}
for part in col9.strip().split(";"):
if "=" in part:
k, v = part.split("=", 1)
out[k] = v
return out
path = "estd1_Redon_et_al_2006.2014-04-01.GRCh38.Remapped.gvf.gz"
with gzip.open(path, "rt", encoding="utf-8") as fh:
for line in fh:
if line.startswith("#"):
continue
cols = line.rstrip("\n").split("\t")
if len(cols) < 9:
continue
attr = read_attrs(cols[8])
start = int(cols[3])
end = int(cols[4])
inner_start, outer_start = parse_range(attr.get("Start_range"))
inner_end, outer_end = parse_range(attr.get("End_range"))
lo = outer_start if outer_start is not None else (inner_start if inner_start is not None else start)
hi = outer_end if outer_end is not None else (inner_end if inner_end is not None else end)
print(attr.get("Name"), cols[2], start, end, "有效区间", lo, hi,
"外边界完整" if (outer_start is not None and outer_end is not None) else "外边界缺失")
注意这段代码处理的是「外边界缺失」这一类情况,输出里会看到大量记录被判为缺失。这不是解析错误,而是归档数据的常态:很多提交只给到碱基级精确断点,就没必要再给外边界。
5.5 用 Submitted 与 Remapped 求差
下面这段同时读两个装配的文件,按 Name 求差,得到「只在一个版本里出现的记录」。这个差值就是 §4.2 所说的重映射丢失与新表示。
#-- 求出 estd1 在 Submitted 与 Remapped 两个版本间的记录差集
cd /tmp
curl -sO "https://ftp.ebi.ac.uk/pub/databases/dgva/estd1_Redon_et_al_2006/gvf/estd1_Redon_et_al_2006.2014-04-01.GRCh38.Remapped.gvf.gz"
curl -sO "https://ftp.ebi.ac.uk/pub/databases/dgva/estd1_Redon_et_al_2006/gvf/estd1_Redon_et_al_2006.2014-04-01.NCBI35.Submitted.gvf.gz"
for base in estd1_Redon_et_al_2006.2014-04-01.GRCh38.Remapped \
estd1_Redon_et_al_2006.2014-04-01.NCBI35.Submitted; do
zcat "${base}.gvf.gz" | grep -v '^#' | awk -F'\t' '{print $9}' | grep -o 'Name=[^;]*' | sort -u > "${base}.names"
done
wc -l *.names
comm -23 estd1_Redon_et_al_2006.2014-04-01.NCBI35.Submitted.names \
estd1_Redon_et_al_2006.2014-04-01.GRCh38.Remapped.names | wc -l
第一行 wc 给出两个版本的唯一变异编号个数,comm 那一行给出「提交版本里有、重映射版本里没有」的条数。这个数应当被记录下来写进方法学,因为它是你做坐标转换时的实际损失。
5.6 限流与分页:区域查询的硬规则
EVA 的帮助页写明两条硬规则:区域查询的请求速率限制在每秒五次,单次请求的 limit 参数不得超过一万。超速返回 429,超限返回 500。大区间必须用 limit 配合 skip 分页。文档给的例子是一个约两万条结果的区间,用三次请求走完。
| 约束 | 数值 | 越界后果 | 应对 |
|---|---|---|---|
| 请求速率 | 每秒五次 | HTTP 429 | 请求间加间隔 |
| limit 上限 | 一次一万 | HTTP 500 | 拆分成多个请求 |
| 分页方式 | limit 加 skip | 只能拿到首页 | 循环直到少于 limit |
| 区域格式 | 染色体:起点-终点 | 空结果 | 注意坐标从 1 开始 |
§6 与库内已有条目的关系
6.1 关系图谱
DGVa 在本库的位置可以用「两条变异路线」来讲。一条是短变异路线,dbSNP 提供编目,ClinVar 提供临床解读,gnomAD 提供频率与约束。另一条就是结构变异路线,DGVa 是归档起点,DGV 与 gnomAD 的 SV 集合是下游汇总。
两条路线之间有接口但没有直连。一个 CNV 如果小于五十个碱基,在技术上归 dbSNP 管;如果大于五十个碱基,归 DGVa 这一侧。这个五十个碱基的分界由 EVA 官方说明给出,是结构变异与小变异的操作定义,而不是生物学定义。
| 库内已有词条 | 与 DGVa 的关系 | 可直接对接的字段 | 不可对接的部分 |
|---|---|---|---|
| dbSNP | 同一条变异路线的小变异一侧,五十碱基分界 | 染色体与位置 | 编号体系不同 |
| ClinVar | 临床解读层,DGVa 无对应 | 无直接字段 | DGVa 无致病性标签 |
| gnomAD | 下游频率层,其 SV 集合部分源自同源提交 | 坐标、结构类型 | 频率口径不同 |
| 本库其他基因组类条目 | 提供基因与通路注释 | 基因名 | 需自行从坐标映射 |
6.2 检索路径
在本站找与 DGVa 相关的条目,有两条路。一条是按标签,基因组学与多组学这类一级标签会把变异相关的词条聚合起来。另一条是按问题,如果你要的是「变异有没有临床意义」,应当先看 ClinVar;如果你要的是「这个变异在人群里多常见」,应当先看 gnomAD 与 DGV;只有当你问的是「这个变异谁提交的、原始文件在哪」,才该落到 DGVa。
把这个分流写清楚,能省掉大量「打开了三个库都对不上」的时间。
| 你的问题 | 首选词条 | 备选 | 不该用 DGVa 的理由 |
|---|---|---|---|
| 这个 SNP 的 rs 编号是什么 | dbSNP | ClinVar | 结构变异库不收单碱基 |
| 这个 CNV 有没有致病报道 | ClinVar | ClinGen | 无临床标签 |
| 这个缺失在人群里多常见 | gnomAD SV | DGV | 无统一频率 |
| 这个研究的数据在哪下载 | DGVa | dbVar | 这正是它的本职 |
| 这个坐标在 GRCh38 上是什么 | DGVa 的 Remapped 文件 | Ensembl 重映射工具 | 可用,但须核对损失 |
| 怎么教学生看 SV 长什么样 | DGVa 的 GVF 样例 | 无 | 可用,可读性最好 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在读任何一条关于结构变异库的负面评价之前,先确认评价的对象是哪一层。DGVa 是归档层,用「整理质量」去评价归档层是一种错位:归档的职责是忠实地保存提交者给了什么,而不是把提交者的方法缺陷修好。所以「DGVa 里有些调用看起来不可靠」这句话是合理的观察,但把它当成 DGVa 的失职是一种误判。
真正该问的是两个问题:第一,归档是否规范(格式是否统一、编号是否稳定、坐标是否说清);第二,归档是否被误当成汇总层使用(拿它当频率表、当标签集)。本篇的评分按这两个问题打,不按「数据有没有经过验证」打。
顺便交代一句口径问题:本文所有规模数字都在同一次查询里取得,接口返回的研究数、FTP 上可见的目录数、以及 2013 年数据库论文里的「超过 100 个研究」,三者的统计对象与年份都不同,不能互相校验。看到数字不一致时,先看清统计的是哪一层、哪一年。
7.1 五维评分
| 维度 | 评分 | 理由 | 扣分点 |
|---|---|---|---|
| 规范性与可解析性 | 4.5 | GVF 与 VCF 都有正式规范,属性命名统一 | GVF 属旧格式,新工具链支持少 |
| 编号稳定性 | 4.0 | estd 与 essv 稳定,可长期引用 | 三套前缀并存,跨库不可比 |
| 元数据完整度 | 2.5 | 描述与研究类型字段可用 | 样本数、提交中心、变异数全缺失 |
| 频率与标签可用性 | 1.5 | 不提供 | 无人群频率、无临床标签 |
| 可复现性 | 3.0 | 文件带日期戳,有 previous 目录 | 无固定版本快照,长期复现需自行冻结 |
7.2 DAIMS 对齐情况
按 DAIMS 的评估框架逐维看,DGVa 的强项在数据集描述与来源说明,弱项在统计信息与质量声明。
| DAIMS 维度 | 状态 | 说明 |
|---|---|---|
| 数据集标识 | 满足 | 官网地址与 estd 编号稳定 |
| 描述性元数据 | 部分满足 | study 级描述齐全,字段级说明散落在 README |
| 来源与溯源 | 满足 | 每 study 有提交者编号与文献编号 |
| 统计信息 | 不满足 | 变异总数、样本总数均未在归档层给出 |
| 质量声明 | 不满足 | 无逐记录质量标记,remap_score 只覆盖坐标 |
| 使用许可 | 满足 | EMBL-EBI 使用条款明确 |
| 版本管理 | 部分满足 | 有日期戳与 previous 目录,无正式版本号 |
7.3 已知的、可枚举的偏差
第一条,选择偏差。归档只收「有人提交的」研究,没人提交的就没进来。历史上有大量 CNV 研究没有存到公共档案,所以把归档当成「已发表 SV 研究的全集」会低估文献总量。
第二条,方法偏差。微阵列时代的研究分辨率在几十 kb 量级,测序时代能做到 kb 以下。同一个区域在两类研究里报出的变异数不是一个量级,直接合并会人为放大微阵列研究的权重,因为它们往往有更多样本、更多独立研究。
第三条,物种偏差。人类 155 个,小鼠 13 个,其余 29 个分类单元合计不到 40 个。任何跨物种的结论都受这个分布约束。
第四条,注释偏差。只有映射到 Ensembl 支持装配的变异才有后果注释,旧装配上的研究拿不到注释。§4.3 的案例里 estd1 的四个装配中就有部分不被支持。
第五条,重映射偏差。这是 §4.2 已经展开过的,Remapped 文件缺记录,缺多少不可知。
第六条,同步偏差。与 dbVar 的状态不同步,跨库计数不能相等。
上面六条里,只有选择偏差与方法偏差会直接影响「存在性」结论,其余四条影响的是「可比性」。区分这两类,决定了在方法学里该写「数据存在覆盖盲区」还是「跨库数字不可直接比较」——这两句话的责任归属完全不同,前者指向整个学科的历史,后者只指向取数流程。
7.4 外部验证矩阵
| 外部来源 | 用来验证什么 | 是否能对齐 | 对齐依据 |
|---|---|---|---|
| dbVar | 同一研究的记录数 | 部分 | nstd 与 estd 目录对应 |
| DGV | 哪个研究被下游选用 | 部分 | DGV 论文声明来源为归档 |
| 原始论文补充材料 | 提交编号与变异数 | 多数可对齐 | PubMed 编号加 submitter 编号 |
| EVA 区域接口 | 变异是否在服务端可查 | 可对齐 | study 与 file 编号 |
| Ensembl 变异视图 | 坐标在浏览器里的位置 | 可对齐 | 装配与坐标 |
7.5 它为何能持续:靠的是「提交即有编号」这条承诺
归档库的生存逻辑很简单:只要还有实验室需要为自己的结构变异找到一个可以引用的持久编号,就需要一个只做保存、不做评判的仓库。DGVa 的可持续性不来自数据质量,而来自它承担的责任——一条 essv 编号一旦发出去,对应的文件就长期可追溯。这个承诺不需要用户满意,只需要服务稳定。也正因为如此,它被并入 EVA 之后并没有消失,而是变成了 EVA 结构变异一侧的接口。
§8 生态位与历史
8.1 历史沿革
DGVa 的出现与 2000 年代中期的 CNV 研究浪潮直接相关。2006 年前后,第一批全基因组 CNV 图谱发表,短时间内涌出大量来自芯片与克隆比较基因组杂交的调用集,这些数据既不符合当时 dbSNP 的单碱基位点模型,也没有一个公共仓库接收。EBI 建立 DGVa 的初衷就是接住这批数据。
2010 年前后有一次关键的转折:DGVa 从「从文献里整理数据」改为「直接接收提交」。这个转变写在其 2013 年的数据库论文摘要里:过去两年,DGVa 与 dbVar 都在处理直接提交,而不是仅仅从文献里整理数据。同一年,双方的合作目录超过 100 个研究、覆盖 11 个物种。这两个数字是 2013 年的口径,和今天的 204 个研究不是同一件事。
2014 年 EVA 上线,DGVa 成为 EVA 的结构变异入口。同年 DGV 的数据库论文发表,说明其 55 个研究是从 dbVar 与 DGVa 的归档数据里选出来的。这条引文是理解「归档层与汇总层」关系最直接的证据。
| 时间 | 事件 | 对取数的影响 |
|---|---|---|
| 2000 年代中 | CNV 图谱集中发表 | 数据无处存放,催生归档需求 |
| 2009 年前后 | DGVa 以网页形式上线 | 有 study 浏览器与 FTP |
| 2010 年前后 | 改为接收直接提交 | 数据量激增,元数据开始标准化 |
| 2013 年 | 与 dbVar 的合作目录成形 | 双档案编号体系确立 |
| 2014 年 | EVA 上线,DGVa 成为其 SV 侧 | 新提交改用 PRJEB 编号 |
| 2019 年后 | DGV 引用逐年下降 | 下游汇总的更新节奏放缓 |
8.2 它在生态中的位置
用一句话定位:DGVa 是结构变异数据供应链的上游仓储,不是分析工具。它的邻居有三类:与它对称的 dbVar、在它下游的 DGV、以及在它之上做注释的 Ensembl 与 EVA 浏览器。
这三类邻居的边界很清楚。与 dbVar 是同级镜像,差异在同步与处理状态;与 DGV 是上下游,差异在是否做过研究筛选;与 Ensembl 是数据与视图的关系,Ensembl 读它的数据但不改它的内容。
8.3 为什么它不适合作为频率参考
这里要单独讲一件事,因为它是最容易犯错的地方。人群频率需要三个前提:样本集合明确定义、样本之间不重叠、频率在同一坐标系下计算。DGVa 一条都不满足。它的样本集由各 study 自己定义,study 之间可能重叠(同一个 HapMap 样本被多篇论文用过),坐标系有多个装配版本并存。
所以当你看到「这个缺失在 DGVa 里出现在 12 个 study 里」时,正确的解读不是「它很常见」,而是「有十二批分析独立报了它」。这两个结论差别极大,前者需要频率,后者只是存在性证据。想从存在性走到频率,必须自己定义样本集并重算。
8.4 结构变异与短变异的路线差异
| 对比项 | 短变异路线 | 结构变异路线 |
|---|---|---|
| 代表库 | dbSNP、gnomAD 短变异 | DGVa、dbVar、DGV |
| 最小单元 | 位点 | 区间加断点不确定度 |
| 检测手段 | 分型芯片、测序直接读 | 信号强度、读段对、深度突变 |
| 坐标语义 | 单碱基精确 | 内边界与外边界并存 |
| 编号粒度 | 一个位点一个编号 | 聚类位点与单样本调用两层 |
| 常见下游任务 | GWAS、注释 | CNV 判读、SV 检测模型 |
§9 使用指引
9.1 三种角色的路径
第一种是临床遗传方向。你的问题是「这个 CNV 是不是良性」。正确路径不是在 DGVa 里搜,而是先用 DGV 或 gnomAD SV 拿到频率,再用 ClinVar 看有没有致病报道,DGVa 只在需要追溯某个对照集的原始来源时才进入。如果一开始就进 DGVa,你会得到一堆看似支持「良性」的原始调用,但那只是存在性证据。
第二种是数据工程方向。你的问题是「怎么把 SV 数据接进训练管线」。路径是先用研究列表接口建索引,按物种、平台、类型筛出候选研究,再用区域接口抽样验证坐标,最后决定要不要下 FTP 全量。别跳过抽样,区域接口的返回结构就是归一化后的真实结构。
第三种是研究与教学方向。你的问题是「讲清楚一个 SV 长什么样」。路径是取一个样本量小的 study 的 Submitted GVF,逐列讲。§4.3 的案例就是为此准备的素材。
| 角色 | 第一个动作 | 第二个动作 | 常见错误 |
|---|---|---|---|
| 临床遗传 | 查频率库 | 查临床解读库 | 直接从归档库下结论 |
| 数据工程 | 拉研究列表 | 区域抽样验证 | 直接下 FTP 全量 |
| 研究教学 | 选小 study 的 Submitted 文件 | 逐列读属性 | 拿 Remapped 文件当原始数据 |
9.2 一条最短的可用流程
下面这条流程从零到拿到一个可用于分析的 study 数据集,四步,全部可运行。
#-- 最短流程:定位 study -> 看元数据 -> 下文件 -> 校验行数
set -e
STUDY="estd1_Redon_et_al_2006"
mkdir -p dgva_work && cd dgva_work
#-- 第一步:确认这个 study 在接口里存在,并读它的装配与文献
curl -s "https://www.ebi.ac.uk/eva/webservices/rest/v1/meta/studies/all" \
| jq -r '.response[0].result[] | select(.id=="estd1") | [.id,.name,.type,.assembly,(.publications|join("|"))] | @tsv'
#-- 第二步:列出该 study 在 FTP 上的全部文件
curl -s "https://ftp.ebi.ac.uk/pub/databases/dgva/${STUDY}/gvf/" | grep -o 'href="[^"]*"' | sed 's/href="//;s/"//'
#-- 第三步:只取 Submitted 文件(README 明确它才含全部提交变异)
curl -sO "https://ftp.ebi.ac.uk/pub/databases/dgva/${STUDY}/gvf/${STUDY}.2014-04-01.NCBI35.Submitted.gvf.gz"
#-- 第四步:数一下唯一变异编号,并留档到方法学
zcat "${STUDY}.2014-04-01.NCBI35.Submitted.gvf.gz" \
| grep -v '^#' \
| awk -F'\t' '{print $9}' \
| grep -o 'Name=[^;]*' | sort -u | wc -l
第三步的文件名带日期戳,这是唯一需要按 study 手工确认的一处。写进流水线时应当把这个日期戳做成参数,而不是拼死在脚本里,否则下一次文件更新会静默抓到另一份。
9.3 引用方式
引用 DGVa 有两条路。第一条是引用它的数据库论文,2013 年发表于 Nucleic Acids Research 的那篇,题为 DbVar and DGVa: public archives for genomic structural variation,DOI 为 10.1093/nar/gks1213。这篇论文交代了「直接提交取代文献整理」这个转折,是引用归档层定位时最贴切的一篇。
第二条是引用具体 study。每个 study 有自己的提交者与关联文献,方法学里写「数据取自 DGVa 的 estd 编号 X」比只写库名更有溯源价值。理想写法是三层都给:库名、study 编号、原文献。
| 引用场景 | 给什么 | 不要给什么 |
|---|---|---|
| 说明用了归档数据 | 库名加年份加访问日期 | 只写一个网址 |
| 说明具体用了哪批数据 | estd 或 PRJEB 编号 | nstd 编号(除非同时说明是 dbVar) |
| 说明分析方法 | 原文献 PubMed 编号 | 把库名当方法名 |
| 说明版本 | 文件日期戳与装配版本 | 「最新版」这类相对说法 |
§10 AI 使用声明
| 项 | 声明 |
|---|---|
| 数据性质 | 归档层数据,不是标注数据集,无监督学习标签须自建 |
| 训练集可用性 | 可作为结构变异检测任务的弱监督来源,须自行构造阴性样本 |
| 标签来源 | 无官方标签,结构类型来自提交者,后果注释来自 EVA 注释流程 |
| 偏倚继承 | 继承提交者的种群、平台与方法偏倚,不可用其代表全球人群 |
| 隐私风险 | 归档层不含个体可识别信息,但变异文件可能含样本编号,需遵守使用条款 |
| 许可约束 | EMBL-EBI 使用条款,商业使用前须自行核对各 study 声明 |
| 模型输出责任 | 任何基于本数据的模型输出不构成临床建议 |
| 引用义务 | 使用具体 study 时须引用其原始文献,不可只引库名 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| DGV 与 DGVa 是同一个库 | 维护方、数据性质、用途都不同 | 前者由 TCAG 维护并做研究筛选,后者由 EMBL-EBI 维护并只做归档;见 §3.3 对照表 |
| DGVa 是 DGV 的欧洲镜像 | DGV 是从归档里挑出来的下游,只用了 55 个研究 | DGV 2014 年论文摘要称其研究选自 dbVar 与 DGVa 的归档数据并进一步整理 |
| DGVa 能直接给人群频率 | 归档层不产出统一频率,各 study 各有频率 | 官方说明每个变异的等位频率是 study 特定的 |
| 研究数就是变异数 | 204 是个 study 计数,不是变异条数 | 官方接口的 numTotalResults 是研究数,变异数不在研究接口返回 |
| remap_score 高说明调用可信 | 它只衡量新装配上的映射质量,且值可大于一 | 样例记录 remap_score 为 1.00082 |
| Remapped 文件与 Submitted 文件等价 | README 明确只有 Submitted 含全部提交变异 | 官方 README 原句「only the GVF file(s) labeled Submitted should be assummed to contain all submitted structural variants」 |
| estd、nstd、PRJEB 可以互换 | 三者由不同机构分配,接口接受度不同 | FTP 目录同时存在 estd 与 nstd,新提交用 PRJEB |
| EVA 的后果注释等于致病性 | 后果注释是分子层面术语,不含临床意义 | EVA 用 Sequence Ontology 描述后果,致病性属 ClinVar 范畴 |
| 归档里没报的变异就是不存在 | 只是那批数据没找到 | 归档只存提交内容,无阴性样本概念 |
| 与 dbVar 的记录数应当相等 | 同步有滞后,处理流程不同 | 两侧目录并存但处理状态不同,差额官方未说明 |
| DGVa 已经停止服务 | 已并入 EVA,接口路径保留 | 官方页面仍在,结构变异研究接口返回 204 个 study |
FAQ
Q1:DGVa 和 DGV 到底哪个该写进方法学?
取决于你实际做了什么。如果你的流程是「把已知良性 SV 的频率拿来过滤」,写 DGV;如果是「从归档里取了某批原始调用做分析」,写 DGVa 并附 study 编号。两者都写也可以,但必须分别说明用途。
Q2:为什么 DGVa 的研究数和我看到的论文数字不一样?
统计对象与年份不同。2013 年的数据库论文写合作目录超过 100 个研究、11 个物种,那是当年口径;今天官方结构变异研究接口返回 204 个研究、35 个分类单元。FTP 上可见的目录又有 227 个,包含了历史目录与重复目录。三个数都对,但答的不是同一个问题。
Q3:GVF 还有人在用吗?
上游仍在提供,下游支持在减少。旧 study 只有 GVF,新 study 多为 VCF。如果你的工具链只吃 VCF,最省事的办法是用区域接口取归一化后的结果,而不是自己写 GVF 转换器。
Q4:能不能把几百个 study 的变异合并成一张频率表?
技术上能做,意义上不成立。样本集重叠情况未知,装配版本不同,方法分辨率差几个量级。要做频率,先固定装配、固定样本集、剔除重叠,再重算。
Q5:为什么样本数字段全是空的?
研究级元数据里的 numSamples 与 numVariants 在本次查询的 204 个 study 中全部为缺失值,这与 EVA 提交模板的历史演变有关:早期提交不强制填这些统计字段。样本数通常只能回到原文补充材料里找。
Q6:nstd 开头的目录能用 estd 的接口查吗?
不能直接查。nstd 是 NCBI 分配的编号,EBI 的 study 查询接口不认。正确做法是用 NCBI 的 dbVar 接口按 nstd 查,或者用坐标与文献在 EBI 侧反查对应的 estd 或 PRJEB。
Q7:SV 和小变异的分界在哪里?
官方口径是五十个碱基。EVA 帮助页把短变异研究定义为小于五十碱基,结构变异研究定义为大于五十碱基。这个分界是操作定义,方便两边分工,不是生物学界限。
Q8:区域接口返回的 numTotalResults 为什么有时是零?
两种情况。一是区间内确实没有变异;二是该物种加装配组合下没有已索引的记录。样例查询里 numResults 有两条但 numTotalResults 为零,说明这个字段在部分组合下不填充,判断空结果时应当同时看 numResults 与 result 数组。
Q9:能拿到个体的基因型吗?
部分 study 可以。VCF 格式的文件含 FORMAT 与样本列,能读到基因型;GVF 文件通常只有 sample_name 属性,读不到基因型。涉及人类基因型数据时,提交方须签署知情同意声明,使用方也须遵守使用条款。
Q10:DGVa 的数据可以商用吗?
EMBL-EBI 的使用条款允许研究用途的开放获取。商用前须逐 study 核对,因为部分提交数据可能带有提交方附加的条款。把库名当许可依据是常见的合规漏洞。
Q11:为什么同一个变异在两侧库里的起止坐标差一个碱基?
两侧的归一化流程不同。EVA 执行左对齐并收紧起止为变异实际发生区间,NCBI 的流程在边界处理上略有差别。差一个碱基是正常的,做跨库匹配时应当允许容差,不能要求逐字符相等。
Q12:做模型训练,最推荐先用哪一批数据?
先用人类对照集里样本量明确、平台单一的 study。这类 study 的调用误差来源少,适合做正样本;阴性样本得自己从同一批样本的其他区域构造。别一开始就用集合类 study,它们的子集构成往往没写清。
术语表
| 术语 | 全称或来源 | 含义 |
|---|---|---|
| DGVa | Database of Genomic Variants archive | EMBL-EBI 的结构变异归档库 |
| DGV | Database of Genomic Variants | TCAG 维护的 SV 人群对照汇总库 |
| EVA | European Variation Archive | EMBL-EBI 的变异总入口 |
| dbVar | NCBI Database of Genomic Structural Variation | NCBI 的对等归档库 |
| SV | structural variation | 结构变异,通常指大于五十碱基 |
| CNV | copy number variant | 拷贝数变异,缺失或重复 |
| CNP | copy number polymorphism | 人群中常见的拷贝数多态 |
| GVF | Genome Variation Format | GFF3 派生的变异表示格式 |
| VCF | Variant Call Format | 变异调用通用格式 |
| estd | EBI study 前缀 | DGVa 时代的研究编号 |
| nstd | NCBI study 前缀 | dbVar 的研究编号 |
| PRJEB | ENA 项目前缀 | EVA 时代的研究编号 |
| essv | EBI 单样本变异前缀 | 单条样本级结构变异调用 |
| esv | EBI 聚类变异前缀 | 聚类后的结构变异位点 |
| nssv / nsv | NCBI 对应前缀 | dbVar 的单样本与聚类编号 |
| PCR | polymerase chain reaction | 聚合酶链式反应,常用于断点验证 |
| 外边界 | outer_start / outer_end | 变异外侧已知未受影响的最近碱基 |
| 内边界 | inner_start / inner_end | 变异内已知受影响的第一个或最后一个碱基 |
| remap_score | 重映射质量分 | 坐标重映射的拟合程度,不是可信度 |
| SO | Sequence Ontology | 序列本体,用于描述变异类型与后果 |
| VEP | Variant Effect Predictor | Ensembl 的变异后果注释工具 |
| Submitted | 提交装配版本 | 提交者原始装配上的坐标 |
| Remapped | 重映射装配版本 | 重映射到另一装配后的坐标 |
| 分类单元 | taxonomyId | NCBI 生物分类编号 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 结构变异研究数 | 204 | 官方结构变异研究接口,2026-10-26 | 官方接口 |
| 分类单元数 | 35 | 同一次接口返回按 taxonomyId 统计 | 官方接口 |
| 人类研究数 | 155 | 同一次接口返回按 taxonomyId 九百六十统计 | 官方接口 |
| 对照集研究数 | 117 | 同一次接口返回按 type 统计 | 官方接口 |
| 带文献的研究数 | 178 | 同一次接口返回 publications 非空 | 官方接口 |
| FTP study 目录数 | 227 | FTP 根目录索引解析 | 官方 FTP |
| 其中 nstd 目录 | 160 | 同一次索引解析 | 官方 FTP |
| 其中 estd 目录 | 67 | 同一次索引解析 | 官方 FTP |
| 平均研究描述长度 | 约五百字符 | 同一次接口返回计算 | 官方接口 |
| 2013 年合作目录研究数 | 超过一百 | 2013 年数据库论文摘要 | 论文摘要 |
| 2013 年覆盖物种数 | 11 | 同上 | 论文摘要 |
| DGV 收录研究数 | 55 | DGV 2014 年论文摘要 | 论文摘要 |
| DGV 收录基因组数 | 超过两万两千 | 同上 | 论文摘要 |
| 短变异与结构变异分界 | 50 bp | EVA 官方帮助页 | 官方页面 |
| 区域查询速率上限 | 每秒五次 | EVA 官方帮助页 | 官方页面 |
| 单次返回上限 | 一万条 | EVA 官方帮助页 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 定义 | 本篇涉及的数字 |
|---|---|---|
| 官方页面与接口 | 直接来自 EMBL-EBI 的网页、REST 接口、FTP 索引,可复现 | 204、35、155、117、178、227、160、67、五十碱基分界、每秒五次、一万条上限 |
| 论文摘要 | 来自 Europe PMC 返回的论文摘要,代表某一年的口径 | 超过一百个研究、十一个物种、DGV 的 55 个研究与两万两千余基因组 |
| 未核实 | 本次未能取得,正文中已标注或未使用 | 全部结构变异的绝对条数、各 study 的样本总数、Remapped 文件的丢失比例 |
有一条要说明:dgv.tcag.ca 在撰写时的访问未能完成,因此凡涉及 DGV 的规模数字,全部按论文摘要处理,未按官方页面处理。使用这些数字时应注明这是 2014 年的口径。
附录 C:完整参考文献
- Lappalainen I, Lopez J, Skipper L, 等. DbVar and DGVa: public archives for genomic structural variation. Nucleic Acids Research, 2013. DOI: 10.1093/nar/gks1213. PMID: 23193291.
- MacDonald JR, Ziman R, Yuen RKC, 等. The Database of Genomic Variants: a curated collection of structural variation in the human genome. Nucleic Acids Research, 2014. DOI: 10.1093/nar/gkt958.
- Cezard T, Cunningham F, Hunt SE, 等. The European Variation Archive: a FAIR resource of genomic variation for all species. Nucleic Acids Research, 2022. DOI: 10.1093/nar/gkab960. PMID: 34718739.
- Redon R, Ishikawa S, Fitch KR, 等. Global variation in copy number in the human genome. Nature, 2006. PMID: 17122850.
- EMBL-EBI. Database of Genomic Variants archive — 主页与结构变异研究接口. https://www.ebi.ac.uk/dgva/ ,访问日期 2026-10-26.
- EMBL-EBI. European Variation Archive — 帮助与 API 文档. https://www.ebi.ac.uk/eva/ ,访问日期 2026-10-26.
附录 D:任务代码
下面是把 §5 的三段代码串成一条可重复流水线的脚本骨架,用于给一个 study 建立本地索引。它不做统计,只做「确认存在、列出文件、留下可复核的记录」。
#-- 为指定 study 建立本地索引:元数据 + 文件清单 + 版本日期
import json
import re
import subprocess
from pathlib import Path
import requests
BASE_FTP = "https://ftp.ebi.ac.uk/pub/databases/dgva"
STUDY_DIR = "estd1_Redon_et_al_2006"
STUDY_ID = "estd1"
out = Path("dgva_index")
out.mkdir(exist_ok=True)
#-- 元数据
meta = requests.get(
"https://www.ebi.ac.uk/eva/webservices/rest/v1/meta/studies/all", timeout=120
).json()["response"][0]["result"]
rec = next(s for s in meta if s["id"] == STUDY_ID)
#-- 文件清单:直接解析 FTP 目录索引
html = requests.get(f"{BASE_FTP}/{STUDY_DIR}/gvf/", timeout=120).text
files = re.findall(r'href="([^"]+)"', html)
gvf = [f for f in files if f.endswith(".gvf.gz")]
#-- 版本日期从文件名里取,避免写死
versions = []
for f in gvf:
m = re.search(r"(\d{4}-\d{2}-\d{2})", f)
versions.append({"file": f, "date": m.group(1) if m else None,
"assembly": f.split(".")[-3] if f.count(".") >= 3 else None})
index = {
"study": {"id": rec["id"], "name": rec["name"], "type": rec["type"],
"species": rec["speciesScientificName"], "assembly": rec["assembly"],
"publications": rec.get("publications") or []},
"files": versions,
"note": "只有文件名含 Submitted 的文件含全部提交变异;Remapped 文件可能缺记录",
}
(out / f"{STUDY_ID}_index.json").write_text(
json.dumps(index, ensure_ascii=False, indent=1), encoding="utf-8"
)
#-- 取一份 Submitted 文件并统计唯一变异编号数
submitted = [v["file"] for v in versions if "Submitted" in v["file"]]
if submitted:
target = submitted[0]
subprocess.run(["curl", "-sO", f"{BASE_FTP}/{STUDY_DIR}/gvf/{target}"], check=True)
names = subprocess.run(
["bash", "-c",
f"zcat {target} | grep -v '^#' | awk -F'\\t' '{{print $9}}' | grep -o 'Name=[^;]*' | sort -u | wc -l"],
capture_output=True, text=True, check=True,
)
print("唯一变异编号数:", names.stdout.strip())
这份索引的价值在于把「日期戳」与「Submitted 标记」两件事固化成数据,而不是留在人的记忆里。
-- 用 SQLite 把研究清单落库,便于按物种与类型做交叉筛选
CREATE TABLE study (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
type TEXT,
species TEXT,
assembly TEXT,
has_pub INTEGER DEFAULT 0
);
-- 筛选:人类对照集且带文献,适合做方法学引用
SELECT id, name, assembly
FROM study
WHERE species = 'Homo sapiens' AND type = 'CONTROL' AND has_pub = 1
ORDER BY id;
附录 E:如果只记五件事
第一,DGVa 与 DGV 是两个库。前者归档,后者汇总;前者由 EMBL-EBI 维护,后者由 TCAG 维护。写方法学前先确认自己用的是哪一个。
第二,204 是 study 数,不是变异数。变异数在归档层没有单一答案,要按 study 逐个数。
第三,只有 Submitted 文件含全部提交变异。Remapped 文件可能缺记录,remap_score 是映射质量不是可信度。
第四,它不提供人群频率,也不提供临床标签。要频率去 DGV 或 gnomAD,要标签去 ClinVar。
第五,编号有三套:estd、nstd、PRJEB。跨库对齐靠坐标与文献,不靠编号字符串相等。
编辑说明
本篇的核验时间为 2026-10-26。核验方式为直接访问 EMBL-EBI 的 DGVa 与 EVA 页面、调用其结构与短变异研究元数据接口、解析 FTP 根目录索引,以及通过 Europe PMC 检索相关论文摘要。涉及 DGV 的规模数字因站点访问未完成,一律按 2014 年数据库论文摘要处理,正文中已标注。未取得的内容包括全量结构变异的绝对条数、各 study 的样本总数与重映射丢失比例,这三项在正文中标注为未核实,未以估计值替代。本篇不含任何按全量下载后逐条统计得到的分布类数字,所有规模数字均为研究级计数或官方页面明示的约束值。稿件的结构变异与小变异分界、接口限流规则引自 EVA 官方帮助页,编号体系与目录构成的描述引自官方 FTP 索引与接口返回。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- dbsnp — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- ensembl — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- biosamples — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- refseq — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- ddbj — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- clingen — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- giab — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- hgdp — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- uhgg — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
- silva — 共享标签:基因组学与多组学 / 变异与注释 / 测序数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

