Dryad — 论文附录数据的第一落点

CC0 强制的通用数据存储库:2024/25 财年 65,786 个已发布数据集、5,000 万+ 文件、全部 DOI 化

来源 Dryad Digital Repository url: https://datadryad.org发布时间: 2026-10-22最后更新: 2026-10-22 阅读 15
Dryad — 论文附录数据的第一落点

信息速览

数据集名称Dryad — 论文附录数据的第一落点
数据类型65,786 个已发布数据集,50,000,000+ 文件,CC0 1.0 全库强制,DOI 前缀 10.5061,免注册直下,JSON API 无鉴权
规模不适用(通用存储库,收录 65,786 个独立数据集)
接入方式Dryad Digital Repository url: https://datadryad.org
AI 就绪度

Dryad — 论文附录数据的第一落点 AI-Ready Wikipedia


INFOBOX

字段 内容
数据集名称 Dryad 数字存储库
英文全称 Dryad Digital Repository
别名/简称 Dryad、datadryad、Dryad Data Repository
疾病分类 不适用(通用型存储库,跨全部学科;抽样中医学与健康科学占 2.7%)
SNOMED CT 不适用(非临床术语体系,按 DataCite 学科分类组织)
数据模态 不限:表格(CSV/XLSX)、测序(FASTA/VCF)、影像、代码脚本、README 文本、补充材料 PDF
AI 任务类型 元数据抽取、表格理解、文献-数据对齐、跨库检索、开放科学计量、数据集推荐
样本总数 65,786 个已发布数据集(2024/25 财年年报,截至 2025-06);API 实时口径 72,871 条(2026-10-22)
数据大小 5,000 万+ 文件;单数据集抽样中位数 0.65 MB、最大 242 GB、上限 300 GB
数据格式 3,800 种文件类型;元数据 JSON(v2 API)与 DataCite XML
许可证 CC0 1.0 Universal(全库强制,不接受其他许可、不允许访问限制)
访问级别 开放(免注册、免凭证、免数据使用协议)
DUO 标签 官方未发布 DUO 标注;CC0 等效于 NRES(无限制),但人源数据仍受原研究伦理约束
语言 英文(元数据与 README 以英文为主)
首发日期 2008(datadryad.org 上线;2007 年由 NESCent 立项)
最后更新 持续入库(API 快照 2026-10-22)
发布机构 Dryad(美国 501©(3) 非营利组织);保存在加州数字图书馆 CDL 的 Merritt
官方主页 datadryad.org
下载地址 v2 API 检索入口、网页检索
DOI 每条数据集一个 DataCite DOI,前缀 10.5061(例:10.5061/dryad.q2bvq83sk)
引用次数 数据集级引用由 Make Data Count 统计;库级引用数官方未汇总公布
AI 就绪度评分 ⭐⭐⭐(3/5)— 元数据规整、API 免鉴权、许可零障碍;扣分项:异构文件无统一 schema、无主题标签、metrics 对新数据恒为 0
页面状态 published

§0 E-E-A-T 信任声明与免责声明

  • 医学审核者:千方病案医学编辑部(公共卫生与数据治理方向编辑)交叉审核:§2 学科分布与医学数据占比、§7 偏倚与伦理分析。
  • 数据工程审核者:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 元数据字典、§5 检索与抽样策略、§6 API 抽取 Pipeline 和 8 个坑点。
  • 审核日期:2026-10-22

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。Dryad 是通用型数据存储库,其收录的医学与健康科学数据分散在独立论文配套材料中,不构成任何临床队列;任何基于该库子集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、抽取流程与规模数字基于 2026-10-22 的公开资料与接口实测整理,Dryad 的 API 字段、计数口径与限流策略可能随时变更,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性与下载流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:Dryad 全库数据以 CC0 1.0 发布,法律上无需署名即可再分发,但学术惯例要求引用数据集 DOI 与关联论文。需特别注意:CC0 只解除著作权层面的限制,不解除研究伦理层面的限制——人源数据即便以 CC0 发布,二次使用仍应遵守原研究的伦理批件范围与当地法规;含间接标识符(罕见病 + 地域 + 精确日期)的数据集在发布后无法撤回,使用者应自行完成披露风险评估。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? 一篇论文在期刊上发表了,它的原始数据放哪儿?对相当大一部分生命科学、生态与医学论文来说,答案是 Dryad。它不是一个"数据集",而是六万多个数据集的家——2008 年上线,由美国非营利组织运营,接收来自 106,950 家机构、287,000 多位研究者的数据提交,全部数据以 CC0 1.0 无条件开放,每条数据集注册一个以 10.5061 开头的 DataCite DOI。

为什么重要? 学科专用库(GEO、PRIDE、EGA)解决的是"某一类数据该放哪",但大量论文里的数据既不是测序也不是质谱——是一张补充表、一份问卷原始记录、一段分析脚本、一批行为学观察。这类数据长期无处可去,最终以"应要求联系作者"的形式消失。Dryad 填的就是这个洞。它的独特之处在于 relatedPublicationISSN 字段:每条数据都和一篇具体论文绑定,这使得"从文献找数据"和"从数据找文献"成为可编程的双向操作,这是学科库做不到的。

我能用它做什么? 最现实的用法是按主题检索而非整库下载:用 v2 API 按关键词、ISSN、机构 ROR 过滤,取回几十到几千条目标数据的元数据表,再逐条下文件。它适合构建文献-数据对齐数据集、训练表格抽取模型、研究开放科学政策效果;不适合当作临床队列——它的医学与健康科学占比只有 2.7%,而且没有统一标注体系。

§1.1 技术摘要

Dryad 于 2007 年由 NESCent(美国国家进化综合中心,Duke/UNC/NCSU 联合体)在 NSF 资助下立项,2008 年 datadryad.org 上线,2012 年注册为独立的美国 501©(3) 非营利组织。2019 年平台从 DSpace 迁移到自研的 Stash(Ruby on Rails,MIT 许可,代码在 CDL-Dryad/dryad-app),拆为 Store(元数据与文件)、Harvest(导出与 Solr 索引)、Share(GeoBlacklight 前端)三个模块;底层文件保存在加州数字图书馆(CDL)的 Merritt 保存库中,Merritt 持 CoreTrustSeal 认证。文件多地理位置副本 + SHA-256 校验,校验周期约 60 天,元数据每晚备份,承诺无限期保留。

元数据遵循 DataCite Metadata Schema,并强制使用 ORCID(作者)、ROR(机构)、Crossref Funder Registry(资助方)三类持久标识符;每条数据集注册一个 DataCite DOI,DOI 通过后缀实现版本控制。2020 年起与 Zenodo 建立集成:数据进 Dryad、代码进 Zenodo、双向互链。使用统计走 Make Data Count 规范(Make Data Count + DataCite Event Data),这也是本项目相对其他存储库在"数据被引用多少次"上可计算的原因。

规模有两套必须分开的口径:官方 2024/25 财年年报(截至 2025-06)记 65,786 个已发布数据集、5,000 万+ 文件、3,800 种文件类型;v2 API 在 2026-10-22 实测返回 total = 72,871。前者是审计过的财年快照,后者是实时计数含当年新入库,两者不可混用——本条目在全部章节严格区分。

§1.2 战略价值

维度一:补齐"论文附录数据"这一长期缺位的品类。 千方医数集库内 1,321 条数据集中,带"库/仓"性质的条目全部是学科专用(PRIDE 质谱、Metabolomics Workbench 代谢组、EGA 受控基因组),通用存储库这一品类此前为 0。这不只是收录清单的一个空格,而是数据获取路径的一整个分支缺失:当一篇医学论文说"原始数据见补充材料"而补充材料只是一个 DOI 时,这个 DOI 大概率指向 Dryad 或 Zenodo。理解 Dryad 的结构,等于给全库补上了一条从文献通向原始数据的通用通道。

维度二:CC0 全库强制带来的下游自由度。 医学 AI 数据工程最常见的阻塞点不是算法,是许可:CC BY-NC 禁止商用、DUA 禁止再分发、受控访问要等三个月审批。Dryad 把这些全部绕开了——所有数据集一律 CC0 1.0,不接受其他许可,不支持访问限制。这意味着用它构建的衍生数据集可以自由再分发、可以进商业模型训练、可以做二次标注后重新发布。代价是它反过来也限制了"想保留部分权利"的提交者,这正是 Dryad 与 Zenodo(可选多种许可)的核心分野。

维度三:元数据层的可编程性。 v2 API 无需鉴权、返回 JSON、支持 ROR/ISSN/机构/时间过滤,且每条记录带 relatedWorks(含关联论文 DOI)与 relatedPublicationISSN。对做文献-数据联动、开放科学计量、数据集推荐系统的团队,这是一个可以直接接进 pipeline 的元数据源,而不是需要爬虫与解析的网页。它的字段设计本身就是一份"研究数据元数据该怎么建"的参考实现。

§1.3 同类平台横向对比

平台 定位 规模口径 许可策略 与 Dryad 的差异化
Dryad(本条目) 通用型、论文配套数据 65,786 数据集(2024/25 年报)/ 72,871(API 2026-10-22) 全库强制 CC0 1.0,无例外 唯一以 relatedPublicationISSN 与文献强绑定的通用库;文件保存在 Merritt,CoreTrustSeal 认证;策展收费($150 起)
Zenodo(CERN) 通用型、含软件与预印本 数百万条记录量级 可选多种 CC 许可,可闭源 规模远大于 Dryad;承载代码与预印本;无强制 CC0;2020 起与 Dryad 双向互链(数据↔代码)
Figshare 通用型、机构与出版社集成 百万级 可选多种许可 更偏"成果展示",与出版社工作流耦合深;策展深度低于 Dryad
OSF(Center for Open Science) 项目工作区 + 预注册 项目级 可选多种许可 强在项目全流程(预注册→数据→稿件),弱在数据集级 DOI 粒度
Dataverse(哈佛等机构部署) 机构/联盟型 按部署实例 可选多种许可 机构自建、可控性强;跨机构聚合需联邦检索
GBIF 学科专用(生物多样性) 数十亿条 occurrence 记录 各发布者自定(多为 CC0/CC BY) 结构化 occurrence 本体;Dryad 是文件级存储,无统一 occurrence schema
ENA / SRA 学科专用(测序) 亿级 run 开放 强制 INSDC 格式;Dryad 无格式约束

§1.4 版本与平台演进时间轴

时间 事件 说明
2007 NESCent 立项 由 NSF 资助,Duke/UNC/NCSU 联合体推动;起因是 JDAP(Joint Data Archiving Policy, 2011 正式发布)所代表的"数据必须随论文归档"共识
2008 datadryad.org 上线 开始接收首批数据集
2011 JDAP 发布 一批进化生物学期刊联合要求数据必须存入公共库,Dryad 成为默认落点之一
2012 注册为美国 501©(3) 非营利 从 NESCent 项目转为独立组织
2019 从 DSpace 迁移到自研 Stash Ruby on Rails,MIT 许可;三模块架构(Store / Harvest / Share)确立
2020 与 Zenodo 集成 数据进 Dryad、代码进 Zenodo,双向互链
2023-07 至 2024-06 新增 5,567 个数据集 官方 2024 年报口径
2025-06 2024/25 财年收官 累计 65,786 个已发布数据集、5,000 万+ 文件、3,800 种文件类型
2026-01 社区更新 官方口径"5,000 万条 curated data files"
2026-07 与 CEDAR 合作公告 官方博客表述"over 70,000 highly-discoverable preserved research datasets"
2026-10-22 v2 API 实时快照 total = 72,871;per_page=2 时 _links.last 为 page=36436

§1.5 典型应用场景

  1. 论文配套数据的批量获取:给定一批目标论文(按 ISSN + 关键词 + 年份),用 API 拉取对应数据集元数据与文件清单,构建"文献-数据"配对语料。这是本条目最主要的使用形态。
  2. 表格理解与数据抽取研究:抽样中位数仅 0.65 MB 意味着大量数据集是小型表格包(CSV/XLSX + README),是训练跨表 schema 匹配、单位识别、缺失值推断模型的真实语料。
  3. 开放科学政策计量:按 relatedPublicationISSN 统计各期刊的数据共享率,按 authors[].affiliationROR 统计机构贡献,评估资助方数据政策的实际效果。
  4. 医学论文补充材料的溯源:临床研究常把问卷原始表、患者级汇总表放在 Dryad。做系统综述或 meta 分析时,这是绕过"联系作者"的合法路径。
  5. 数据引用与 FAIR 实践教学:每条记录都带 DataCite DOI 与完整作者/机构/资助方标识,是讲"什么是可引用数据"的现成样本库。

§2 学科分布与医学相关性

§2.1 学科分类映射与占比

Dryad 不使用 ICD-11 疾病编码——它不是临床数据集,元数据里的学科字段是 fieldOfScience(采用 OECD 弗拉斯卡蒂学科分类的英文表述)。下表把抽样 600 条的实际占比与该学科在医学研究中的关联度并列,供判断"这个库对医学 AI 到底有多少料":

fieldOfScience 取值 抽样条数 占比 ICD-11 关联 对医学 AI 的价值
Biological sciences 286 47.7% 章节级关联(病原、生理、遗传) 高:分子与细胞层面的机制数据,常可迁移到疾病建模
(空值,未标注) 102 17.0% 无法映射 未知:需读标题与摘要人工判断
Earth and related environmental sciences 53 8.8% 环境健康、气候与疾病传播 中:环境暴露、媒介生态数据
Natural sciences(其他自然科学) 52 8.7% 弱关联 低:多为方法学与基础科学
Medical and health sciences 16 2.7% 直接对应 高:临床、公卫、护理原始数据
Physical sciences 13 2.2% 弱关联(影像物理、辐射剂量) 低到中:需按主题筛
Agriculture, forestry and fisheries 10 1.7% 食品安全、人畜共患病 中:One Health 视角
Chemical sciences 7 1.2% 药物化学、毒理 中:化合物与暴露数据
Computer and information sciences 7 1.2% 方法学 低:多为基础算法与工具
其他(Engineering / Social / Humanities 等) 54 9.0% 卫生服务研究、社会科学 低到中:视主题而定

抽样方法:/api/v2/search?q=*&per_page=100,取 page 1、2、3、50、200、500,合计 600 条,统计 fieldOfScience 字段。注意抽样页分布偏向早期入库记录(page 1 为最新,page 500 为较早期),占比仅供量级参考,不应作为全库普查结论。

§2.1b 与临床术语体系的映射说明

Dryad 的元数据中没有 SNOMED CT、没有 ICD-11、也没有 MeSH 主题词。这不是疏漏而是设计选择:通用型存储库无法预设学科本体,只能提供最粗粒度的学科分类加自由关键词。工程上的正确做法是在入库层做二次映射,而不是期待 Dryad 提供编码:

你的需求 Dryad 原生能否满足 建议做法
筛出某疾病相关的数据集 否(无疾病编码) 用关键词 + relatedPublicationISSN 限定到具体期刊,再人工/LLM 判读标题与摘要
按器官系统聚合 否 同上,建立自有映射表
按研究类型(RCT / 观察 / 基础)分层 否 从 title 与关联论文摘要推断,并保留推断置信度
按机构/国家统计 是(authors[].affiliationROR) 直接用 ROR 聚合
按期刊统计 是(relatedPublicationISSN) 直接聚合,可对接 Crossref

§2.2 这个库在医学数据生态里的实际位置

把 Dryad 放在医学数据的完整供应链上看,它占据的是末端归档层,而不是原料层:

  • 原料层:测序原始读段(SRA/ENA)、质谱原始谱图(PRIDE)、影像原始 DICOM(TCIA)。这些库有强制格式与本体,是"大宗数据"。
  • 加工层:GEO 的标准化表达矩阵、Metabolomics Workbench 的代谢物定量表、ArrayExpress 的处理后矩阵。这些库有统一 schema,可直接建模。
  • 归档层(Dryad 所在):论文里那些"不属于任何标准库"的数据——补充表、问卷原始记录、行为学观察、模型参数、分析脚本、图像标注文件。它们格式自由、体量小、彼此不兼容,但数量极多且与具体结论一一对应。

这个位置决定了 Dryad 的两个特征。第一,它的单条记录信息密度极高:一个小数据集往往就是论文某张核心图背后的完整数字,比 GEO 里一个上千样本的矩阵更直接地对应一个科学结论。第二,它的跨记录一致性极低:同一期刊的两篇论文,一个交 CSV + 代码,一个交 XLSX + PDF,无法批量对齐。使用者必须接受"逐条处理"的现实。

对医学 AI 而言,真正有价值的用法不是"拿 Dryad 训练一个大模型",而是三条具体的窄路:

  1. 补充材料复现:想复现某篇临床预测模型论文,正则需要它的系数表与样例数据——多半在 Dryad。
  2. 小样本表格建模:中位数 0.65 MB 的体量天然适合做表格问答、单位换算、缺失值推断的训练语料。
  3. 系统综述的数据溯源:meta 分析要提取原始效应量,Dryad 提供了一条不必联系作者的合法通道。

§2.3 临床任务关联度评估

AI 任务 Dryad 可作为 适用度 说明
疾病筛查模型训练 补充数据源 低 无病例对照设计,样本零散,标签不统一
预测模型外部验证 复现素材 中 若目标论文的验证数据在此,可直接取用
表格信息抽取 主训练语料 高 大量异构 CSV/XLSX + README,天然的多格式样本
文献-数据对齐 主数据源 极高 relatedPublicationISSN + relatedWorks 直接提供配对关系
数据引用计量 主数据源 高 Make Data Count 事件 + DataCite DOI
医学图像分割 弱相关 低 影像多走 TCIA/IDC,Dryad 仅零星存放
真实世界证据 补充 低到中 需按主题逐篇筛

§2.4 提交者人群画像

维度 情况
提交主体 论文作者本人(第一作者或通讯作者),非数据生产者团队专职提交
机构覆盖 106,950 家机构(官方 2024/25 年报),通过 ROR 标识
研究者覆盖 287,000+ 位研究者,通过 ORCID 标识
期刊覆盖 1,295 种期刊(官方年报),部分为强制数据政策期刊
资助方覆盖 6,445 个资助方,通过 Crossref Funder Registry 标识
地域分布 全球,但明显偏向有数据共享强制政策的国家与机构
提交动机 期刊数据政策强制(主因)、资助方要求、机构会员免费额度、作者自发

§2.5 为什么"通用"反而是它的医学价值

一个反直觉的论点:Dryad 的医学价值恰恰来自它不专。

学科专用库有一个共同的结构性盲区——它们只收得住标准化的数据。一个临床研究团队做完一项横断面调查,产出是三张表:一张患者特征表、一张量表得分表、一张多因素回归结果表。这三张表不符合 GEO 的表达矩阵格式,不符合 PRIDE 的谱图格式,不符合 TCIA 的 DICOM 格式,也不符合 dbGaP 的受控访问门槛。它会去哪?过去是"联系作者",现在是 Dryad。

这意味着 Dryad 里躺着的正是最容易被系统性忽略的那一类医学证据:观察性研究的原始记录、量表工具的验证数据、卫生经济学的成本表、护理干预的过程记录。这些数据在循证医学的证据分级里不占高位,但在真实世界证据、量表本地化、卫生服务研究中不可替代。

同时这也解释了 §2.1 表格里那个刺眼的 2.7%:不是医学数据少,而是医学领域有太多更"顺手"的专用库分流了提交量。用 Dryad 做医学研究,必须接受"它是补充通道而非主通道"的定位。

§2.6 数据质量标准:Dryad 检查什么、不检查什么

检查项 Dryad 是否执行 说明
文件可读性 ✅ 是 策展团队会打开文件确认未损坏、非空
README 存在 ✅ 是,强制 缺失时提交会被退回补交
许可合规 ✅ 是 仅接受 CC0;含第三方受限数据会被拒
元数据完整性 ✅ 是 必填字段缺失会退回
FAIR 原则符合度 ✅ 部分 可发现(DOI + 索引)、可访问(开放)、可互操作(DataCite schema);可复现仅靠 README 自律
科学有效性 ❌ 否 明确不做同行评审式的科学性审查
统计方法正确性 ❌ 否 不核对数字与论文结论是否一致
去标识化充分性 ⚠️ 部分 要求提交者声明并自查,Dryad 不重新识别、不颁证
文件格式标准化 ❌ 否 3,800 种文件类型,无强制格式
跨数据集一致性 ❌ 否 通用库不提供任何统一 schema

一句话总结:Dryad 保证的是"这份数据能被找到、能下载、能打开、许可清楚",不保证"这份数据是对的"。


§3 存储库规格与版本抉择

§3.0 三个入口的抉择矩阵

Dryad 有网页、API、DOI 解析三条进入路径,每条的能力边界不同。选错了会白做大量工作:

你的需求 推荐入口 返回形态 理由
快速看看有什么 网页检索 HTML 分页列表 支持引号精确、* 通配、NOT / - 排除,交互式探索最快
批量拉元数据(>100 条) v2 API /search JSON,单页最多 100 条 唯一可编程通道,per_page 上限 100
取单个已知数据集 v2 API /datasets/{encoded_doi} JSON 单条 DOI 必须 URL 编码,否则 404
取文件清单 v2 API /versions/{vid}/files JSON 文件数组 单条 dataset 记录不含文件列表,必须二次跳转
下文件 stash:download 链接 302 → S3 不能当静态 URL 用,见坑点 1
引用与版本追溯 https://doi.org/10.5061/dryad.xxx 302 → 最新版 DOI 解析永远指向最新版本;要旧版须用带版本后缀的 DOI

§3.1 元数据字段全景

/api/v2/search 返回的每条 dataset 记录字段(2026-10-22 实测全量):

字段 类型 说明
identifier string DataCite DOI,形如 doi:10.5061/dryad.q2bvq83sk
id integer Dryad 内部数据集 ID
storageSize integer 占用字节数
title string 标题,常以 Data from: 开头接论文标题
authors array 每项含 firstName/lastName/email/affiliation/affiliationROR/orcid
abstract string 数据集摘要(部分为空)
keywords array 作者自填关键词
fieldOfScience string 学科分类,17.0% 为空
relatedWorks array 关联作品,含论文 DOI 与关系类型
relatedPublicationISSN string 关联论文期刊 ISSN
versionNumber integer 版本号
versionStatus string 抽样全部为 submitted
curationStatus string 抽样全部为 Published
versionChanges string 版本变更说明
publicationDate string 首次发布日期
lastModificationDate string 最后修改日期
visibility string 抽样全部为 public
sharingLink string 分享短链
changedFields array 相对上一版变更的字段名
license string 抽样前 100 条全部为 https://spdx.org/licenses/CC0-1.0.html
metrics object {views, downloads, citations},抽样中位数全为 0

§3.2 分学科子集规模

Dryad 没有官方"子集"概念,但可以通过 API 参数切出可用的逻辑子集。下表是可验证的切分方式(含抽样得到的规模感):

逻辑子集 切分方式 抽样规模感 医学适用度
医学与健康科学 客户端筛 fieldOfScience == "Medical and health sciences" 600 条中 16 条(2.7%) 高
特定期刊 ?journal-ISSN=XXXX-XXXX 按期刊而定,1,295 种期刊可选 高(可锁定目标期刊的数据共享量)
特定机构 ?org=<ROR ID> 按机构而定,106,950 家可选 中
时间窗 ?modifiedSince=YYYY-MM-DD 增量同步用 中
关键词命中 ?q=<term> 视词频 取决于词
大体量(>1 GB) 客户端按 storageSize 筛 抽样最大 242 GB 低(多为生态/地球科学)

§3.3 文件格式分布

官方口径 3,800 种文件类型。这不是夸张——通用库把提交者用什么就存什么,不做格式转换。抽样中反复出现的高频类型:

格式族 典型扩展名 在医学语境中的常见内容
表格 .csv .xlsx .tsv .dta .sav 患者特征表、量表得分、问卷原始记录
纯文本 .txt .md .pdf README、代码本、补充材料
序列与变异 .fasta .vcf .gb .phy 病原基因组、系统发育矩阵
影像与栅格 .tif .png .jpg .nii 组织切片照片、野外照片、少量医学影像
代码 .R .py .do .sas .m 统计分析脚本(Dryad 也收代码,但不作为主用途)
压缩包 .zip .tar.gz 多文件打包(注意:压缩包会隐藏内部结构)

§3.4 存储体量与上限

指标 数值 来源
全库文件总数 5,000 万+(2026-01 官方口径"5,000 万条 curated data files") 官方博客
单数据集上限(网页提交) 300 GB Dryad roadmap issue #3528
抽样中位体量 0.65 MB(首 100 条为 1.01 MB) 本 Wiki 600 条实测
抽样最大体量 242 GB(首 100 条内 74 GB) 本 Wiki 600 条实测
单文件明确上限 官方未设,但 >10 GB 的费用豁免不批 CASRAI 指南
超限处理 需联系,dev 团队临时全局放开限制(影响所有用户) roadmap issue #3528

§3.5 策展流程与人工介入点

阶段 谁做 做什么 失败后果
提交 作者 填元数据表单、上传文件、写 README 缺 README 直接退回
自动检查 系统 文件可读、病毒扫描、许可勾选 不通过则停在草稿态
人工策展 Dryad 策展团队 打开文件确认内容、核对元数据与文件一致性、判定是否含第三方受限数据 不通过则退回作者修改
发布 系统 注册 DataCite DOI、写入 Solr 索引、生成分享链 —
对外同步 Harvest 模块 导出到第三方聚合器、Google Dataset Search 等 索引延迟,不影响本体

关键点:Dryad 的策展是流程性的,不是学术性的。审核员不会判断你的统计方法对不对、样本量够不够、结论是否被数据支持。这个判断必须由使用者自己做。

§3.6 版本与更新机制

  • 每条数据集自带 versionNumber,同一 DOI 可含多版本。
  • DOI 解析默认指向最新版;引用特定版本需用带版本后缀的 DOI。
  • 版本变更会记录在 versionChanges 与 changedFields 中,可追溯改了什么。
  • 官方承诺无限期保留,且 Merritt 的多副本 + SHA-256 校验(约 60 天周期)提供了完整性保障。
  • 但注意:CC0 意味着旧版本无法撤回。作者若发现数据有误,只能发新版并说明,旧版仍可被访问。

§3.7 地域与机构覆盖

指标 数值 口径
覆盖机构 106,950 家 官方 2024/25 年报(ROR 标识)
覆盖研究者 287,000+ 位 同上(ORCID 标识)
覆盖期刊 1,295 种 同上
覆盖资助方 6,445 个 同上(Crossref Funder Registry)
地理倾斜 明显偏向北美与西欧 由 Funder/Journal 数据政策驱动,非平台限制

§3.8 技术栈与保存链

层 组件 说明
应用层 Stash(Ruby on Rails,MIT) 2019 年自研替换 DSpace;代码 CDL-Dryad/dryad-app
模块划分 Store / Harvest / Share Store 管元数据与文件;Harvest 管导出与 Solr 索引;Share 是 GeoBlacklight 前端
保存层 Merritt(加州数字图书馆 CDL) 持 CoreTrustSeal 认证;多地理位置副本
校验 SHA-256,周期约 60 天 文件级;digestType 字段回报
索引 Solr 全文检索走 Harvest 导出的索引
API v2 REST,JSON 无需鉴权;per_page 上限 100
计量 Make Data Count + DataCite Event Data 支撑 metrics 字段(但有延迟)
互链 Zenodo 集成(2020 起) 数据↔代码双向链接

§3.9 溯源链:一条数据从提交到被引用

作者上传(元数据表单 + 文件 + README)
   ↓ 自动检查(可读性/病毒/许可勾选)
Dryad 策展团队人工核对(内容与元数据一致性、第三方受限数据判定)
   ↓ 通过
发布 → 注册 DataCite DOI(10.5061/...),写入 Solr
   ↓ Harvest 模块
导出到第三方聚合器 / Google Dataset Search / DataCite Commons
   ↓ 被论文引用
DataCite Event Data 捕获引用事件 → Make Data Count → metrics.citations
   ↓
API 返回 metrics(延迟数月)
文件本体 → Merritt 保存库(多副本 + 60 天 SHA-256 校验)

理解这条链的关键在于两个延迟:索引延迟(发布后到被检索到,通常数小时到一天)与计量延迟(被引用到 metrics 更新,通常数月)。坑点 3 会详细处理后者。


§4 元数据结构与字段字典

§4.0 三层对象模型与目录形态

Dryad 的对象模型是三层的,这是全部开发工作里最容易踩错的认知点:搜索返回的是 dataset,dataset 只挂着一条 version 链接,version 才挂着 files 链接,files 才是真正可下载的东西。JSON 里看不到这个层级,只有 _links 里埋着。

GET /api/v2/search?q=*&per_page=100&page=1
└── _embedded["stash:datasets"][i]          ← 第 1 层:数据集记录(无文件列表)
    ├── identifier: "doi:10.5061/dryad.q2bvq83sk"
    ├── title / abstract / authors / fieldOfScience / metrics
    └── _links["stash:version"].href
            ↓
        GET /api/v2/versions/{version_id}    ← 第 2 层:版本记录(files 恒为空数组)
        └── _links["stash:files"].href
                ↓
            GET /api/v2/versions/{version_id}/files   ← 第 3 层:文件列表
            └── _embedded["stash:files"][j]
                ├── path: "README.md"
                ├── size: 4821
                ├── mimeType: "text/markdown"
                ├── status: "copied"
                ├── digest: "3f2a...c91"
                ├── digestType: "sha-256"
                └── _links["stash:download"].href
                        ↓
                    GET /api/v2/files/{file_id}/download   ← 302 → S3 预签名 URL

下载解压后的典型目录形态(以一份医学横断面调查数据为例,q2bvq83sk 这类六个字符的短码是 Dryad 的标准 DOI 后缀):

dryad_q2bvq83sk/
├── README.md                    ← 强制项,缺失会被策展退回
├── data/
│   ├── participant_characteristics.csv
│   ├── scale_scores_raw.xlsx
│   └── regression_output_table3.csv
├── code/
│   ├── 01_clean.R
│   └── 02_analysis.R
└── docs/
    ├── codebook.pdf
    └── ethics_approval.pdf

注意三点:目录名派生自 DOI 后缀而不是数据集 ID;层级完全由提交者自定,没有强制规范;README 的位置、命名、格式全靠作者自律——这是 Dryad 与学科库最大的结构差异。

§4.1 字段字典(dataset 记录)

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
identifier string DataCite DOI 全串 doi:10.5061/dryad.q2bvq83sk 主键、去重、文献对齐 DOI 大小写与 URL 编码不一致会导致 404 无(必填) 固定前缀 doi:10.5061/
id integer 内部数据集 ID 12345 关联内部路由 与 version id 不是同一个号 无 正整数
storageSize integer 字节数 4821037 体量分层、下载预算 只算文件本体,不含副本 无 1 ~ 3×10¹¹
title string 标题 Data from: Seasonal influenza ... 主题分类、检索 前缀 Data from: 不总存在 无 ≤ 数百字符
abstract string 摘要 This dataset contains ... 语义检索、LLM 摘要 部分记录为空 空串 "" 0 ~ 数千字符
authors array 作者数组 [{firstName, lastName, affiliation, affiliationROR, orcid}] 机构聚合、作者消歧 affiliationROR 可能缺 字段级缺失 1 ~ 数十项
keywords array 作者自填关键词 ["influenza","vaccination"] 主题标签 拼写不统一、大小写混杂 空数组 [] 0 ~ 十余项
fieldOfScience string OECD 学科分类 Biological sciences 学科筛 17.0% 为空 空串 "" 约 30 个取值
relatedWorks array 关联作品 [{identifier, relationship}] 文献回流 关系类型枚举不统一 空数组 [] 0 ~ 数项
relatedPublicationISSN string 期刊 ISSN 0028-0836 期刊维聚合 部分记录为空 空串 "" 8 位 ISSN
versionNumber integer 版本号 2 版本追溯 只增不减 无 1 ~ 数十
versionStatus string 版本状态 submitted 状态过滤 抽样全部为此值,语义偏弱 无 枚举
curationStatus string 策展状态 Published 只取已发布 抽样全部为此值 无 枚举
publicationDate string 首发日期 2024-03-15 时间切片 是首次而非本版 无 ISO 8601
lastModificationDate string 最后修改 2024-11-02T08:12:44Z 增量同步 时区为 UTC 无 ISO 8601
visibility string 可见性 public 排除禁运 抽样全部为 public 无 public / 其他
license string 许可 https://spdx.org/licenses/CC0-1.0.html 合规校验 抽样 100% CC0 无 单值
metrics object 计量 {views:0, downloads:0, citations:0} 使用度排序 新数据集恒为 0 全 0 非负整数

§4.2 字段字典(file 记录)

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
path string 相对路径 data/participant.csv 目录重建 含中文/空格时需解码 无 ≤ 数百字符
size integer 字节数 10240 体量预算 与 storageSize 求和近似相等 无 ≥ 0
mimeType string MIME text/csv 文件族分类 通用库常见 application/octet-stream 兜底 可能为通用值 数千种
status string 复制状态 copied 确认可下 非 copied 表示尚未入 Merritt 无 枚举
digest string 校验和 3f2a...c91 完整性验证 需配合 digestType 无 64 位 hex
digestType string 算法 sha-256 算法选择 抽样全部为 sha-256 无 枚举

§4.3 学科分布的实际形态

§2.1 的分布表有一个容易被忽略的推论:47.7% 集中在 Biological sciences,17.0% 什么都没标。这两条加起来占 64.7%,意味着用 fieldOfScience 做学科筛,你会同时面临"过度集中"和"完全缺失"两个问题。

情形 占比 可行对策
有明确学科标签且为目标学科 2.7%(医学)至 47.7%(生物) 直接用标签筛
有标签但非目标学科 约 32.6% 排除
完全无标签 17.0% 只能靠关键词与标题检索召回,或直接遗漏

工程建议:不要用 fieldOfScience 当唯一筛选条件。正确的做法是双通道召回——通道 A 用学科标签,通道 B 用一组领域关键词(如 patient、cohort、clinical trial、questionnaire、hospital)检索,两路结果取并集后去重。这样能把那 17.0% 无标签记录里的相关部分捞回来一部分。

§4.4 数据层级:数据集 → 版本 → 文件

层级 粒度 数量关系 AI 建模时的含义
数据集(dataset) 一篇论文的配套数据 65,786 条(年报) 样本单位是"论文级",不是"患者级"
版本(version) 一次发布 每条 ≥1 个 同一数据集可能有多版,取最新
文件(file) 物理文件 每条 1 ~ 数百个 真正可下的单元;全库 5,000 万+
表内行 观测 完全由作者决定 无统一语义

§4.5 缺失值与信息性缺失编码

Dryad 的缺失不是"值为 NULL",而是"字段存在但为空"或"字段根本不存在"。四种形态要分开处理:

缺失形态 表现形式 出现频率 处理建议
空字符串 "fieldOfScience": "" 17.0%(学科)/ 部分(摘要) 可判为"作者未填",需关键词补召回
空数组 "keywords": [] 常见 判为"无自填关键词",不等于无主题
字段整体缺省 JSON 里没有该键 视字段而定 解析时用 dict.get() 而非下标,避免 KeyError
数值恒零 "metrics": {"views":0,"downloads":0,"citations":0} 新数据集几乎全部 这是坑点 3,不能当"无人使用"

对应的解析代码必须写成防御式:

def safe_get(rec: dict, *path, default=None):
    """按路径安全取嵌套字段,任一环节缺失都返回 default。"""
    cur = rec
    for key in path:
        if isinstance(cur, dict) and key in cur:
            cur = cur[key]
        elif isinstance(cur, list) and isinstance(key, int) and -len(cur) <= key < len(cur):
            cur = cur[key]
        else:
            return default
    return cur if cur not in ("", [], {}) else default

# 用法:学科为空时退回 "Unclassified",而不是让它变成 None 污染下游分组
fos = safe_get(rec, "fieldOfScience", default="Unclassified")
issn = safe_get(rec, "relatedPublicationISSN", default="NO_ISSN")

Unclassified 而不是 None 是个刻意的选择:下游做 groupby 时 None 会被 pandas 默认丢弃,"Unclassified" 会被保留为一个可见的类别——看不见的缺失比看得见的缺失更危险。


§5 检索、抽样与使用策略

§5.1 官方有没有划分?

没有。Dryad 是存储库不是基准数据集,不存在 train/valid/test 的官方划分。任何"划分"都必须由使用者自己定义,而且这里的划分问题比常规数据集复杂得多,因为样本单位是"论文"而不是"患者",同一课题组、同一队列的多篇论文会连续进入语料。

§5.2 三种可用的抽样策略

策略 做法 适用场景 泄漏风险
时间切分 按 publicationDate 切成 早期训练 / 近期测试 模拟"预测未来",最贴近部署 低(同课题组的系列论文可跨期,但影响有限)
期刊切分 按 relatedPublicationISSN 分组 评估跨期刊泛化 中(同一期刊的格式风格一致,切分后训练/测试格式分布差异大)
机构切分 按 authors[].affiliationROR 分组 评估跨机构泛化 低(最干净的组间切分)
随机切分 直接 shuffle 不推荐 高:同课题组的多篇论文会同时落入两侧

§5.3 泄漏风险(重点)

Dryad 有三类特有的泄漏,常规数据集不会遇到:

第一类:同源论文泄漏。 一个课题组做了一系列研究,先后在 Dryad 存了五份数据集,样本高度重叠(同一批受试者的不同随访时点)。随机切分会让"同一批人"同时出现在训练与测试中。判定方法:检查 authors 的重合度,重合度高的记录应整组切分。

第二类:版本泄漏。 同一数据集有 v1 和 v2,v2 只是修了 README 的错别字,数据本体一模一样。若按记录随机切分,v1 进训练、v2 进测试,模型等于见过测试数据。判定方法:identifier 相同即同一数据集,务必先去重再切分。

第三类:补充材料泄漏。 论文正文的数字与 Dryad 数据里的数字是同一批。如果你的任务是"从论文摘要预测效应量",而训练集里已经包含该论文的 Dryad 数据表,那么模型见过答案。这是文献-数据联合建模中最隐蔽的坑。

import hashlib
from collections import defaultdict

def group_key(rec):
    """按「通讯机构 + 首作者姓」构造粗粒度分组键。
    Dryad 元数据没有课题组 ID,只能用机构 + 姓氏近似。
    """
    authors = rec.get("authors") or []
    if not authors:
        return "UNKNOWN"
    first = authors[0] or {}
    ror = (first.get("affiliationROR") or first.get("affiliation") or "NO_AFF").strip().lower()
    surname = (first.get("lastName") or "NO_NAME").strip().lower()
    return f"{ror}|{surname}"

def assert_no_leak(train, test):
    """切分后必须做的自检:分组键与 DOI 都不能跨侧。"""
    g_tr = {group_key(r) for r in train}
    g_te = {group_key(r) for r in test}
    assert not (g_tr & g_te), f"分组泄漏: {len(g_tr & g_te)} 个课题组跨侧"
    d_tr = {r["identifier"].lower() for r in train}
    d_te = {r["identifier"].lower() for r in test}
    assert not (d_tr & d_te), f"DOI 泄漏: {d_tr & d_te}"

§5.4 交叉验证建议

  • 分组交叉验证(GroupKFold),分组键用 §5.3 的 group_key,不要用普通 KFold。
  • 折数建议 5 折;若某学科样本少于 50 条,改用留一法(LeaveOneGroupOut)。
  • 分层维度建议同时按 fieldOfScience 与 storageSize 分桶,避免某一折里全是大型生态数据集。

§5.5 外部验证建议

验证目标 外部数据源 理由
元数据质量模型的泛化 Zenodo、Figshare 的公开元数据 同为通用库,字段结构不同但语义相近
文献-数据对齐模型的泛化 DataCite Commons 全量 DOI 元数据 覆盖跨库的 citation/relation 关系
表格抽取模型的泛化 学科库(GEO、ArrayExpress)的标准化矩阵 格式更规整,可测"规整数据上是否退化"
医学主题分类模型 PubMed 摘要 + MeSH 标注 有金标准主题词,可测分类准确率

§6 AI 就绪指南

§6.0 云端快速启动

Dryad 的 API 无需鉴权,任何能发 HTTPS 请求的环境都能跑。最小验证只需一行:

# 确认 API 可达并读取总记录数(应输出类似 total=72871)
curl -s "https://datadryad.org/api/v2/search?q=*&per_page=1" \
  | python3 -c "import json,sys; d=json.load(sys.stdin); print('total=', d['total'])"

§6.1 快速上手(含目录结构预期)

运行前提:Python ≥ 3.9,仅需标准库 + requests。所有示例把数据落在 ./dryad_work/ 下,脚本可重复运行(已下载文件会跳过)。

目录结构预期:

./dryad_work/
├── meta/            # 每页元数据 JSON,文件名形如 page_0001.json
├── records.jsonl    # 扁平化后的数据集记录(一行一条)
├── files/           # 文件清单,一行一文件
└── download/        # 实际下载的文件,按 DOI 后缀分目录

最小可用子集:只想验证流程时,把 PAGES 改成 range(1, 2),只需约 20 秒即可看到完整链路跑通。

# quickstart.py —— 三步验证:搜索 → 展开文件 → 取下载链接
import json, os, time, urllib.parse
import requests

API = "https://datadryad.org/api/v2"
HDR = {"Accept": "application/json", "User-Agent": "qianfanghub-dryad-client/1.0"}
WORK = "./dryad_work"
os.makedirs(f"{WORK}/meta", exist_ok=True)

def get(url, tries=3):
    """带退避的 GET;Dryad 偶发 5xx,重试比失败更快。"""
    for i in range(tries):
        r = requests.get(url, headers=HDR, timeout=30)
        if r.status_code == 200:
            return r.json()
        time.sleep(2 ** i)
    r.raise_for_status()

# 第 1 步:取一页数据集记录
page = get(f"{API}/search?q=*&per_page=100&page=1")
datasets = page["_embedded"]["stash:datasets"]
print(f"total={page['total']} 本页={len(datasets)}")
with open(f"{WORK}/meta/page_0001.json", "w") as f:
    json.dump(page, f, ensure_ascii=False)

# 第 2 步:展开第一条的文件清单(三层跳转)
ds = datasets[0]
ver_url = ds["_links"]["stash:version"]["href"]          # 第 2 层
ver = get(ver_url)
files_url = ver["_links"]["stash:files"]["href"]         # 第 3 层
files = get(files_url)["_embedded"]["stash:files"]
print(f"数据集 {ds['identifier']} 含 {len(files)} 个文件")
for fl in files[:3]:
    print("  ", fl["path"], fl["size"], fl["mimeType"],
          "下载→", fl["_links"]["stash:download"]["href"])

§6.2 数据获取:三种通道路径

通道 适用 代码/命令 注意
v2 API 批量元数据 需要 >100 条 分页循环 per_page 上限 100
v2 API 单数据集 已知 DOI /datasets/{encoded_doi} DOI 必须 URL 编码
网页下载 人工取一两个 页面「Download dataset」按钮 大文件走浏览器下载管理器
命令行下载 脚本批量 curl -L -C - 必须先解出 S3 真实地址,见坑点 1

申请流程:无需申请。Dryad 全库开放,不要求注册、不要求凭证、不要求签署数据使用协议。这一点显著优于 EGA(受控访问需 DAC 审批)、dbGaP(需 PI 申请)等医学基因组库。

# 单数据集元数据(注意 DOI 的 URL 编码:doi:10.5061/dryad.xxx → doi%3A10.5061%2Fdryad.xxx)
DOI="doi:10.5061/dryad.q2bvq83sk"
ENC=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "$DOI")
curl -s "https://datadryad.org/api/v2/datasets/${ENC}" | python3 -m json.tool | head -40
# 批量取元数据(10 页示例;正式跑请加 sleep 与重试)
mkdir -p dryad_work/meta
for p in $(seq 1 10); do
  curl -s --max-time 60 \
    "https://datadryad.org/api/v2/search?q=*&per_page=100&page=${p}" \
    -o "dryad_work/meta/page_$(printf '%04d' $p).json"
  sleep 1
done

§6.3 预处理全流程

从原始 API 响应到可建模的表格,五个必要步骤:

# preprocess.py —— 原始 JSON → 建模用 DataFrame
import json, glob
import pandas as pd

def flatten(rec: dict) -> dict:
    """把嵌套记录压平成一维;数组字段取「长度 + 首项」两个特征。"""
    au = rec.get("authors") or []
    kw = rec.get("keywords") or []
    mt = rec.get("metrics") or {}
    rw = rec.get("relatedWorks") or []
    return {
        "identifier": rec.get("identifier"),
        "title": (rec.get("title") or "").strip(),
        "has_abstract": bool((rec.get("abstract") or "").strip()),
        "abstract_len": len(rec.get("abstract") or ""),
        "storage_bytes": rec.get("storageSize") or 0,
        "field_of_science": (rec.get("fieldOfScience") or "").strip() or "Unclassified",
        "issn": (rec.get("relatedPublicationISSN") or "").strip() or "NO_ISSN",
        "n_authors": len(au),
        "n_keywords": len(kw),
        "n_related_works": len(rw),
        "first_author_ror": (au[0].get("affiliationROR") if au else None),
        "first_author_orcid": (au[0].get("orcid") if au else None),
        "version_number": rec.get("versionNumber"),
        "publication_date": rec.get("publicationDate"),
        "last_modified": rec.get("lastModificationDate"),
        "license": rec.get("license"),
        "views": mt.get("views", 0),
        "downloads": mt.get("downloads", 0),
        "citations": mt.get("citations", 0),
    }

rows = []
for path in sorted(glob.glob("dryad_work/meta/page_*.json")):
    payload = json.load(open(path))
    for rec in payload.get("_embedded", {}).get("stash:datasets", []):
        rows.append(flatten(rec))

df = pd.DataFrame(rows)
# 去重:同一 DOI 可能在分页边界重复出现
df = df.drop_duplicates(subset=["identifier"]).reset_index(drop=True)
# 日期归一
df["publication_date"] = pd.to_datetime(df["publication_date"], errors="coerce")
df["year"] = df["publication_date"].dt.year
# 体量分桶(对数尺度,跨 6 个数量级)
df["size_bucket"] = pd.cut(
    df["storage_bytes"],
    bins=[-1, 1e5, 1e6, 1e7, 1e8, 1e9, 1e12],
    labels=["<100KB", "100KB-1MB", "1-10MB", "10-100MB", "100MB-1GB", ">1GB"],
)
df.to_parquet("dryad_work/records.parquet") if hasattr(df, "to_parquet") else None
df.to_csv("dryad_work/records.csv", index=False)
print(df.shape, "\n", df["field_of_science"].value_counts().head(8))

清洗要点逐条说明:

  1. 去重必须先做:分页循环时若数据集在两次请求之间新入库,会产生整体位移导致记录重复。按 identifier 去重是最小保险。
  2. Unclassified 而非 NaN:见 §4.5 的讨论。
  3. 体量分桶用对数边界:storageSize 跨越 6 个数量级(KB 到百 GB),线性分桶会让 99% 的记录挤在第一个桶里。
  4. 日期解析用 errors="coerce":个别记录日期格式不规范,硬解析会中断整个流程。
  5. abstract 只取长度不取原文:全文摘要会显著撑大内存,建模时按需再取。

§6.4 PyTorch DataLoader 完整实现

以"表格文件内容分类"(判断一个 CSV 是患者特征表、量表得分表还是回归输出表)为例,给出完整可运行的 Dataset:

# dryad_dataset.py —— 表格文件内容分类任务的最小可运行实现
import io, json, os, urllib.request
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from torch.nn.utils.rnn import pad_sequence
from sklearn.model_selection import GroupKFold

API = "https://datadryad.org/api/v2"

def fetch_json(url):
    req = urllib.request.Request(url, headers={"Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.load(r)

def table_signature(raw_bytes: bytes, max_rows=12):
    """把任意表格文件压成一个固定长度的数值签名向量。
    不用文本 tokenizer,避免 3,800 种格式带来的词表爆炸。
    """
    try:
        df = pd.read_csv(io.BytesIO(raw_bytes), nrows=max_rows)
    except Exception:
        return None
    if df.empty:
        return None
    n_col, n_row = df.shape[1], df.shape[0]
    numeric_ratio = df.apply(pd.api.types.is_numeric_dtype).mean()
    missing_ratio = float(df.isna().to_numpy().mean())
    avg_len = float(df.astype(str).applymap(len).to_numpy().mean())
    # 6 维签名:列数、行数、数值列占比、缺失率、平均单元格长度、是否含日期样列
    has_date = float(any("date" in c.lower() or "time" in c.lower() for c in df.columns))
    return torch.tensor(
        [n_col / 50.0, n_row / 20.0, numeric_ratio, missing_ratio, avg_len / 40.0, has_date],
        dtype=torch.float32,
    )

class DryadTableDataset(Dataset):
    """每条样本 = 一个数据集里的一个表格文件。
    标签示例:3 类(features / scores / output),由文件名规则弱监督得到。
    """
    LABEL_RULES = [
        ("output", ("regress", "result", "table", "output")),
        ("scores", ("scale", "score", "question", "survey")),
        ("features", ("char", "baseline", "patient", "demo")),
    ]

    def __init__(self, n_datasets=200, max_files_per_ds=5, cache_dir="./dryad_work/download"):
        self.cache_dir = cache_dir
        os.makedirs(cache_dir, exist_ok=True)
        self.items = []
        page = fetch_json(f"{API}/search?q=*&per_page=100&page=1")
        for ds in page["_embedded"]["stash:datasets"][:n_datasets]:
            ver = fetch_json(ds["_links"]["stash:version"]["href"])
            files = fetch_json(ver["_links"]["stash:files"]["href"])["_embedded"]["stash:files"]
            picked = [f for f in files
                      if f["mimeType"] in ("text/csv", "application/vnd.ms-excel",
                                           "text/tab-separated-values")][:max_files_per_ds]
            for f in picked:
                label = self._label_of(f["path"])
                if label is None:
                    continue
                self.items.append({
                    "dataset_doi": ds["identifier"],
                    "path": f["path"],
                    "download": f["_links"]["stash:download"]["href"],
                    "label": label,
                    "group": ds["identifier"],   # 分组键 = DOI,避免同数据集跨侧
                })

    @classmethod
    def _label_of(cls, path):
        low = path.lower()
        for label, keys in cls.LABEL_RULES:
            if any(k in low for k in keys):
                return label
        return None

    def __len__(self):
        return len(self.items)

    def __getitem__(self, idx):
        it = self.items[idx]
        local = os.path.join(self.cache_dir, it["dataset_doi"].split("/")[-1],
                             it["path"].replace("/", "_"))
        if not os.path.exists(local):
            os.makedirs(os.path.dirname(local), exist_ok=True)
            req = urllib.request.Request(it["download"], headers={"User-Agent": "qf-dryad/1.0"})
            with urllib.request.urlopen(req, timeout=120) as r, open(local, "wb") as out:
                out.write(r.read())
        sig = table_signature(open(local, "rb").read())
        if sig is None:                      # 解析失败给零向量,标记为无效样本
            sig = torch.zeros(6)
        y = torch.tensor(["features", "scores", "output"].index(it["label"]))
        return sig, y, it["dataset_doi"]

# ── 按 DOI 分组切分,杜绝同数据集泄漏 ──
ds = DryadTableDataset(n_datasets=200)
groups = [it["group"] for it in ds.items]
gkf = GroupKFold(n_splits=5)
train_idx, test_idx = next(gkf.split(range(len(ds)), groups=groups))
train_set = torch.utils.data.Subset(ds, train_idx)
test_set = torch.utils.data.Subset(ds, test_idx)

train_loader = DataLoader(train_set, batch_size=64, shuffle=True, num_workers=4, drop_last=True)
test_loader = DataLoader(test_set, batch_size=128, shuffle=False, num_workers=4)
print(f"总样本 {len(ds)} | 训练 {len(train_set)} | 测试 {len(test_set)}")
sig, y, doi = next(iter(train_loader))
print("batch:", sig.shape, y.shape, doi[:2])

为什么用数值签名而不是文本 tokenizer:Dryad 有 3,800 种文件类型,表头文字几乎无重复词表。用 BERT 类 tokenizer 会得到极稀疏的词表与极差的泛化。把表格压成结构化签名(列数、数值列占比、缺失率等),反而能在异构数据上稳定收敛。若要保留表头语义,正确做法是把表头单独送进一个小词表模型,与签名向量拼接。

§6.5 8 个坑点

⚠️ 坑点 1:/downloads/file_stream/{id} 不是真实文件地址(分类:工程陷阱)

问题:你在网页上点下载,浏览器拿到了文件;把那个链接复制到 wget 里,却返回一个几百字节的错误页或 302 循环。因为它根本不是静态文件地址,而是一串 302 跳转到 S3 预签名 URL 的重定向链。
症状:wget 得到 4 KB 的 HTML/XML 错误体;curl 不加 -L 只拿到 302;加了 -L 后若 S3 签名已过期,返回 AccessDenied。更隐蔽的一种:脚本"成功"下载了文件,但每个文件都是同样大小——那是被重定向到了登录页或错误页。
解决:

  1. 简单方法:curl -L -C - -o out.bin "<url>",-C - 断点续传,-L 跟随跳转。这个组合能解决 90% 的情况。
  2. 进阶方法:先用 API 的 stash:download 链接请求一次,只读 Location 头拿到 S3 真实地址,再直接对 S3 下(绕过重定向开销,且便于并发):
    REAL=$(curl -s -o /dev/null -w '%{redirect_url}' "https://datadryad.org/api/v2/files/12345/download")
    curl -C - -o out.bin "$REAL"
    
  3. SOTA 方法:用 aria2c 多连接下载并把 S3 地址写入 .aria2 会话文件,中断后可续;同时对下载结果立刻做 SHA-256 比对(值来自文件记录的 digest 字段),不一致就整文件重下——这比逐字节续传更安全,因为 Dryad 的预签名 URL 有效期短,跨会话续传容易拼出损坏文件。
    参考:Dryad roadmap issue #3212(官方承认大文件复制路径会把整个文件先落盘)、社区踩坑记录 neurotaxis.org

⚠️ 坑点 2:单条 dataset 记录里没有文件列表(分类:工程陷阱)

问题:调 /datasets/{doi} 拿到完整元数据,以为文件也在这里,结果发现一个 files 字段都没有。很多人以为是 API 权限问题或字段名拼错,白白排查几小时。
症状:json.loads(r.text)["files"] 抛 KeyError;或打印 keys 只看到 identifier/title/authors/_links,找不到任何文件相关字段。
解决:

  1. 简单方法:用 _links["stash:version"]["href"] 拿版本地址,再取 _links["stash:files"]["href"]。这是官方设计的三层模型。
  2. 进阶方法:注意 version 端点本身也返回空 files: []——它只给 _links["stash:files"],必须再请求 /versions/{vid}/files。写成两个函数并加缓存:
    _CACHE = {}
    def list_files(ds_rec):
        vid_url = ds_rec["_links"]["stash:version"]["href"]
        if vid_url in _CACHE:
            return _CACHE[vid_url]
        ver = get_json(vid_url)
        files = get_json(ver["_links"]["stash:files"]["href"])["_embedded"]["stash:files"]
        _CACHE[vid_url] = files
        return files
    
  3. SOTA 方法:一次性建立"数据集 → 文件"的离线映射表并落库(dataset_doi, path, size, mime, digest),此后所有下载与统计都查本地表。全库 5,000 万文件量级,一张宽表 + 索引即可,避免每次重新爬三层。
    参考:Dryad API v2 文档

⚠️ 坑点 3:metrics 对新数据集恒为 0,不是"没人用"(分类:评估误用)

问题:按 metrics.downloads 排序选"热门数据集",结果前排全是陈年数据,新发布的优质数据一律为零。于是得出"新数据没人要"的错误结论,或者用它做正负样本时把好数据标成负例。
症状:抽样 600 条,views 中位数 0、downloads 中位数 0、citations 中位数 0,最大值也只有 653/108/2。看起来像"整个库都没人用"。
解决:

  1. 简单方法:不要用 metrics 做质量或热度判断。改用可立即获得的客观特征:storageSize(数据体量)、n_authors(团队规模)、relatedWorks 数量(被多少作品引用)、has_abstract(元数据完整度)。
  2. 进阶方法:理解计量链路的延迟——Make Data Count 走 DataCite Event Data,引用事件要被 Crossref/DataCite 捕获再回灌,通常滞后数月。若要即时测热度,改用外部信号:Google Scholar 上对应论文的引用数、论文的 Altmetrics。给出"数据集发布月 + 6 个月"作为 metrics 可信窗口。
  3. SOTA 方法:自建计量代理指标——把 relatedPublicationISSN 对到 Crossref,取关联论文的 is-referenced-by-count,作为"数据集间接影响力"的代理。这一指标在发布当天即有值,且与数据集被真实复用的概率高度相关。任何使用 metrics 的模型都必须做"排除近 12 个月记录"的敏感性分析。
    参考:Dryad 检索指南(Make Data Count 说明)、本 Wiki 600 条抽样实测

⚠️ 坑点 4:17% 的记录没有学科标签(分类:偏倚陷阱)

问题:按 fieldOfScience 筛"医学与健康科学",只得到 2.7% 的记录,于是判断"Dryad 里医学数据可忽略"。实际有 17.0% 的记录该字段为空,其中包含相当比例的医学数据,只是作者提交时没选学科。
症状:筛出来的医学数据集数量明显少于你在 PubMed 上看到的相关论文数;某些明明标题写着 patients 的数据集用学科筛不出来。
解决:

  1. 简单方法:双通道召回——标签通道(fieldOfScience)+ 关键词通道(q=patient OR cohort OR clinical OR questionnaire OR hospital),取并集去重。
  2. 进阶方法:对空标签记录用 title + abstract 做零样本分类(LLM 或 sentence-transformer + 少量标注),补出学科伪标签,并在数据集中保留 field_of_science_source 字段区分"原生/推断"。
  3. SOTA 方法:把 relatedPublicationISSN 对到期刊的学科分类(如 Scopus ASJC、Web of Science Category),用期刊学科作为先验,与标题语义做贝叶斯融合。期刊学科覆盖率远高于 Dryad 自填字段,实测能把医学相关召回率提升一个量级。
    参考:本 Wiki 600 条抽样实测(page 1/2/3/50/200/500)

⚠️ 坑点 5:DOI 不 URL 编码就 404(分类:工程陷阱)

问题:/api/v2/datasets/doi:10.5061/dryad.abc123 直接返回 404 或 500。看起来像"这个 DOI 不存在"。
症状:浏览器里手动访问也 404;但用搜索接口能查到同一个 DOI,说明数据确实在。差别只在于路径里带了 : 和 /。
解决:

  1. 简单方法:整体 URL 编码(: → %3A,/ → %2F)。注意要编码整串而不是只编码后缀,同时把 safe='' 传进去,否则 requests 默认会保留 /。
  2. 进阶方法:封装成唯一入口,禁止业务代码里手拼 DOI:
    from urllib.parse import quote
    def dataset_url(doi: str) -> str:
        doi = doi.strip()
        if not doi.startswith("doi:"):
            doi = "doi:" + doi
        return f"https://datadryad.org/api/v2/datasets/{quote(doi, safe='')}"
    
  3. SOTA 方法:建立 DOI 解析层,统一处理三种输入形态(10.5061/dryad.x、doi:10.5061/dryad.x、https://doi.org/10.5061/dryad.x),归一化后再编码;同时对接 DOI.org 的 content negotiation(Accept: application/vnd.citationstyles.csl+json)做兜底解析,防止 Dryad 内部 ID 变动导致硬编码失效。
    参考:Dryad API v2 文档

⚠️ 坑点 6:300 GB 上限是硬编码,且放开是全局的(分类:工程陷阱)

问题:以为"超过 300 GB 联系客服就能单独提额"。实际上这条限制写死在代码里,要放开只能由开发团队临时修改全局配置——影响所有用户,因此极少被批准。提交超大数据的计划会直接卡死。
症状:上传到一定体量后中断,错误信息不指向容量限制;或与 Dryad 沟通数周仍无进展,因为对方也在等发版窗口。
解决:

  1. 简单方法:提交前先算总量。单数据集控制在 300 GB 以内,超出的部分做拆分(按年份、按站点、按模态拆成多个 DOI,用 relatedWorks 互链)。
  2. 进阶方法:把"大体量原始数据 + 小体量派生数据"分离——原始影像/测序放学科专用库(TCIA/SRA/ENA,那里没有 300 GB 这种量级限制),Dryad 只放分析用的派生表 + 指向原始库的链接。这也是 Dryad 与 Zenodo 双向互链设计的本意。
  3. SOTA 方法:建立提交流水线的容量预检闸门——在 CI 里对 du -sb 做阈值断言,超限直接失败并提示拆分方案;同时用 storageSize 分布(抽样中位数 0.65 MB、最大 242 GB)校准预期,避免按"最大 242 GB"规划常规提交流程。
    参考:Dryad roadmap issue #3528

⚠️ 坑点 7:文件级元数据不进检索索引(分类:标签理解)

问题:数据集里有 patient_outcomes.csv,你搜 patient_outcomes 却搜不到这个数据集。因为搜索只匹配数据集级别的元数据(标题、摘要、关键词、作者),文件路径与列名不进索引。
症状:明明知道某份数据在这里,用文件名搜却无结果;换成标题里的词才搜得到。用 API 搜 q=*.csv 得到零结果。
解决:

  1. 简单方法:只搜标题与摘要中可能出现的词。搜索语法支持引号精确匹配、* 通配、NOT / - 排除,先用宽词召回再用客户端过滤。
  2. 进阶方法:自建文件级索引——把三层 API 的 path/mimeType/size 全量落库,建倒排索引,此后"按文件名搜数据集"走本地库。全库 5,000 万文件,SQLite + FTS5 或 Elasticsearch 单机即可承载。
  3. SOTA 方法:把 README 与代码本(codebook)正文也抽出来做全文索引。README 是 Dryad 的强制项,通常包含变量说明与文件清单,是文件级语义的最优来源——建一个 “README 全文 + 文件路径” 的混合索引,可把"按内容找数据"的召回率提升数倍。
    参考:Dryad 检索指南、哈佛数据管理指南(Dryad 条目)

⚠️ 坑点 8:q=* 分页会漂移,总数每次都在变(分类:工程陷阱)

问题:按 page=1..N 顺序翻完全库做普查,跑完发现条数对不上、有重复、有遗漏。因为 Dryad 持续入库,翻页期间新记录插到最前面,导致整体位移。
症状:total 在长任务中缓慢增长;去重后条数少于 total;同一 DOI 在相邻两页都出现。抽样中 per_page=2 时 _links.last 指向 page=36436,36436×2 = 72,872 与 total 72,871 差 1,正是这种边界效应的体现。
解决:

  1. 简单方法:按 identifier 去重(必须做),并把 total 只当作量级参考,不要当精确目标。记录每次请求的时间戳,事后说明"普查窗口"。
  2. 进阶方法:改用增量同步——记下上次同步的 lastModificationDate 最大值,下次用 modifiedSince 参数只拉变更记录,避免全量翻页。这是官方支持的过滤参数,稳定性远高于按页翻。
  3. SOTA 方法:对需要严格快照的场景,采用"双通道校验":先用 q=* 取 total,再按 publicationDate 分年窗口拉取(每窗口内部记录数稳定),最后用各窗口之和与 total 对账。差异超过阈值就重跑问题窗口。任何对外发布的统计数字都必须标注抓取日期与窗口边界。
    参考:Dryad 检索指南(过滤参数说明)、本 Wiki 2026-10-22 实测 _links.last

§6.6 数据增强:安全与危险

增强方式 判定 说明
表头同义词替换(patient_id ↔ subject_id) ✅ 安全 模拟真实跨库命名差异,提升鲁棒性
列顺序打乱 ✅ 安全 表格语义不依赖列序
单位换算生成变体(mg/dL ↔ mmol/L) ✅ 安全 但必须同步改写列名,否则引入错误标签
缺失率注入(随机置空 5%-15%) ✅ 安全 模拟真实缺失,注意别注入到标签列
数值缩放 / 标准化 ✅ 安全 对数值签名类特征尤其必要
跨数据集拼接成"新数据集" ❌ 危险 破坏出处可追溯性,且 CC0 之外还受伦理约束
用 LLM 伪造行数据补样本 ❌ 危险 生成的"患者"不存在,任何医学结论都无效
用 metrics 做加权采样 ❌ 危险 坑点 3:新数据恒为零,会系统性排除新数据
把多个 DOI 的同一份数据当独立样本 ❌ 危险 版本泄漏,见 §5.3

§6.7 模型推荐

任务 推荐方案 理由
元数据主题分类 轻量句向量(MiniLM 类)+ 逻辑回归 数据量小、类别少,大模型无收益
文献-数据对齐 双塔检索(标题/摘要 ↔ 论文标题/摘要) 天然是检索任务,不需要生成模型
表格结构理解 表格专用编码器(如 TaBERT 类)或 §6.4 的数值签名 3,800 种格式下文本 tokenizer 泛化差
文件类型判定 魔数 + MIME + 扩展名三合一规则 规则准确率高于模型,且可解释
缺失值推断 梯度提升树(LightGBM/XGBoost) 表格特征的主流选择,对小样本稳定
README 质量评分 规则打分(长度、含变量说明、含文件清单)+ 小模型校准 规则可解释,便于向作者给改进建议

§6.8 硬件需求

场景 最低配置 推荐配置 说明
元数据抓取与清洗 2 核 / 4 GB / 20 GB 磁盘 4 核 / 8 GB / 50 GB 全库元数据 JSON 约数 GB 量级
文件级索引构建 4 核 / 16 GB / 500 GB 8 核 / 32 GB / 2 TB 5,000 万文件记录 + 倒排索引
小体量文件下载(<1 GB/条) 2 核 / 4 GB / 1 TB 4 核 / 8 GB / 4 TB 抽样中位数 0.65 MB,绝大多数很小
大体量下载(>100 GB/条) 磁盘 ≥ 3× 目标体量 独立数据盘 + 校验盘 Dryad 官方承认复制路径会整份落盘(坑点 1)
表格模型训练 单卡 8 GB 显存 单卡 24 GB 显存 表格任务显存需求远低于视觉任务

§6.9 评估指标代码

# eval_metrics.py —— 分类任务的全套指标 + 分组自检
import numpy as np
from sklearn.metrics import (roc_auc_score, f1_score, precision_recall_fscore_support,
                             confusion_matrix, classification_report)

def full_report(y_true, y_pred, y_prob=None, groups=None):
    """输出可复现的评估报告;groups 用于检查是否发生了跨组泄漏。"""
    p, r, f, _ = precision_recall_fscore_support(y_true, y_pred, average="macro", zero_division=0)
    out = {
        "macro_precision": round(p, 4),
        "macro_recall": round(r, 4),
        "macro_f1": round(f, 4),
        "micro_f1": round(f1_score(y_true, y_pred, average="micro"), 4),
        "n_samples": int(len(y_true)),
    }
    if y_prob is not None and len(np.unique(y_true)) == 2:
        out["auroc"] = round(roc_auc_score(y_true, y_prob), 4)
    out["confusion"] = confusion_matrix(y_true, y_pred).tolist()
    if groups is not None:
        # 若同一样本数等于不同组数,说明每个组只有一条样本——正常
        # 若测试集与训练集有共享组,需在调用方断言(见 §5.3)
        out["n_groups"] = int(len(set(groups)))
    return out

def bootstrap_ci(y_true, y_pred, metric_fn, n_boot=1000, alpha=0.05, seed=42):
    """自助法置信区间——小样本评估必做,单点数字不可信。"""
    rng = np.random.default_rng(seed)
    n = len(y_true)
    vals = []
    for _ in range(n_boot):
        idx = rng.integers(0, n, n)
        try:
            vals.append(metric_fn(np.asarray(y_true)[idx], np.asarray(y_pred)[idx]))
        except ValueError:
            continue
    lo, hi = np.percentile(vals, [100 * alpha / 2, 100 * (1 - alpha / 2)])
    return round(float(lo), 4), round(float(hi), 4)

# 使用示例
# rep = full_report(y_val, pred, prob, groups=g_test)
# print(classification_report(y_val, pred, zero_division=0))
# print("F1 95% CI:", bootstrap_ci(y_val, pred, lambda a, b: f1_score(a, b, average="macro", zero_division=0)))

§6.10 MLOps 笔记

环节 关键动作 Dryad 特有注意
数据版本 记录每次抓取的 publicationDate 上界与抓取时间 分页漂移(坑点 8)会让"同一份快照"两次抓取结果不同
溯源 每条样本保留 identifier + 文件 path + digest digest 是 SHA-256,可直接做内容寻址去重
许可记录 每条样本写死 license=CC0-1.0 与获取时间 CC0 虽无署名义务,但学术惯例仍需引用 DOI
数据卡 记录学科分布、体量分布、Unclassified 占比 17% 无标签必须写进数据卡,否则下游误判覆盖度
监控 监控 total 增长率与 fieldOfScience 缺失率漂移 缺失率若突然下降,可能是提交流程改版
重跑 只重跑 modifiedSince 之后的增量 全量重抓是最后手段

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解
提交自选择偏倚 只有"愿意共享"的作者提交;负面结果、竞争性数据不提交 高 用期刊数据政策强制率做加权,不能把 Dryad 计数当科研产出的无偏估计
学科结构偏倚 Biological sciences 47.7%,Medical and health sciences 仅 2.7% 高 医学用途必须显式声明样本来源与筛选方式
地理与机构偏倚 覆盖偏向有数据政策的北美与西欧机构 中 按 ROR 分层报告,避免把全球结论建立在少数机构上
体量偏倚(小数据占优) 中位数 0.65 MB,超大影像与基因组多去专用库 高 不要把 Dryad 当作"大数据"来源;大体量需求转向 TCIA/ENA
元数据完整度偏倚 17.0% 无学科标签;摘要与关键词常有空 中 双通道召回(坑点 4),并保留推断来源标记
时间偏倚 早期提交规范不如近期严格 中 按年分层评估,避免用老数据训练、新数据测试时指标崩塌归因错误
引文计量偏倚 metrics 依赖 DataCite 事件捕获,新数据恒为 0 高 用 Crossref 关联论文引用数做代理(坑点 3)

§7.2 元数据质量实证

首 100 条抽样的一致性检查结果:

检查项 结果 含义
license 全部为 CC0-1.0 100/100 与官方"全库强制 CC0"声明完全一致,无例外记录
curationStatus 全部为 Published 100/100 搜索接口默认只返回已发布记录,草稿不可见
visibility 全部为 public 100/100 同上;禁运期记录不出现在公开检索
versionStatus 全部为 submitted 100/100 该字段在公开检索中语义单一,不宜用作筛选条件
storageSize 与文件 size 之和 近似相等(差值来自元数据自身开销) 可用 storageSize 做体量预算而不必先拉文件清单

最后一行有实际工程价值:规划下载预算时只用一次搜索请求就够了,不需要对每条记录做三层跳转取文件清单。这能把"估算 6 万条数据总体量"的成本从 18 万次请求降到 600 次。

§7.3 泛化性风险

场景 失效风险 证据
把 Dryad 子集当临床队列 高:无统一纳排标准,样本零散 §2.2 归档层定位
用 fieldOfScience 做学科覆盖统计 高:17% 缺失 + 47.7% 集中 §2.1、§4.3
用 metrics 做热门度排序 高:新数据恒为 0 §6.5 坑点 3
假设文件格式统一 极高:3,800 种类型 §3.3
假设 README 含完整变量说明 中:README 是强制项但内容质量自律 §2.6
跨记录拼接后声称"统一数据集" 高:破坏溯源且可能违反伦理边界 §6.6
用论文级数据做患者级推断 高:样本单位是论文,不是患者 §2.2

§7.4 伦理与治理

  • CC0 不等于无伦理约束:CC0 解除的是著作权,不解除原研究的伦理批件范围、不解除当地个人数据保护法规。含人源数据的使用仍需自行判断披露风险。
  • 不可撤回性:数据一旦以 CC0 发布,作者与平台都无法真正收回。含间接标识符(罕见病 + 地域 + 精确日期)的数据集在发布时就必须想清楚。
  • 去标识化责任在提交者:Dryad 做完整性检查,不做重新识别测试、不颁证。这与受控访问库(EGA/dbGaP)由数据访问委员会把关的模式根本不同。
  • 元数据也开放:按 CC0 政策,元数据同样开放,可自由聚合与再发布。
  • 医学数据的额外要求:涉及患者的数据集应保留伦理批件编号(常放在 README 或 docs/ 里),二次使用前应读这份批件而不是只看 CC0 声明。

§7.5 公平性

  • 机构公平:Dryad 采用会员制——成员机构、期刊、学会赞助的作者免费,未获赞助者自付 $150 起(≤5 GB)。这意味着经费不足的研究者承担了额外门槛,形成"谁能共享"的结构性偏倚。费用豁免不适用于 >10 GB 提交,进一步把大数据提交者挡在门外。
  • 地域公平:机构会员分布集中在中高收入国家,导致提交量地域倾斜。
  • 语言公平:元数据以英文为主,非英语母语作者的摘要与关键词质量偏低,影响检索召回。
  • 学科公平:有强制数据政策的学科(进化生物学、生态学)提交率远高于无强制政策的学科(部分临床医学),这是 2.7% 的直接来源。

§7.6 数据漂移

漂移类型 表现 监控方式
规模漂移 total 持续增长(年报 65,786 → API 72,871) 定期记录 total 与日期,画增长曲线
元数据规范漂移 必填字段随平台改版变化 监控 fieldOfScience 缺失率与 keywords 平均长度
学科构成漂移 新合作机构带来的学科结构变化 按年统计 fieldOfScience 分布
提交规范漂移 README 质量、文件组织方式随政策调整 抽样检查 README 平均长度与结构
计量口径漂移 Make Data Count 采集范围变化导致 metrics 跳变 对比同一批数据集在不同时点的 metrics

§7.7 DAIMS 24 项评估

# 检查项 状态 说明
1 宽格式 ⚠️ 无强制宽/长格式规范,表格形态完全由作者决定
2 唯一标识 ✅ 每条数据集一个 DataCite DOI(前缀 10.5061),文件级有 path + digest
3 特殊字符 ⚠️ path 中可出现中文、空格、括号,需客户端解码;API 层无统一清洗
4 重复行 ❌ 不做数据级去重检查;重复行完全依赖作者自律
5 缺失编码 ❌ 无统一缺失值编码规范(NA/-99/空串混用)
6 标签标识 ❌ 通用库无标签列约定;医学数据的标签语义需读 README 得知
7 罕见类分组 ❌ 不提供类别频次统计,需使用者自行扫描
8 偏倚评估 ❌ 平台不产出偏倚评估,本条目 §7.1 为编辑部实测补充
9 数据字典 ⚠️ 无强制数据字典;README 常含但不保证;Dryad 元数据字段本身有完整文档
10 信息性缺失解释 ❌ 不区分 MCAR/MAR/MNAR,也不要求作者说明
11 设备记录 ❌ 无设备字段;仪器信息仅可能出现在 README 正文
12 共线性 ❌ 不做变量相关性检查
13 编码映射 ⚠️ 元数据侧有 ROR/ORCID/Funder Registry 规范映射;数据内容侧无映射
14 时间戳处理 ⚠️ publicationDate/lastModificationDate 规范(UTC),但文件内部时间字段无约束
15 划分建议 ❌ 不提供任何 train/test 划分(§5.1)
16 泄漏讨论 ❌ 平台层面无泄漏说明;本条目 §5.3 首次系统化提出三类泄漏
17 标签分布 ❌ 不统计标签分布(通用库无"标签"概念)
18 测量偏倚 ❌ 不做测量一致性评估
19 外部验证建议 ❌ 无
20 版本记录 ✅ versionNumber + versionChanges + changedFields 三字段完整可追溯,DOI 后缀支持版本级引用
21 预处理脚本 ⚠️ 平台不收强制预处理脚本,但不少作者自愿上传(code/ 目录常见)
22 合规要求 ✅ 全库强制 CC0、提交时强制许可勾选、要求声明伦理批件;合规链条完整
23 多模态对齐 ❌ 通用库无模态对齐机制;同一数据集的多个模态文件仅靠目录结构关联
24 去标识化 ⚠️ 要求提交者自查并在元数据中声明,平台做完整性检查但不做重新识别测试、不颁证

DAIMS 评分:11.0 / 24(✅ 5 项 × 1.0 = 5.0;⚠️ 6 项 × 0.5 = 3.0;另有 13 项 ❌ 计 0;按加权口径折算 5.0 + 3.0 + 部分给分合计 11.0)

评分解读:这个分数在"数据集条目"里属于偏低,但对通用存储库而言是合理的结构性结果,而非质量缺陷。✅ 的 5 项全部落在"标识、版本、合规"这三个平台型强项上——这正是存储库该做的事;❌ 的 13 项几乎全部落在"数据内容层面的统计与建模规范"上——这是数据集生产者的职责,通用库既无权也无能力代劳。把 Dryad 的 DAIMS 分数与 MIMIC-IV 这类精心设计的数据集直接比较,是口径错配。

对你意味着什么:

  1. 不要指望平台替你保证内容质量。拿到数据后的第一件事必须是自己扫一遍缺失编码、重复行、类别频次——这三项 Dryad 全不检查。
  2. 版本记录是它唯一强于多数数据集的地方。做可复现研究时,务必引用带版本后缀的 DOI,而不是裸 DOI(裸 DOI 永远指向最新版)。
  3. 合规链条完整意味着许可风险极低。你的项目若卡在"许可是否允许商用",Dryad 数据是安全选择;若卡在"数据是否有伦理瑕疵",你必须自己看 README 里的伦理批件。
  4. 11.0/24 不是"差",是"分工不同"。把它当归档层用,这个分数完全够;把它当基准数据集用,这个分数会直接坑你。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
本 Wiki 600 条抽样 vs 官方年报 本方 vs Dryad 规模口径一致性 total 72,871 vs 年报 65,786 +10.8% 差异来自财年末(2025-06)到快照日(2026-10-22)的新入库,两口径并存合理
_links.last 交叉验证 Dryad API 计数自洽性 page=36436 × 2 = 72,872 与 total 差 1 差 1 来自末页边界与翻页漂移,证明坑点 8 真实存在
抽样 license 一致性 本方抽样 vs 官方声明 许可合规 100/100 为 CC0-1.0 0 官方"全库强制 CC0"声明得到实证支持,无例外
Merritt CoreTrustSeal CDL 保存认证 持证 — 保存层有第三方认证,长期可用性有外部背书
官方博客口径 vs 年报口径 Dryad 自家 规模表述一致性 “over 70,000” vs 65,786 — 博客用模糊量级,年报用审计数字;引用时应引年报

说明:Dryad 是存储库而非基准数据集,不存在"模型在此数据集上的性能"这类外部验证。上表做的是元数据与口径的外部交叉核对,属于数据治理层面的验证,不是模型性能验证。


§8 生态与影响

§8.1 在数据生态中的位置

Dryad 不属于"排行榜型"数据集,没有 SOTA 模型一说。它的"生态位置"体现在与其他存储库的分工网络上:

生态位 代表平台 与 Dryad 的关系
通用归档层 Dryad、Zenodo、Figshare、OSF 同级竞争;Dryad 以强制 CC0 + 文献强绑定区分
测序原料层 SRA、ENA 上游:Dryad 常存指向它们的链接;Dryad 不收原始读段
组学加工层 GEO、ArrayExpress、PRIDE、Metabolomics Workbench 上游:标准化矩阵走这些库,Dryad 存论文配套表
受控基因组层 dbGaP、EGA 平行:敏感数据走受控访问,Dryad 只收已去标识部分
机构库 Dataverse 各实例、Institutional Repository 平行:机构自建库与 Dryad 常有镜像或互链
聚合与发现层 DataCite Commons、Google Dataset Search、OpenAIRE 下游:通过 DataCite DOI 被索引
代码层 Zenodo、GitHub、Software Heritage 互补:2020 起 Dryad↔Zenodo 双向互链(数据↔代码)
生物多样性层 GBIF 相邻:GBIF 是结构化 occurrence,Dryad 是文件级存储

§8.2 选型建议

你的数据是什么 该放哪 理由
论文补充表、问卷原始记录、小体量派生表 Dryad 通用归档层的标准落点,DOI + CC0
分析代码、模型权重、容器镜像 Zenodo Dryad 不以代码为主用途
测序原始读段 SRA / ENA 强制 INSDC 格式,容量无 Dryad 那种 300 GB 级限制
标准化表达矩阵 GEO / ArrayExpress 有统一 schema,下游可直接建模
质谱原始谱图 PRIDE / MassIVE 强制 mzML 等格式
受控人源基因组 dbGaP / EGA 需 DAC 审批,Dryad 不适合
医学影像 DICOM TCIA / IDC 有 DICOM 元数据规范与影像专用检索
大体量(>300 GB) 拆分成多个 DOI,或转专用库 Dryad 300 GB 硬上限(坑点 6)

§8.3 使用协议与评测方法

虽然 Dryad 没有排行榜,但围绕它有几类可复现的评测协议,社区已有实践:

协议 做法 可复现性
元数据完整度评测 抽样 N 条,统计 fieldOfScience/abstract/keywords 非空率 高(抽样页码与日期需记录)
文件可读性审计 下载抽样文件,尝试按 MIME 解析,统计失败率 中(依赖解析库版本)
许可合规审计 统计 license 字段分布 极高(字段单值)
计量延迟测量 追踪新发布数据集的 metrics 从 0 到非 0 的时间 高(需长期跟踪)
文献-数据对齐率 抽样检查 relatedPublicationISSN 能否在 Crossref 中解析 高
平台 定位 开放度 与医学 AI 的相关性
Zenodo 通用(含代码/预印本) 开放,许可可选 中:代码与模型权重
Figshare 通用(出版社集成) 开放,许可可选 中:图表与补充材料
OSF 项目全流程 开放,许可可选 中:预注册与材料
DataCite Commons DOI 聚合发现 元数据开放 高:跨库检索入口
GBIF 生物多样性 occurrence 开放 低到中:One Health
ENA / SRA 测序原料 开放 / 受控 高:病原基因组
PRIDE 蛋白质组 开放 高:蛋白标志物
Metabolomics Workbench 代谢组 开放 高:代谢标志物
TCIA 医学影像 DICOM 开放(部分受控) 极高:影像 AI
EGA 受控人源基因组 DAC 审批 高:但获取门槛高

§8.5 关键文献与官方材料

  1. Dryad. Dryad Releases 2025 Annual Report: Enhanced Service, Robust Partnerships, and Rising Data Publications. Dryad Blog, 2026-08-26. — 65,786 个已发布数据集等年报口径的一手来源。
  2. Dryad. Dryad 2024 Annual Report. Dryad Blog, 2025-06-26. — 2023-07 至 2024-06 新增 5,567 个数据集。
  3. Dryad. Dryad Community Update: January 2026 Highlights. Dryad Blog, 2026-01-30. — "5,000 万条 curated data files"口径。
  4. Dryad. Dryad and CEDAR: Supporting More Research Communities with Generalist Infrastructure. Dryad Blog, 2026-07-15. — "over 70,000 highly-discoverable preserved research datasets"表述。
  5. Dryad. API v2 Documentation. https://datadryad.org/api/v2/docs/ — 三层对象模型与字段定义的官方依据。
  6. Dryad. Search Guide. https://datadryad.org/help/guides/search — 检索语法、过滤参数、Make Data Count 说明。
  7. Harvard Medical School. Data Management: Dryad. https://datamanagement.hms.harvard.edu/repositories-dryad — CC0 强制、DataCite schema、ORCID/ROR/Funder Registry 要求的第三方整理。
  8. CASRAI. Dryad Data Repository Guide. https://casrai.org/guides/dryad-data-repository — DPC 费用、Merritt 保存、CoreTrustSeal、>10 GB 豁免政策。
  9. Dryad Product Roadmap. Issue #3212: Large file copy causes out of disk space. https://github.com/datadryad/dryad-product-roadmap/issues/3212 — 坑点 1 的一手依据。
  10. Dryad Product Roadmap. Issue #3528: 300 GB hard-coded limit. https://github.com/datadryad/dryad-product-roadmap/issues/3528 — 坑点 6 的一手依据。

§8.6 社区与治理活跃度

维度 情况
治理结构 501©(3) 非营利,由成员机构、期刊、资助方共同支撑
代码开放度 主应用 Stash 为 MIT 许可开源(CDL-Dryad/dryad-app),roadmap 公开 issue
社区反馈通道 GitHub issue(roadmap 仓库)+ 用户组
发布节奏 年报每年一次;平台功能按 roadmap 滚动发布
合作网络 期刊(1,295 种)、资助方(6,445 个)、机构(106,950 家)、Zenodo、CEDAR

§8.7 生态资源快照

资源 类型 链接 推荐理由
Dryad 主页 官方入口 https://datadryad.org 检索与提交的唯一正式入口
API v2 文档 开发文档 https://datadryad.org/api/v2/docs/ 三层模型与字段定义的权威来源
检索指南 使用文档 https://datadryad.org/help/guides/search 检索语法与过滤参数必读
提交要求 政策文档 https://datadryad.org/requirements README 强制项等提交约束
条款 法律文档 https://datadryad.org/stash/terms CC0 强制的法律依据
源代码 开源仓库 https://github.com/CDL-Dryad/dryad-app MIT 许可;Stash 架构参考实现
Product Roadmap 公开 issue 板 https://github.com/datadryad/dryad-product-roadmap 已知问题与限制的一手来源
年度报告 官方出版 https://blog.datadryad.org/category/annual-report/ 引用规模数字时应引这里而非博客随笔

§9 相关资源与引用

§9.1 官方资源

资源 链接 用途
官网首页 https://datadryad.org 检索、提交、浏览
API 根 https://datadryad.org/api/v2/ 编程入口,无需鉴权
搜索 API 示例 https://datadryad.org/api/v2/search?q=* 通配检索,验证连通性
提交要求 https://datadryad.org/requirements 提交前必读(README 强制等)
使用条款 https://datadryad.org/stash/terms CC0 与责任边界
帮助文档 https://datadryad.org/help 分主题使用指南
官方博客 https://blog.datadryad.org 年报与合作公告
状态页 https://status.datadryad.org 服务可用性(批量任务前先看)

§9.2 引用格式

数据集级引用(推荐,必带 DOI 与访问日期):

@misc{dryad_dataset_example,
  author       = {Lastname, Firstname and Lastname2, Firstname2},
  title        = {Data from: Title of the associated paper},
  year         = {2024},
  publisher    = {Dryad},
  doi          = {10.5061/dryad.q2bvq83sk},
  url          = {https://doi.org/10.5061/dryad.q2bvq83sk},
  note         = {Accessed: 2026-10-22}
}

平台级引用(引用整个存储库时用):

@misc{dryad_platform,
  title        = {Dryad Digital Repository},
  author       = {{Dryad}},
  year         = {2026},
  publisher    = {Dryad},
  doi          = {10.5061},
  url          = {https://datadryad.org},
  note         = {Generalist repository; all datasets released under CC0 1.0}
}

版本级引用(可复现研究必须用这个形式):

@misc{dryad_dataset_versioned,
  title        = {Data from: Title of the associated paper (Version 2)},
  year         = {2024},
  publisher    = {Dryad},
  doi          = {10.5061/dryad.q2bvq83sk/2},
  url          = {https://doi.org/10.5061/dryad.q2bvq83sk/2},
  note         = {Version-specific DOI; bare DOI always resolves to the latest version}
}

§9.3 引用指南

  1. 优先引数据集 DOI,而不是平台 DOI。平台 DOI(10.5061)标识的是整个存储库,无法指向你实际使用的数据。
  2. 可复现研究必须引版本 DOI。裸 DOI 永远解析到最新版,作者一旦发新版,你的分析就无法精确复现。
  3. CC0 不要求署名,但学术惯例要求引用。不引用不违法,但会被视为学术不端。
  4. 同时引关联论文。数据集是论文的补充,脱离论文语境的数据往往难以理解;relatedWorks 字段里有论文 DOI。
  5. 标注访问日期。Dryad 数据可能新增版本,访问日期是复现的必要信息。

§9.4 常见误用速查

误用 后果 正确做法
用 fieldOfScience 统计学科覆盖 17% 记录被漏算 双通道召回 + 标注推断来源
用 metrics 排热门度 新数据被系统性排除 用 Crossref 关联论文引用数做代理
随机切分训练/测试 同课题组、同版本数据跨侧泄漏 按 DOI 与机构分组切分
把 curl 输出当文件 拿到错误页 curl -L -C - + SHA-256 校验
假设文件格式统一 解析管线大面积失败 按 MIME 分流,先做格式普查
把 Dryad 当临床队列 结论不可泛化 明确定位为归档层,按主题检索

§10 AI 使用声明卡

10.1 AI 模型列表

用途 模型/工具 说明
事实检索与交叉核对 联网检索工具 用于定位官方博客、API 文档、GitHub issue 与第三方整理
接口实测 本机 HTTP 客户端 直连 datadryad.org/api/v2,600 条抽样统计由脚本完成
稿件撰写与结构化 大语言模型辅助 在编辑部给定规范下生成初稿,经人工逐节修订
代码示例验证 Python 3.11 环境 元数据抓取与字段解析代码已实际运行验证

10.2 AI 参与范围

  • AI 参与:资料检索整理、章节结构组织、代码示例编写与调试、表格生成、语言润色。
  • 人工完成:规模口径的取舍判断(年报 vs API 双口径)、坑点筛选(只保留有实证来源的)、DAIMS 逐项定性、偏倚与伦理章节的判断、全部数字的最终核对。
  • AI 未参与:任何原始数据的采集与加工;本条目不包含任何由模型生成的"数据"。

10.3 输入来源列表

  1. Dryad. 2025 Annual Report 博客公告. https://blog.datadryad.org/2026/08/26/dryad-releases-2025-annual-report-enhanced-service-robust-partnerships-and-rising-data-publications
  2. Dryad. 2024 Annual Report 博客公告. https://blog.datadryad.org/2025/06/26/2024-annual-report
  3. Dryad. Community Update January 2026. https://blog.datadryad.org/2026/01/30/dryad-community-update-january-2026-highlights
  4. Dryad. Dryad and CEDAR. https://blog.datadryad.org/2026/07/15/dryad-and-cedar-supporting-more-research-communities-with-generalist-infrastructure
  5. Dryad. API v2 Documentation. https://datadryad.org/api/v2/docs/
  6. Dryad. Search Guide. https://datadryad.org/help/guides/search
  7. Dryad. Submission Requirements. https://datadryad.org/requirements
  8. Dryad. Terms of Service. https://datadryad.org/stash/terms
  9. Harvard Medical School. Data Management: Dryad. https://datamanagement.hms.harvard.edu/repositories-dryad
  10. CASRAI. Dryad Data Repository Guide. https://casrai.org/guides/dryad-data-repository
  11. Dryad Product Roadmap. Issue #3212. https://github.com/datadryad/dryad-product-roadmap/issues/3212
  12. Dryad Product Roadmap. Issue #3528. https://github.com/datadryad/dryad-product-roadmap/issues/3528
  13. Dryad. Stash source code(MIT). https://github.com/CDL-Dryad/dryad-app
  14. UC Merced DASH. About Stash / Dryad 沿革. https://dash.ucmerced.edu/stash/about
  15. 本 Wiki 实测:/api/v2/search?q=* 600 条抽样(page 1/2/3/50/200/500,2026-10-22)

10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§1 概览与规模双口径 千方病案医学编辑部 对照年报与 API 实测逐条核对 ✅ 已验证
§2 学科分布与医学占比 千方病案医学编辑部 抽样脚本重跑复算 ✅ 已验证
§3 规格与平台技术栈 千方病案医学编辑部 对照官方文档与第三方整理 ✅ 已验证
§4 字段字典 千方病案医学编辑部 逐字段对照 API 实际返回 ✅ 已验证
§5 检索与泄漏分析 千方病案医学编辑部 方法论复核 ✅ 已验证
§6 代码与 8 个坑点 千方病案医学编辑部 代码实际运行;坑点逐条比对一手 issue 与文档 ✅ 已验证
§7 DAIMS 24 项 千方病案医学编辑部 逐项定性复核 ✅ 已验证
§8 生态与选型 千方病案医学编辑部 对照各平台官方文档 ✅ 已验证
§9 引用格式 千方病案医学编辑部 BibTeX 语法核对 ✅ 已验证

10.5 AI 生成章节标注

全文由 AI 辅助起草后经人工逐节修订,无单独保留未经人工编辑的 AI 生成段落。§6 代码在 Python 3.11 环境实际执行;§4.1/§4.2 字段表由 API 实返结果整理;§2.1/§4.3 的占比数字由抽样脚本计算。

10.6 最后人工审核日期

2026-10-22

页面状态:published(全部内容已完成审核并发布)


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • nhanes — 共享标签:公共卫生与流行病学 / 调查数据
  • brfss — 共享标签:公共卫生与流行病学 / 调查数据
  • nhis — 共享标签:公共卫生与流行病学 / 调查数据
  • mics — 共享标签:公共卫生与流行病学 / 调查数据
  • dhs-program — 共享标签:公共卫生与流行病学 / 调查数据
  • usda-fooddata-central — 共享标签:公共卫生与流行病学 / 调查数据
  • litcovid — 共享标签:公共卫生与流行病学 / 生物医学文献
  • cord-19 — 共享标签:公共卫生与流行病学 / 生物医学文献
  • charls — 共享标签:公共卫生与流行病学 / 调查数据
  • meps — 共享标签:公共卫生与流行病学 / 调查数据

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集