系统生物学模型库 — BioModels 存的方程式,附 curation 状态

EMBL-EBI 定量系统生物学模型库 / SBML + SED-ML + MIRIAM / 一半已发表模型当年不可直接复现

来源 https://www.ebi.ac.uk/biomodels/发布时间: 2026-10-26最后更新: 2026-10-26 阅读 6
系统生物学模型库 — BioModels 存的方程式,附 curation 状态

信息速览

数据集名称系统生物学模型库 — BioModels 存的方程式,附 curation 状态
数据类型人工标注,本体映射,文献引用,元数据
规模不适用(模型库,计量单位是模型条目而不是人)
接入方式https://www.ebi.ac.uk/biomodels/
AI 就绪度

BioModels 存的东西和绝大多数生物数据库不一样。GEO 存「测到了什么」,PDB 存「结构长什么样」,BioModels 存的是「这些东西之间按什么方程变」。一篇论文正文里那组常微分方程、二十几个速率常数、几个初始浓度、一张随时间上升的曲线图,被抽成一个 SBML 文件放在库里,附上一个 accession。

这件事听起来比存数据简单,实际更难。数据的正确性由测序仪和实验记录保证,模型的正确性只能由「能不能复现出论文那张图」来保证;而参数经常散落在正文、补充材料、甚至图注里,一旦漏抄一个初值,整条曲线就面目全非。2021 年 EMBL-EBI 团队自己做的 455 个模型复盘显示,约一半已发表模型在策展时无法直接复现,原因包括方程结构不一致、参数值缺失、初始浓度缺失。

所以真正决定你能不能用某个模型的,不是它入库没有,而是它那一行 curation 状态写了什么。一屏速览见下表。

维度 内容
全称 BioModels(原名 BioModels Database)
建设方 EMBL-EBI(英国 Hinxton,与 SBML 团队长期协作)
起步年份 2005 年
核心对象 文献中的数学模型,不是观测数据
主格式 SBML(Systems Biology Markup Language),另有 CellML、PharmML、MATLAB、Mathematica、R、Python、C++
文献模型规模 2020 年综述口径约两千条(「约 2000 models from the published literature」)
其中经人工策展 2020 年综述口径约八百条(「about 800 curated models」)
2025 年验证覆盖面 千余条 curated 动力学模型被更新,或新生成 SED-ML
仿真说明格式 SED-ML(Simulation Experiment Description Markup Language)
打包格式 COMBINE 档案(.omex,内含 SBML + SED-ML + 元数据)
注释规范 MIRIAM,交叉引用 GO / ChEBI / SBO / UniProt / NCBI Taxonomy / Reactome
参数检索服务 BioModels Parameters(约 8.4 万条反应、60 个分类单元口径,2020 年)
许可 条目以 CC0 1.0 为默认
访问状态 2026-10-26 两次请求均返回 403,服务本体正常,CloudFront 拒绝脚本客户端
归档通道 https://ftp.ebi.ac.uk/pub/databases/biomodels/(公开目录,可访问)

§1 它要解决的具体麻烦

1.1 模型的可重现性取决于参数是否齐全

先看一个具体的失败方式。某篇 2015 年的论文研究 NF-κB 通路的振荡行为,正文写了六个 ODE,附录给了一张「模型参数表」,但那张表只列了速率常数,没列初始浓度——初始浓度藏在正文第三段的一句话里:「我们假设 IκBα 的初始浓度为 0.1 μM,其余物种置于稳态」。这句话是自然语言,机器读不出来。一个策展人要把这个模型编进 SBML,必须先读懂这句话,再判断「其余物种置于稳态」到底是解稳态方程还是直接置零。

如果他不做这个判断,直接按表填,模型能跑,曲线形状也对,但振荡周期会差 30%。这种错误在文件层面完全看不出来:XML 合法,SBML 校验通过,仿真器不报错,只是结果不对。

这就是 BioModels 这类库独有的麻烦。测序数据的质量问题可以被 QC 指标抓住(Q30 比例、比对率、重复率),模型的问题没有任何自动指标能抓——唯一的检验是「跑一遍,看曲线对不对」。而这个检验只有在原论文那张图存在、并且策展人愿意逐点比对时才成立。

1.2 三条常见的错误期待

期待一:库里存的是「数据」。 不是。库里的最小单位是一条模型记录,里面有方程结构、参数、初始条件、单位定义。没有样本、没有患者、没有测量序列。如果你想找「某疾病患者的表达谱」,这里没有;如果你想找「这个疾病通路的动力学方程」,这里才有。

期待二:入库等于审核通过。 不等。BioModels 的条目分两类:经人工 curation 的和未经 curation 的。后者往往是作者直接提交的 SBML,或者由大规模模型生成管道灌进来的,格式合法但没有人验证过数值。这两类在检索结果里并排出现,外观几乎一样。

期待三:curation 完成等于万无一失。 也不等。curation 的定义是「按论文编码并复现至少一张仿真图」。它保证与论文一致,不保证论文正确,也不保证你换一个积分器还能得到同样结果——后者要 SED-ML 和跨引擎验证来兜底。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
一篇论文的动力学方程的可解析副本 有,SBML XML 够
方程里每个参数的数值与单位 有,但前提是策展时抄全了 多数够
复现论文某张图的仿真设置 有 SED-ML 才行,不是每篇都有 部分够
跨仿真引擎的一致结果 2025 年后的 curated 条目做过验证 新的够,旧的不够
一条通路在多种细胞类型下的参数分布 弱,模型是逐篇的,不是汇总的 不够
模型之间的定量比较 单位体系不统一时需要自己对齐 麻烦
参数先验做贝叶斯拟合 BioModels Parameters 可检索 够
原始的湿实验数据 不给,只给模型 需另找
模型的版本历史 库内保留,界面展示有限 部分够
「这个模型靠不靠谱」的单一分数 没有,只有一个状态字段 不够

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
复现一篇 2010 年代的信号通路论文,正文公式看着对但画不出原图 给你该文的 SBML,省掉手工抄方程 找同一 accession 的 SED-ML;没有就按论文图注自己补仿真条件
要给新药做 QSP 模型,缺某个通路的速率常数 从库里同类模型取参数当先验 用 BioModels Parameters 按实体检索,再逐条查来源文献的实验条件
训练模型要「方程 → 曲线」的成对样本 提供 SBML,自己解方程生成曲线 用 libRoadRunner 批量仿真,把 initialAssignment 与事件都当特征
教学演示「同一模型换积分器会不会变」 提供跨引擎验证过的 SED-ML 样本 用 COMBINE 档案在多个引擎上跑同一份实验
想知道某个生物过程是否已有定量模型 检索通路名、物种名、文献题目 先按 curation 状态筛,再看 species 数量是否匹配你的粒度
想把多个模型拼成多尺度模型 提供标准格式与稳定 accession 先解决单位与命名空间冲突,再谈拼接
要交付一份可审阅的模型清单 提供 MIRIAM 注释与参考文献链 导出时保留完整 provenance 字段

1.5 一句话判断

你要找的是「机制」,不是「测量」。模型库里每一条都回答「这些量之间怎么变」,不回答「这些量是多少」;而它能不能直接跑起来,取决于你手上这条记录是 curated 还是只是被收了进来。

1.6 不适合谁:四条边界

把「有模型」当成「模型可信」的人,不适合直接用。 库里有大量 Non-curated 条目,它们只是被收了进来,没有人复现过。按关键词检索、取第一条结果、直接跑,是这套资源上最常见的踩法。

要「批量拿来做监督学习标签」的人,不适合把它当成品数据集。 它的计量单位是模型而不是样本,一个模型对应一条曲线簇,不是一行特征。做机器学习必须自己写解析层,把 SBML 转成图或方程残差。

研究非 ODE 形式的人,要看清楚 SBML 表达不了什么。 布尔网络、基于规则的模型、agent-based 模型、随机模拟里的部分语义,SBML 只能近似表达或根本表达不了。库里也有这类模型的转换版,但转换本身会丢信息。

需要稳定对外引用某条模型的人,不适合把 accession 当版本号。 accession 指向的是一个「条目」,条目内容会随重新策展而更新。要用在论文或产品里,得同时记下你下载文件的日期与文件摘要。

§2 数据构成与规格

2.1 一条记录由什么组成

把一条 BioModels 记录拆开,能看见五个层次,每一层都有独立的标识体系。

第一层是条目本身。每条记录有一个 accession,形如 BIOMD 后接十位数字,或 MODEL 后接十位数字。前者对应文献模型,后者覆盖更广的来源。

第二层是文件。一条记录下可以挂多份 SBML(同一模型的不同编码版本)、多份 SED-ML(对应论文的不同图)、一份或多份 COMBINE 档案。

第三层是模型内容。SBML 内部有 compartment(区室)、species(物种)、parameter(参数)、reaction(反应)、kineticLaw(速率式)、initialAssignment(初值指派)、event(事件)、rule(代数规则)这些元素。

第四层是注释。MIRIAM 规定每个元素可以挂若干条 RDF 描述,把物种连到 ChEBI、UniProt、NCBI Taxonomy,把反应连到 GO 或 Reactome,把参数连到 SBO 的语义类型。

第五层是元数据。提交者、提交日期、策展日期、策展人、参考文献 DOI/PubMed ID、许可声明、curation 状态。

2.2 字段与记录的完整字典

字段/元素 所在层 取值形态 说明
accession 条目 字符串,BIOMD/MODEL + 十位数字 稳定主键,不随内容更新变化
name 条目 自由文本 模型标题,通常摘自论文
submissionDate 条目 日期 作者或策展人首次提交时间
lastModificationDate 条目 日期 最近一次策展修订时间
curationStatus 条目 Manually curated / Non-curated 全文最关键的单一字段
submitter 条目 人名或机构 区分作者提交与策展人编码
publication 条目 DOI、PubMed ID、期刊、年份 模型的文献出处
sbmlLevel / sbmlVersion 文件 整数对,如 3 / 2 兼容性第一道门槛
packages 文件 字符串列表,如 fbc、distrib、comp 扩展包决定能不能被通用解析器读
numSpecies 模型 整数 与曲线条数、可读性直接相关
numReactions 模型 整数 与参数数量、求解难度直接相关
numParameters 模型 整数 与策展工作量直接相关
compartment 模型 若干带体积与单位的区室 单位错位最常见的来源
species.initialConcentration 模型 数值 + 单位 最常缺失的一类字段
parameter.value 模型 数值 + 单位 次常缺失的一类字段
reaction.kineticLaw 模型 MathML 或纯公式字符串 方程本体
event.trigger 模型 布尔表达式 分段实验条件,常被忽略
initialAssignment 模型 赋值表达式 初值依赖关系,常在复现时被漏掉
miriam.annotation 注释 RDF 三元组 语义互操作的唯一载体
sedml.uid 文件 短字符串 同一模型下区分不同仿真实验
sedml.listOfSimulations 文件 模型引用 + 积分算法 + 起止时间 决定「跑出来是什么」
combineArchive 文件 .omex 压缩包 一包里带齐 SBML、SED-ML 与清单
verifiedEngines 文件 引擎名列表 2025 年验证工作的产物

2.3 一条记录的完整解剖

抛开界面,一条记录落盘之后的形态大致如此。下面是一份结构示意(非完整文件,保留所有关键层级),字段名与 SBML Level 3 Version 2 的核心规范一致。

<sbml xmlns="http://www.sbml.org/sbml/level3/version2/core" level="3" version="2">
  <model id="BIOMD0000000123" name="示例:某信号通路的振荡模型">
    <notes>
      <body>
        <p>Manually curated. 复现自原文图 3B。</p>
      </body>
    </notes>
    <annotation>
      <rdf:RDF>
        <rdf:Description rdf:about="#BIOMD0000000123">
          <bqbiol:is>
            <rdf:Bag>
              <rdf:li rdf:resource="https://identifiers.org/go/GO:0007165"/>
            </rdf:Bag>
          </bqbiol:is>
        </rdf:Description>
      </rdf:RDF>
    </annotation>
    <listOfCompartments>
      <compartment id="cell" spatialDimensions="3" size="1" units="litre"/>
    </listOfCompartments>
    <listOfSpecies>
      <species id="A" compartment="cell" initialConcentration="0.1" substanceUnits="mole"/>
      <species id="B" compartment="cell" initialConcentration="0" substanceUnits="mole"/>
    </listOfSpecies>
    <listOfParameters>
      <parameter id="k1" value="0.05" units="per_second"/>
      <parameter id="k2" value="0.3" units="per_second"/>
    </listOfParameters>
    <listOfInitialAssignments>
      <initialAssignment symbol="B">
        <math xmlns="http://www.w3.org/1998/Math/MathML">
          <apply><divide/><ci>k1</ci><ci>k2</ci></apply>
        </math>
      </initialAssignment>
    </listOfInitialAssignments>
    <listOfReactions>
      <reaction id="R1" reversible="false">
        <listOfReactants>
          <speciesReference species="A" stoichiometry="1"/>
        </listOfReactants>
        <listOfProducts>
          <speciesReference species="B" stoichiometry="1"/>
        </listOfProducts>
        <kineticLaw>
          <math xmlns="http://www.w3.org/1998/Math/MathML">
            <apply><times/><ci>k1</ci><ci>A</ci></apply>
          </math>
        </kineticLaw>
      </reaction>
    </listOfReactions>
  </model>
</sbml>

同一条记录的另一半是 SED-ML,它不描述模型,只描述「怎么跑」。这是最容易被忽略的一层,因为它不改变模型内容,只改变你看到的曲线。

<sedML xmlns="http://sed-ml.org/sed-ml/level1/version5" level="1" version="5">
  <listOfSimulations>
    <uniformTimeCourse id="sim1" initialTime="0" outputStartTime="0"
                       outputEndTime="1000" numberOfPoints="1000">
      <algorithm kisaoID="KISAO:0000019"/>
    </uniformTimeCourse>
  </listOfSimulations>
  <listOfModels>
    <model id="m1" language="urn:sedml:language:sbml" source="model.sbml"/>
  </listOfModels>
  <listOfTasks>
    <task id="task1" modelReference="m1" simulationReference="sim1"/>
  </listOfTasks>
  <listOfDataGenerators>
    <dataGenerator id="dA">
      <listOfVariables>
        <variable id="vA" symbol="A" target="/sbml:model/sbml:listOfSpecies/sbml:species[@id='A']"/>
      </listOfVariables>
      <math xmlns="http://www.w3.org/1998/Math/MathML"><ci>vA</ci></math>
    </dataGenerator>
  </listOfDataGenerators>
</sedML>

把这两段放在一起看,问题的形状就清楚了:SBML 说清楚「A 以 k1 的速率变成 B」,SED-ML 才说清楚「从 0 积分到 1000 秒,用 CVODE,取 1000 个点」。缺后半段,你就得自己猜,而猜错的代价是曲线对不上。

2.4 规模与构成的几个口径

BioModels 的规模数字在不同来源里有不同口径,这不是官方出错,而是「模型」「条目」「curated」「可仿真」是四个不同的计数对象。

口径 数值 来源 含义
文献模型总数 约两千条 2020 年《核酸研究》15 周年综述 源自已发表文献的模型条目
其中 manuallly curated 约八百条 同上 人工编码并复现过论文仿真
2025 年验证所覆盖的 curated 动力学模型 1,055 条 2025 年 PLoS Computational Biology 更新或新生成 SED-ML 的条目数
2025 年既有 SED-ML 中被测试修正的文件 超过 450 份 同上 原本已有 SED-ML 的那部分
含 SED-ML 的条目占比 约一半 同上(「about half of the entries」) 其余靠本次工作补建基础文件
参数检索服务覆盖反应数 约 8.4 万条 2020 年 Bioinformatics BioModels Parameters 的索引规模
参数检索服务覆盖分类单元 60 个 同上 跨物种参数检索的广度

这里有一个容易看漏的关键点:2025 年的千余条比 2020 年的「约 800 条」多,两者不是同一年的快照,也不是同一个定义。前者是「本次验证工作处理的 curated 动力学模型数量」,里面包含在此之前陆续新增的策展条目。谁也没有公开一个「截至今日 curated 条目总数」的权威数,本页不给这个数。

2.5 与同类资源的字段差异

维度 BioModels Reactome CellML 模型库 SBML Test Suite
存什么 文献模型本体 通路知识(反应网络) 生理系统模型 一致性测试用例
核心格式 SBML + SED-ML BioPAX / SBGN / SBML 导出 CellML SBML
是否含动力学参数 有,且是主体 大多数反应不给速率常数 有 有,且刻意构造
是否含仿真说明 SED-ML,约一半条目 通常不带 部分带 刻意设计
curation 状态字段 有,条目级 有,反应级证据链 弱 不适用
多物种支持 强,SBML 原生 有人类与投影物种 弱 强
主要用途 复现、参数先验、QSP 组件 通路富集与网络推理 电生理与生物力学 验证解析器实现

这张表要说明的一件事:「有模型」和「有可运行的模型」是两回事。Reactome 有海量反应,但绝大部分不带速率常数;BioModels 的模型带常数,但只有一半带仿真说明。两份资源都不能单独完成「复现一张动力学曲线」这件事,前者缺数值,后者缺实验描述。

§3 身份:它在生物信息学版图里站的位置

3.1 它补的是「测量」与「机制」之间的缺口

生物数据库大致可以按「存什么」分成三类。第一类存观测,GEO、ArrayExpress、PRIDE 都是,内容是测量值加实验条件。第二类存知识,UniProt、Reactome、Gene Ontology 都是,内容是被策展过的断言。第三类存机制,BioModels 属于这一类,内容是可以求数值解的一组方程。

这三类的差别在「能不能算出新数」上。观测数据只能被重新统计,知识图谱只能被查询与推理,只有机制模型可以被仿真:给一组新参数,它能算出原论文从没测过的曲线。这是它存在的核心理由,也是它必须存在一个独立仓库的理由——没有任何一个观测数据库适合放方程。

3.2 与 SBML 社区的关系:标准先行,仓库随后

BioModels 与 SBML 的关系不是「使用了某个标准」,而是「与标准一起成长」。SBML 的语言规范由独立的编辑委员会维护,BioModels 长期是这个生态里最重要的落地仓库和压力测试来源:库里的每一条模型都在检验 SBML 能不能表达真实的生物学方程。

这种关系有一个副作用:库里同时存在不同 SBML 层级的文件。Level 2 Version 4 的旧模型与 Level 3 Version 2 的新模型可以共存于同一个检索结果里,而读 Level 3 扩展包(如 fbc、distrib、comp)的解析器不一定读得懂 Level 2 的写法。2024 年之后新入库的代谢网络模型多用 Level 3 Version 2 加 FBC2 包,这是器官尺度代谢重建的通行写法。

3.3 三条身份线:文献模型、自动生成模型、参数索引

把 BioModels 当成一个整体看,会看不清它。它其实是三条并行的线。

第一条是文献模型线:从论文里来,经人工策展,数量以千计,是库里最可信也最常被引用的部分。第二条是自动生成模型线:由大规模重建管道灌入,数量远大于文献模型,格式合法但无人逐条复现;2020 年的综述明确提到平台已开始接受大规模自动生成模型提交。第三条是参数索引线:把已有模型里的参数抽出来做成可检索的库,服务那些「只想找个速率常数」的人。

对使用者来说,三条线的操作方式完全不同。要复现论文,走第一条;要做全基因组尺度代谢分析,走第二条但要接受它没被逐条验证;要填参数,走第三条。混着用是误用的主要来源。

3.4 谁在维护,维护到什么程度

维护方是 EMBL-EBI。策展工作由一支专职策展团队承担,2021 年那篇复盘论文里有一句很能说明工作性质的话:如果一位全职策展人都复现不出来的模型,只偶尔用一次文献模型的科研人员大概率也复现不出来。这句话的分量在于,它把「复现失败」从个人能力问题变成了资源属性问题。

§4 质量:curation 状态到底说明了什么

4.1 两个状态值,五种实际情形

库里公开的状态字段只有两个取值:Manually curated 与 Non-curated。但实际情形至少有五种,字段把它们压成了两种。

实际情况 表面上可能的状态 真实含义
策展人按论文编码,复现了论文图 Manually curated 与论文一致,且能跑
作者自己提交 SBML,策展人核对过 Manually curated 与论文一致,但复现责任在作者
作者直接提交,无人核对 Non-curated 格式合法,数值未验证
大规模管道自动生成 Non-curated 结构来自重建工具,非文献手工编码
旧条目,论文后来有勘误 仍为 Manually curated 与「当时的论文」一致,与「现在的论文」未必一致

第五行是最隐蔽的。策展完成时点是一个时间戳,论文勘误发生在之后,库里的模型不会自动跟着改。你看到的 curated 状态描述的是历史事实,不是当下事实。

4.2 复现失败的三类原因

2021 年的复盘把不可复现的原因归了四类,其中三类是内容问题:方程结构与论文不一致、参数值缺失、初始浓度缺失,第四类是原因不明。前三类都能在 SBML 文件层面留下痕迹,但都不是解析器能自动判定的。

这解释了为什么「BioModels 里的模型下下来就能跑」这个说法错得离谱。模型确实能跑——只要给够初始条件,任何 SBML 文件都能被求解器读进去;跑出来的曲线像不像论文那张图,是另一回事。运行成功与复现成功之间隔着一次逐图比对。

4.3 2025 年的 SED-ML 回填:一半的文件带着小错

2025 年那篇验证工作的叙述值得完整读一遍。它说 BioModels 建立得比 SED-ML 早,两套体系各自演化,所以库里只有约一半条目含 SED-ML 文件,而这些文件反映的是当时的 SED-ML 版本。更要紧的是后半句:几乎所有这类 SED-ML 文件都至少有一处小错误,导致它们无法运行。

「小错误」这个词很关键。不是模型错了,是仿真说明写错了:引用了不存在的模型文件、算法标识写错、输出变量路径写错、时间单位对不上。这些错误在文件层面看不出,在运行时立刻暴露。团队最终修正、改进并补建了覆盖千余条 curated 模型的 SED-ML,并在五个基于 ODE 的仿真引擎上做了交叉验证。

4.4 案例:一条 NF-κB 振荡模型的四次遭遇

为了把上面这些抽象的风险落成具体形状,下面这个案例按真实工作流的结构来组织,模型名为代称,不对应任何特定 accession。

第一次遭遇:作者提交。 作者在投稿时把 SBML 随论文一起提交。文件完整,species、parameter、reaction 齐全,curation 状态为 Non-curated。此时它只是「被收了进来」。

第二次遭遇:策展人复现。 策展人按论文正文手工核对参数,发现附录表格里的两个降解速率与正文第三段文字描述不一致。按 BioModels 的惯例,以论文的主体叙述为准,并在 notes 里记录这处分歧。复现成功,状态改为 Manually curated。这一步是整条模型的第一次真实检验。

第三次遭遇:SED-ML 缺失。 这条记录处于「约一半没有 SED-ML」的那一侧。下游使用者下载后,用默认的积分器从 0 跑到 100,看到曲线单调上升,与论文图 2 的振荡完全不符,于是判定「模型是错的」。实际上模型没错,是积分区间选错了——论文那张图的横轴是 0 到 30000 秒。

第四次遭遇:SED-ML 补建。 2025 年的工作为它补了一份基础 SED-ML,把仿真时长、输出点数、算法标识固定下来,并在五个引擎上跑通。从此同一个 accession 在任何引擎上都能得到同一簇曲线。

这四次遭遇对应四件不同的事:入库、验证数值、验证实验描述、验证引擎无关性。§4.4 的案例之所以值得反复回看,是因为大多数误用都发生在这四步之间——把第一步当成第四步。

4.5 五个维度的评分

这里的评分按 DAIMS(Data and Information Management System)框架的常见维度给,分数是相对同类资源的判断题,不是官方评分。

维度 评分 依据 主要缺口
完整性 中高 文献模型要素齐全,SBML 内自带方程与参数 初始条件与参数在策展前常缺失,部分条目仍留空
准确性 中 curated 条目经过逐图复现 状态字段把「作者自交」与「策展人编码」压成一档
一致性 中高 统一用 SBML + MIRIAM,格式层面高度一致 跨条目的单位体系与命名空间不统一
时效性 中 持续新增与回溯策展 论文勘误不自动回流;SED-ML 长期落后于规范版本
可用性 中 格式标准、有开源解析器 网页 API 对脚本客户端 403;无统一批量下载入口

§5 取数:怎么把模型拿到手

5.1 先搞清楚你要的是哪一层

§4.4 的案例里那次「SED-ML 缺失」的遭遇,本质上就是取数层级选错了:只要了方程,没要实验说明。取数之前必须先决定要哪一层,否则会下错东西。四层由浅入深:条目元数据(这是什么模型)、SBML(模型本体)、SED-ML(怎么跑)、COMBINE 档案(前两者打包加清单)。只要元数据,用检索页;只要方程,拿 SBML;要复现图,必须拿 SED-ML 或 OMEX。

5.2 检索页与反爬的实际情况

2026 年 10 月 26 日,用 curl 直接请求 https://www.ebi.ac.uk/biomodels/ 与跟随跳转后的 https://biomodels.org/,两次都返回 403。返回体是 CloudFront 的标准拒绝页,写着 request blocked。同一时刻,https://ftp.ebi.ac.uk/pub/databases/biomodels/ 的目录列表正常返回 200。

这个组合说明服务本身在运行,拒绝来自边缘层的机器人策略,而非站点下线。浏览器访问通常正常,脚本访问会被拦。计划程序化取数时,要把这一点当成既定事实,而不是当成本次请求的偶发失败。

5.3 FTP 归档目录:能拿到什么

FTP 目录是脚本取数最稳的通道,但它的结构需要先理解。目录下有一批按用途命名的子目录,还有一份按日期命名的 releases/。

目录 最后更新(目录时间戳) 内容 用法
releases/ 2023-11-21 按日期命名的历史快照 追溯某一时点的库状态
releases/latest/ 2023-09-13 链接 指向 r31 快照(三种打包) 一次性拿快照
rdf/ 2020-11-12 全库 RDF 导出(约 28 MB 压缩包) 语义查询、图数据库导入
auto_generated/ 2019-10-30 自动生成模型的归档 大规模重建模型
logical/ 2017-01-13 逻辑模型相关归档 布尔网络类模型
metabolic/ 2017-01-16 代谢模型归档 代谢网络重建
m2/ 2025-03-08 另一条序列化通道 特定工具链兼容
bpsearch/ 2022-05-16 检索用索引产物 建立本地检索
weekly_archives/ 2017-01-02 早期周更归档 历史研究

releases/latest/ 指到的 r31 快照有三个打包:全文件包约 3.1 GB、RDF 包约 292 MB、纯 SBML 包约 184 MB。这个快照的时间是 2017 年 6 月,比目录里 releases/ 的最新子目录要旧——也就是说,latest 这个链接名描述的是「最新的一次完整发布」,不是「今天的库状态」。

5.4 用 Python 直接读 SBML

拿到文件之后,读取靠 libSBML(Python 绑定为 python-libsbml)或 libRoadRunner。后者在 libSBML 之上做了仿真封装,适合批量解方程。

#-- 建环境。libroadrunner 与 python-libsbml 走同一个底层 C 库
python3.11 -m venv .venv
source .venv/bin/activate
pip install python-libsbml libroadrunner==2.11.0
import libsbml

#-- 读一份 SBML,先看它属于哪个层级、用了哪些包
doc = libsbml.readSBML("BIOMD0000000123.xml")
if doc.getNumErrors() > 0:
    print("解析问题数:", doc.getNumErrors())
model = doc.getModel()
print("level/version:", model.getLevel(), model.getVersion())
print("sbml 包:", [p for p in model.getNamespaces().getNamespaces().keys()])

#-- 统计要素数量:这三个数决定模型好不好用
print("compartment:", model.getNumCompartments())
print("species:", model.getNumSpecies())
print("reaction:", model.getNumReactions())

#-- 检查是否有初值指派:有 initialAssignment 时,某些初值是算出来的
print("initialAssignment:", model.getNumInitialAssignments())
print("event:", model.getNumEvents())

5.5 参数与初值的完整性自查

这是最该写进流程的一步。判断一条模型能不能用,先看数值齐不齐。

import libsbml

doc = libsbml.readSBML("BIOMD0000000123.xml")
model = doc.getModel()
problems = []

#-- 参数:value 为 NaN 说明声明了但没给数值
for i in range(model.getNumParameters()):
    p = model.getParameters().get(i)
    if p.isSetValue():
        continue
    problems.append(f"参数 {p.getId()} 无数值")

#-- 物种:初值可能来自 concentration 或 amount,也可能由 initialAssignment 给出
assigned = {a.getSymbol() for a in model.getInitialAssignments()}
for i in range(model.getNumSpecies()):
    s = model.getSpecies().get(i)
    if s.getId() in assigned:
        continue
    if not s.isSetInitialConcentration() and not s.isSetInitialAmount():
        problems.append(f"物种 {s.getId()} 无初值")

print("缺失项数:", len(problems))
for item in problems[:20]:
    print(" -", item)

这段的输出如果非空,基本可以判定:这条模型无法在不做假设的前提下复现论文。接下来的选择只有两个——回到论文里找那几行文字,或者放弃这条换一条。

5.6 仿真与跨引擎对照

要复现论文曲线,直接用 libRoadRunner 加载并积分。下面这段是最小可用流程。

import roadrunner

#-- 载入模型。第二参数 True 表示加载时做一致性检查
rr = roadrunner.RoadRunner("BIOMD0000000123.xml")
print("物种数:", rr.getNumberOfFloatingSpecies())
print("反应数:", rr.getNumberOfReactions())

#-- 设定积分区间:这里的数值必须来自 SED-ML 或论文图注,不能凭默认值
rr.integrator.setValue("relative_tolerance", 1e-8)
data = rr.simulate(0, 1000, 1000)

#-- 第一列是时间,其余列按物种顺序排列
names = ["time"] + rr.getFloatingSpeciesIds()
print(names[:6])
print(data[:3])

换引擎对照时,把同一份 SBML 与同一份 SED-ML 交给另一个引擎,比较同一时间点的同一变量。差异超过数值容差,要么是积分配置不同,要么是模型本身有奇异点。

#-- 命令行引擎:COPASI 的 CLI 可直接跑 SED-ML 任务(需本地安装)
which CopasiSE || echo "未安装 CopasiSE,改用 Python 侧对照"

#-- Tellurium 内含 libRoadRunner 与 libantimony,可作为第二参照
python3.11 -m pip install tellurium
python3.11 -c "import tellurium as te; r = te.loadSBMLModel('BIOMD0000000123.xml'); print(r.simulate(0, 100, 11))"

5.7 BioModels Parameters:只要参数时的捷径

如果目标只是「某蛋白的降解速率大概是多少」,不必下载整个模型。BioModels Parameters 这个服务把库内模型的速率方程、参数值、初始浓度抽出来做成了按实体检索的索引,2020 年的论文称覆盖约 8.4 万条反应、60 个分类单元,提供网页与 API 两种入口。它解决的是「寻找参数值极其耗时」这个建模瓶颈。

5.8 批量的现实:别指望一次拉完

批量的正确姿势是从 FTP 快照开始,而不是逐条打网页。逐条请求会撞上 403;即便不撞,也没有稳定的速率约定。用 r31 的纯 SBML 包(约 184 MB)作为起点,再用日期目录做增量比对,是可行路径。

#-- 快照包在 releases/latest 下,文件名带 r31 与文件类型
curl -sL -o sbml_r31.tar.bz2 \
  https://ftp.ebi.ac.uk/pub/databases/biomodels/releases/latest/BioModels_Database-r31_pub-sbml_files.tar.bz2
ls -lh sbml_r31.tar.bz2

#-- 解包后按 accession 前缀分桶,避免单目录塞进上万文件
mkdir -p sbml && tar -xjf sbml_r31.tar.bz2 -C sbml
find sbml -name '*.xml' | head -5

§6 与库内条目的关系

6.1 关系图谱

BioModels 在库内的邻居分四类,每类的接口方式不同。

邻居 关系 接口方式 搭配场景
Reactome 通路骨架 ↔ 动力学参数 Reactome 给反应网络,BioModels 给带速率常数的模型 把通路图变成能仿真的模型
Gene Ontology / ChEBI / SBO 术语来源 MIRIAM 注释里的 RDF 交叉引用 语义检索、跨库联结
UniProt / NCBI Taxonomy 实体来源 物种与蛋白的 identifiers.org 链接 跨物种比对、实体归一
BioModels Parameters 派生索引 同一批模型的参数视图 参数先验、模型补齐
COMBINE / OMEX 生态 打包标准 .omex 归档 一步交付可复现包
SED-ML 规范组织 实验描述标准 SED-ML 文件 跨引擎复现

6.2 检索路径

四条入口,适用场景不同。

入口 地址 适用 限制
网页检索 https://www.ebi.ac.uk/biomodels/ 人工浏览、按通路或物种找模型 脚本访问 403
参数检索 https://www.ebi.ac.uk/biomodels/parameterSearch 只找速率常数或初值 论文口径下的服务,入口可达性未逐一核验
FTP 归档 https://ftp.ebi.ac.uk/pub/databases/biomodels/ 批量取数、快照比对 需要自己解包与建索引
RDF 导出 同上 rdf/ 目录 语义查询、图库导入 导出的时间戳停在 2020 年

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

在给任何分数之前,先把一个常见的误判拆掉:把 BioModels 当成一个「数据集」来评价完整性,方向就错了。数据集的完整性问的是「样本有没有缺列」,模型的完整性问的是「方程有没有缺项」。前者可以用空值率量化,后者不能——一个只有三个物种但方程完全正确的模型,比一个有两百个物种但缺了两个初值的模型更「完整」。

第二个前置校正关于状态字段的读法。curation 状态是一个条目级字段,它描述的是策展动作发生过没有,不是质量分级。把 Non-curated 当成「差」,会错过大量只是没人碰过的可用模型;把 Manually curated 当成「好」,会在论文勘误、版本漂移这些情形里踩空。

第三个校正关于时间。本页引用的两个核心规模数分别来自 2020 年与 2025 年的论文,中间相隔五年,期间库一直在变。任何「现在的精确总数」都需要现场查询,而现场查询在当前网络条件下拿不到。所以本页只给口径,不给今日快照。

7.1 五维评分

维度 评分 一句话理由
数据质量 B+ curated 部分经过逐图复现,是同类资源里最扎实的
覆盖广度 B 文献模型数千条,但相比通路知识库的规模仍是抽样
格式规范度 A- SBML + MIRIAM + SED-ML 三件套是全行业的模板
获取便利度 C 网页与 API 对脚本 403,FTP 快照停在旧版本
时效性 B- 持续策展,但勘误不回流、SED-ML 版本落后

7.2 三个最该知道的结构性局限

局限一:SBML 只能表达它能表达的东西。 SBML 擅长的是确定性 ODE、事件驱动的分段实验、代数规则。它不擅长布尔网络、agent-based、纯随机过程(虽有 distrib 包做近似)、空间分辨的组织级模型。凡是这类模型,库里的版本都是某种近似或转换,转换本身会丢信息。

局限二:模型的正确性检验只有一道关。 这道关是「跑一遍看曲线」。它需要原论文的图存在、需要策展人有判断力、需要一个能跑的仿真环境。三者缺一,检验就退化。这也正是 §4.4 的案例里那条模型要走到第四次遭遇才算真正可用的原因——第一道关过了,第二道关(引擎无关)还没过,而第二道关直到 2025 年才被系统性地补上。

局限三:没有跨模型的定量可比性保证。 两个都研究 TNF 信号通路的模型,单位可能是 nM 与 molecules/cell,时间尺度可能差三个数量级,物种命名可能一个用基因名一个用蛋白名。把它们拼在一起或直接比较曲线,必须先做单位与命名空间对齐,而库里没有任何机制强制这件事。

7.3 已知的、可枚举的偏差

偏差 表现 后果 缓解
策展选择性偏差 455 个复盘样本并非随机抽取,而是按策展优先级选取 复现率不宜外推到全库 引用时说明样本由来
期刊与领域偏差 样本来自 152 种期刊,覆盖生命科学多领域但不均 热门通路模型多,冷门过程少 先查覆盖率再定方案
作者自交偏差 66 个作者直接提交 SBML 的模型中 29 个无法直接复现 「作者提交」不等于「已验证」 优先取 curated 且带 SED-ML 的
版本漂移 条目内容随重新策展更新,accession 不变 复现结果不可跨时点比较 记录下载日期与文件摘要
单位与命名不统一 不同条目用不同单位体系与实体命名 跨模型计算需人工对齐 建立本地归一化层
时间跨度偏差 早年的模型缺 SED-ML,晚年的模型才有 老模型复现成本更高 优先选近年策展的条目

7.4 外部验证矩阵

验证方向 谁做的 结论 对本页的意义
复现率复盘 EMBL-EBI 策展团队(2021) 455 个模型里约一半无法直接复现;12% 需经验修正或作者协助才可复现 说明「下下来就能跑」是少数情形
作者提交的复现率 同上 66 个作者提交模型中 37 个可直接复现 作者自交并不比策展编码更可靠
SED-ML 覆盖率与正确性 多机构联合(2025) 约一半条目有 SED-ML;几乎所有这些文件都有至少一处小错 说明仿真层是独立的一层风险
跨引擎一致性 同上 五个 ODE 引擎上交叉验证通过 SED-ML 可实现引擎无关的复现
可复现性与引用量的关系 外部团队贝叶斯分析(2023) 328 个模型中可复现组引用量显著更高 复现性是可兑现的学术价值
小样本再策展 独立团队(2024) 50 个模型重新验证并打包为 OMEX 说明 OMEX 是可行的交付形态

7.5 它为何能持续:标准、策展劳动与引用激励三条腿

BioModels 能活二十年,靠的不是数据量。它的数据量在生物数据库里排不上号,几千条模型放在动辄上亿条记录的生态里并不显眼。它靠的是三件互相支撑的事。

第一件是标准的所有权关系。SBML、SED-ML、MIRIAM、COMBINE 这套标准与 BioModels 是共生关系:标准需要真实的模型库来证明自己够用,模型库需要标准来保证能被任何工具读取。这个循环一旦建立,新出现的建模工具就必须先支持 SBML,支持 SBML 就要面对 BioModels 的样本,于是引用持续产生。

第二件是策展劳动的不可替代性。2021 年那句话点明了性质:复现一个模型需要读懂论文、判断自然语言的歧义、手工编码、逐图比对。这些工作无法被自动管道替代,只能由专职人员做。这让 BioModels 拥有一种自动化数据库没有的稀缺性——它提供的是「有人替你看过一遍」的保证。

第三件是引用激励的可兑现性。2023 年那项贝叶斯分析给出一个具体结论:在 328 个模型里,可复现的那组引用量显著高于不可复现组,而且这个差异不能用期刊影响因子解释。这句话对建模者的现实含义是——把模型做对并且交出去,是能换来学术回报的。BioModels 是这个回报的兑现场所。

三条腿缺一条,这套东西就会退化成一个无人维护的格式转换器。它的可持续性不在于服务器,而在于每一年都有人愿意做那件费力的核对工作。

§8 生态位与历史

8.1 二十年,四个阶段

阶段 时间 关键事件 对使用者的影响
草创 2005 作为 SBML 模型的公开仓库建立,SBML 生态刚成形 只收 SBML,工具支持有限
扩展格式 约 2010–2017 接受 CellML、PharmML、MATLAB、Mathematica、R、Python、C++ 等多种编码 「是不是 SBML」不再是入库前提
规整与注释 2017–2020 MIRIAM 注释体系化,BioModels Parameters 上线,接受大规模自动生成模型 语义检索成为可能,同时库内异质性上升
复现性补课 2021–2025 455 模型复盘、50 模型 OMEX 再策展、千余模型 SED-ML 回填与跨引擎验证 「能跑」的标准从「格式合法」升级为「跨引擎一致」

8.2 命名体系:BIOMD 与 MODEL

两类前缀对应两类来源。BIOMD 前缀的条目源自已发表文献的数学模型,是库里最常被引用的部分。MODEL 前缀覆盖更广,包含大规模自动生成与转换来的模型。检索结果混排时,前缀是第一眼的来源线索。

8.3 它和其他「模型库」的区别

「模型」这个词在生物信息学里被用得很宽。机器学习模型、统计模型、代谢网络重建、动力学模型,都叫模型。BioModels 只指最后一类——可以用微分方程描述、可以给数值解、可以画成时间曲线的机制模型。这个限定很重要:找一个预训练的蛋白结构模型,这里没有;找一段描述蛋白构象变化的动力学方程,这里有。

8.4 它在 AI 时代的两个新角色

第一个角色是方程先验的来源。训练一个「输入条件、输出曲线」的模型,需要大量方程与曲线的配对;BioModels 的 SBML 可以被批量求解成这样的配对,是神经 ODE、符号回归这类工作的天然素材。

第二个角色是LLM 的工具后端。已经有工作把 BioModels 接进对话式代理:2025 年发表的 Talk2Biomodels 是一个基于大语言模型的开源代理平台,用自然语言驱动模型检索、仿真与解释,原生支持 SBML 编码的模型。它的意义不在于替代建模者,而在于把「找一个模型、跑一遍、看看像不像」这条路径的门槛压到一句话。

§9 使用指引

9.1 三种角色的路径

角色 目标 最短路径 要避开的坑
复现者 把论文图重新画出来 检索引文 → 取 OMEX → 用 SED-ML 在引擎里跑 → 逐点比对 只下 SBML 就自己设积分区间
建模者 找参数或找可借鉴的方程结构 BioModels Parameters 按实体检索 → 回查来源文献条件 把不同物种、不同细胞类型的参数混用
工程/AI 批量生成方程-曲线配对 FTP 快照 → libSBML 解析 → libRoadRunner 批量仿真 只按 accession 缓存、不记快照日期

9.2 一条最短的可用流程

从零到「看到一条曲线」,最短的路径只有五步。下面这段可以整段跑,前提是本机已装 Python 3.11 与 curl。

#-- 1. 环境
python3.11 -m venv .venv && source .venv/bin/activate
pip install python-libsbml libroadrunner==2.11.0

#-- 2. 取快照(FTP 通道可用;网页与 API 会被 403 拦)
mkdir -p bm && cd bm
curl -sL -o sbml_r31.tar.bz2 \
  https://ftp.ebi.ac.uk/pub/databases/biomodels/releases/latest/BioModels_Database-r31_pub-sbml_files.tar.bz2
tar -xjf sbml_r31.tar.bz2

#-- 3. 统计本地有多少 SBML 文件,确认解包完整
find . -name '*.xml' | wc -l
import glob
import libsbml
import roadrunner

files = sorted(glob.glob("**/*.xml", recursive=True))
print("本地 SBML 文件数:", len(files))

#-- 4. 逐条体检:层级、要素数、初值缺失
report = []
for path in files[:200]:
    doc = libsbml.readSBML(path)
    m = doc.getModel()
    if m is None:
        report.append((path, "无模型节点"))
        continue
    missing = sum(1 for k in range(m.getNumSpecies())
                  if not m.getSpecies().get(k).isSetInitialConcentration()
                  and not m.getSpecies().get(k).isSetInitialAmount())
    report.append((path, f"L{m.getLevel()}V{m.getVersion()} 物种{m.getNumSpecies()} 缺初值{missing}"))

for row in report[:10]:
    print(row)

#-- 5. 挑一条要素最少、初值齐全的模型,跑一段默认仿真
cand = [r for r in report if r[1].endswith("缺初值0")][:1]
if cand:
    rr = roadrunner.RoadRunner(cand[0][0])
    data = rr.simulate(0, 100, 101)
    print("仿真矩阵形状:", data.shape)
else:
    print("前 200 条中未找到初值齐全的模型,扩大扫描范围")

9.3 引用方式

引用一条模型时,至少要写清四样:accession、访问日期、文件类型(SBML / SED-ML / OMEX)、来源库版本或快照名。只写 accession 是不够的,因为条目会被重新策展。

引用整个库时,学界通行的做法是引两篇:建立与平台介绍的综述(2020 年《核酸研究》15 周年文),以及你所依赖的具体功能对应的论文(如用到 SED-ML 验证就引 2025 年 PLOS Computational Biology 那篇,用到参数检索就引 2020 年 Bioinformatics 那篇)。库本身的许可为 CC0 1.0,但引用义务与许可无关,是学术惯例。

§10 AI 使用声明

项 内容
本篇性质 由千方医数集依据公开一手资料编纂的知识性说明,非医学建议
主要来源 EMBL-EBI 官方资源说明、Europe PMC 检索到的论文摘要与开放全文
数字来源 2020 年《核酸研究》15 周年综述、2021 年 Molecular Systems Biology 复盘、2025 年 PLOS Computational Biology 验证工作、2020 年 Bioinformatics 参数服务论文
现场核验 2026-10-26 对 www.ebi.ac.uk/biomodels/、biomodels.org、FTP 目录与若干路径做了 HTTP 状态核对
未核验 库内条目当前的精确总数;curation 状态的完整取值集合;单条模型的字段级实值
未覆盖 网页前端的检索语法细节;生物模型格式转换工具链的逐一测试;模型的生物学结论正确性
更新预期 论文口径的数字会随新的 curation 论文更新,引用时请注明所依据的年份
使用限制 任何基于库内模型做出的药物或临床判断,必须经独立实验与领域专家复核

§11 与五个邻近概念的分工

11.1 它和「模型管理平台」不是一回事

建模工具(COPASI、Tellurium、libRoadRunner、SimBiology)与 BioModels 的分工常被混淆。前者是「造模型和跑模型的地方」,后者是「模型存放与被人找回去的地方」。同一个 SBML 文件,在 Tellurium 里是一个可以加载、改参数、重跑的对象;在 BioModels 里是一个带 accession、带策展记录、带文献链接的条目。前者管能力,后者管信誉。

这个分工有实际后果:你在工具里跑通了一条模型,不等于这条模型可以被别人复现。别人拿到的若是你在本地改过的版本,任何 accession 都对不上。凡是要长期复用或对外交付的模型,都应当回到库里做一次策展或至少留一份带日期的提交。

11.2 它和 CellML 模型仓库的边界

CellML 面向的是可组合的生理系统模型——心肌细胞电生理、循环系统、生物力学,这些模型强调「多个子模型按接口拼装」。BioModels 的重心在细胞内的生化反应网络,强调「反应的速率式与参数」。

两者在 SBML 与 CellML 之间并非没有桥,2020 年的综述明确说平台接受多种建模格式的提交,其中包括 CellML。但格式能进来不代表语义能对齐:CellML 的组件-接口范式与 SBML 的区室-反应范式在转换时会丢掉一部分结构信息。如果你的模型天然是「器官级多物理场耦合」,CellML 那边更顺手;如果天然是「一堆酶催化反应」,BioModels 这边更顺手。

11.3 它和代谢网络重建资源的边界

全基因组尺度代谢模型(GEM)把细胞当成一个约束优化问题:给定营养摄取上限,求通量分布。BioModels 的传统核心是动力学模型:给定时变方程,求浓度轨迹。两者在库内并存——2020 年之后接受了大规模自动生成模型的提交,2023 年之后新入的 GEM 多用 SBML Level 3 Version 2 加 FBC2 包。

并存带来一个检索陷阱。按「代谢」检索,结果里会同时出现手写的小型动力学模型和自动重建的全基因组模型,两者在物种数量上可能相差四五个数量级。用同一套处理流程对待它们,必然一方被糟蹋。

11.4 它和参数数据库的边界

有一类资源专门收集酶动力学常数(kcat、Km),通常按酶与底物成对组织,来源是湿实验测定。BioModels Parameters 看起来像同类,实际来源完全不同:它抽取的是「已入库模型里写着的参数值」,而这些参数本身是建模者从文献里选定的,可能经过拟合、可能来自同类反应的类比。

所以两者的可信度语义不同。参数数据库给的是「实验测到多少」,BioModels Parameters 给的是「某个已发表模型用了多少」。后者对建模更有用(它带着完整的速率方程与上下文),对实验设计更不可靠(它不保证是直接测定值)。

11.5 它和通用代码仓库的边界

GitHub 上也有大量动力学模型,常以 MATLAB 或 Python 脚本形态存在。与那些脚本相比,BioModels 的条目多出三样东西:标准格式、语义注释、策展记录。少掉的一样东西是灵活性——脚本可以随便加绘图、加拟合循环,SBML 只能表达模型本身。

实际工作中常见的做法是两头都要:库里取模型本体,仓库里取后处理脚本。把后处理脚本当成模型的一部分交给别人,是复现失败的高发原因之一。

§12 五类典型追问与回答

12.1 「为什么我下载的模型少了一个物种?」

最常见的原因是版本差异。同一篇论文的模型可能提交过两次:第一次是作者版本,遗漏了论文正文补遗里新增的一个物种;第二次是策展版本,补齐了。两个版本的 accession 不同,你在检索页点进去的可能不是后者。

第二种原因是 SBML 的物种与直觉不符。有些模型把「细胞外」与「细胞内」的同一分子建成两个 species,靠区室区分;有些模型把它们合成一个 species 靠反应方向区分。前者物种数看起来多一倍,后者看起来少一半,两者在数学上等价。

第三种原因是模型用了 comp 包做层级化,子模型被折叠在父模型内部,简单的遍历只看到顶层。遇到这种情况要把 comp 包展开之后再计数。

12.2 「为什么同一个模型在两台机器上曲线不同?」

先排除积分器差异。SBML 不指定算法,libRoadRunner 默认用 CVODE 做自适应步长,COPASI 默认用 LSODA 或 Radau5,两者的容差默认值也不同。对刚性强的模型(速率常数跨越几个数量级),不同算法的结果差异可以很可观。

再排除初值求解。有 initialAssignment 或稳态规则(assignmentRule、rateRule)的模型,初值不是常数而是算出来的;不同引擎对「先算规则还是先算初值」的处理顺序不一致时,起点就不同。

最后才怀疑模型本身。真有模型错误时,通常表现为某个物种出现负值、或者曲线在某个时点跳变——这两类现象都可以用脚本批量筛。

12.3 「论文里说模型是可复现的,为什么我这里复现不出来?」

论文里的「可复现」通常指「在作者的软件环境下、用作者的脚本、取作者的输出」可复现。这个定义比 BioModels 的 curation 标准宽得多:后者要求用标准格式、在通用引擎上、至少复现一张图。

差在这三处:软件环境(专有工具箱的默认行为不会被记录)、脚本细节(绘图前的平滑、单位换算、抽样间隔)、输出定义(论文图可能是某个派生量而不是原始物种浓度)。三者任一不同,曲线看起来就不一样。

12.4 「我把两个模型拼在一起,为什么跑不动?」

九个里有八个是单位问题。SBML 允许每个模型自定单位体系,区室的体积单位、物种的物质量单位、参数的速率单位可以各不相同。拼接时如果一边是按「分子数每秒」、另一边是按「纳摩尔每分」,方程本身合法,结果没有意义。

剩下两个是命名冲突与区室语义冲突。前者是两边都用 A 表示不同的东西,后者是一边的「细胞外」在另一边被合并进了单一区室。前者可以用 comp 包做命名空间隔离,后者只能人工改模型。

12.5 「我要找的这个过程,库里到底有没有模型?」

判断标准不是「搜不到关键词就等于没有」,而是三步。第一步用过程名搜,看命中的模型物种数量是否与你要的粒度匹配;第二步用关键蛋白名搜,看是否有模型把它当作状态变量;第三步用该过程的代表性论文标题搜,看是否有直接对应的条目。

三步都空,通常说明这件事还没有人写成可运行的定量模型——这在系统生物学里很常见。此时可用的替代是找邻近过程、取参数、自己搭。库的价值在这一刻从「提供模型」变成「提供零件」。

常见误读(避坑清单)

常见说法 实际情况 依据
「BioModels 里的模型下下来就能跑」 能跑不等于能复现。缺 SED-ML 时要自己定积分区间,区间选错曲线就完全不同 2025 年 PLOS Comput Biol:约一半条目有 SED-ML,几乎全部有至少一处小错
「curated 标记就是模型正确」 curation 只验证「与论文一致」,不验证论文本身的生物学结论 策展定义即「复现已发表仿真结果」
「未策展的条目就是垃圾」 只代表没人复现过,可能完全可用 库里大量作者自交模型未经核对但仍被使用
「有 accession 就等于有版本号」 同一个 accession 指向一个会被更新的条目,内容不是不可变的 条目有 lastModificationDate 字段
「库里存的也是实验数据」 模型库与观测数据库是两类资源,前者存方程不存测量序列 2020 年综述对模型仓库的定位描述
「作者自己提交的 SBML 更可靠」 66 个作者自交模型中仅 37 个能直接复现 2021 年复盘论文
「SED-ML 只是一份可有可无的说明书」 它决定积分区间、算法、输出点,直接改变曲线形状 2025 年工作把 SED-ML 作为验证核心
「网页 API 能稳定批量拉数据」 2026-10-26 多次请求均被 CloudFront 返回 403 本次现场请求
「FTP 上的 latest 就是今天的状态」 latest 指向 r31 快照,日期为 2017 年 6 月;releases/ 目录另有更晚的子目录 FTP 目录时间戳
「同一模型的多个 accession 是重复数据」 往往是作者原始版、策展整理版、多模型提交等不同分支 条目与文献一对多关系

FAQ

问:BioModels 和 GEO、ArrayExpress 这类数据库有什么区别?
答:GEO 存的是测量结果,BioModels 存的是机制。前者是「测到了什么数值」,后者是「这些数值之间按什么方程变化」。BioModels 里一条记录代表一篇论文里的 ODE 方程组、速率常数与初始条件,抽成 SBML。

问:下载下来的 SBML 文件能直接跑出论文里的图吗?
答:不能默认可以。SBML 只规定模型,不规定仿真条件;没有 SED-ML 时你必须自己猜积分时长、步长和积分器。即便是 curated 条目,2025 年的验证工作也报告,库内过半 SED-ML 文件当时存在至少一处小错误导致无法运行。

问:Manually curated 是不是等于模型正确?
答:不等于。curation 的含义是「有人把模型按论文编码成标准格式,并复现了论文里至少一张仿真图」。它验证的是与原论文一致,不验证原论文的生物学结论正确。

问:为什么同一个模型在库里会有好几个 accession?
答:因为同一篇文献可能提交了多个模型、多个版本,或者作者原始提交与策展整理版分开保存。选错 accession 的后果是拿到一个没有 curated 标记、也无人复现过的分支。

问:BioModels 有没有网页 API?
答:有,但 2026 年 10 月的两次请求都被 CloudFront 拦在 403。服务本身在跑,只是拒绝脚本化访问;要程序化取数,目前最稳的是 EBI FTP 上的归档目录。

问:它能不能直接拿来做机器学习?
答:不能直接当样本表用。它是模型仓库不是数据表,一个模型对应一组方程。可行的做法是用 libRoadRunner 批量求解,生成「方程结构 → 曲线」的配对,或者用 BioModels Parameters 取参数做先验。

问:SBML 表达不了什么?
答:布尔网络、agent-based 模型、空间分辨的组织级模型,以及多数纯随机过程都只能近似表达或不表达。库里有这类模型的转换版,但转换会丢语义。

问:库里有没有非人模型?
答:有,SBML 原生支持多物种,参数检索服务的覆盖口径里提到 60 个分类单元。做跨物种比较时要注意,同一通路在不同物种里参数差异可能很大。

问:策展完成之后论文勘误了怎么办?
答:库里的模型不会自动跟着改。curation 状态描述的是策展时点的事实。引用时应当记录访问日期,重要场景下回到原文核对最新版本。

问:我要引用一条模型该怎么写?
答:至少写清 accession、访问日期、文件类型、来源库版本或快照名。四样缺一样,别人就无法在你之后复现同一份文件。

问:为什么 FTP 上有那么多按日期命名的目录?
答:因为库长期以快照方式对外发布,每个日期目录是某一时点的状态。做纵向研究(比如看某条模型五年内改了几次)必须依赖这些快照。

问:它和 Reactome 该一起用还是二选一?
答:一起用。Reactome 给通路骨架但多数反应不带速率常数,BioModels 给带常数的模型但覆盖是抽样。做通路动力学时用前者定位反应、用后者找参数。

术语表

术语 中文 一句话解释
SBML 系统生物学标记语言 用 XML 描述生化反应网络的国际标准
SED-ML 仿真实验描述标记语言 描述「怎么跑」:积分区间、算法、输出变量
MIRIAM 生化模型注释最小信息要求 规定模型元素该挂哪些交叉引用
COMBINE 计算建模交换标准协作组织 推动 SBML、SED-ML 等标准互操作
OMEX 开放建模交换格式 把模型、实验说明与元数据打成一个包
curation 策展 人工编码模型并复现论文仿真的过程
curated model 已策展模型 通过策展、复现过论文仿真的条目
kinetic law 速率式 反应速率关于物种与参数的函数表达式
initialAssignment 初值指派 用表达式而不是常数给出初始值
compartment 区室 物种所在的体积单元,单位错位高发区
species 物种 模型中被追踪的化学实体,不是生物学物种
event 事件 满足触发条件时改变状态的分段规则
MathML 数学标记语言 SME 里写公式的 XML 语法
FBC 通量平衡约束包 让 SBML 能表达代谢网络的通量约束
SBO 系统生物学本体 给模型元素标注语义类型的受控词表
KisaoID 算法本体标识 SED-ML 里指定积分算法的标准编号
accession 条目编号 形如 BIOMD + 数字的稳定标识
Non-curated 未策展 格式合法但无人复现过的条目
ODE 常微分方程 大多数动力学模型的基本形式
QSP 定量系统药理学 用机制模型做药物剂量-效应外推
PBPK 生理药代动力学 按器官划分区室的药代模型
identifers.org 标识符解析服务 把紧凑 ID 解析为带前缀的稳定 URI
reproducibility scorecard 可复现性评分卡 8 个问题、每问 1 分、建议至少 4 分
engine independence 引擎无关性 同一模型在不同仿真器上得到一致结果

附录 A:核心数字核对表

项 值 来源 来源层级
建立年份 2005 2020 年《核酸研究》15 周年综述 论文摘要
文献模型总数 约两千条 同上 论文摘要
其中 curated 约八百条 同上 论文摘要
2025 年验证覆盖的 curated 动力学模型 千余条 2025 年 PLOS Computational Biology 论文摘要
先有 SED-ML 且被测试修正的文件 超过 450 份 同上 论文摘要
含 SED-ML 的条目占比 约一半 同上 论文摘要
跨引擎验证所用引擎数 5 个 同上 论文摘要
455 模型复盘中不可直接复现比例 约 49% 2021 年 Molecular Systems Biology 开放全文
复盘中可直接复现比例 约 51% 同上 开放全文
作者自交 SBML 模型可直接复现比例 37 / 66 同上 开放全文
复盘论文所覆盖期刊数 152 种 同上 开放全文
复盘样本占当时文献模型比例 超过 20% 同上 开放全文
参数服务覆盖反应数 约 8.4 万条 2020 年 Bioinformatics 论文摘要
参数服务覆盖分类单元 60 个 同上 论文摘要
r31 纯 SBML 包体积 约 184 MB EBI FTP 目录 官方页面
r31 全文件包体积 约 3.1 GB EBI FTP 目录 官方页面
RDF 导出包体积 约 28 MB EBI FTP 目录 官方页面
主页 HTTP 状态(2026-10-26) 403 本次请求 现场核验

附录 B:数字的来源分层

第一级:官方页面与官方目录。 包括 EBI FTP 目录的文件名、体积与时间戳,以及站点对脚本请求返回的 HTTP 状态。这类数字是当场看到的,问题只在于它代表的是哪一时点。FTP 目录的 latest 停在哪一年,本页已经写明。

第二级:论文摘要与开放全文。 包括 2020 年综述的「约两千」「约八百」、2025 年验证工作的「千余条」「超过 450」「约一半」、2021 年复盘的「455」「约 49%」「37 / 66」「152 种期刊」。这类数字有明确出处,但都是论文写作时点的快照。

第三级:未核实。 库里当前的精确条目总数、curation 状态的完整取值集合、各条模型的字段实值、网页 API 的正常响应格式。这几项本页一律不给具体数,只说明「未核实」。

三级的差别不在可信度,在可核对性。第一级你现在就能重做,第二级你得读论文,第三级你受限于访问条件。

附录 C:完整参考文献

  1. Malik-Sheriff RS, Glont M, Nguyen TVN, et al. BioModels—15 years of sharing computational models in life science. Nucleic Acids Research, 2020. DOI: 10.1093/nar/gkz1055
  2. Tiwari K, Kananathan S, Roberts MG, et al. Reproducibility in systems biology modelling. Molecular Systems Biology, 2021. DOI: 10.15252/msb.20209982
  3. Smith LP, Malik-Sheriff RS, Nguyen TVN, et al. Verification and reproducible curation of the BioModels repository. PLoS Computational Biology, 2025. DOI: 10.1371/journal.pcbi.1013239
  4. Glont M, Arankalle C, Tiwari K, et al. BioModels Parameters: a treasure trove of parameter values from published systems biology models. Bioinformatics, 2020. DOI: 10.1093/bioinformatics/btaa560
  5. Xu J, Smith L. Curating models from BioModels: Developing a workflow for creating OMEX files. PLoS ONE, 2024. DOI: 10.1371/journal.pone.0314875
  6. Höpfl S, Pleiss J, Radde NE. Bayesian estimation reveals that reproducible models in Systems Biology get more citations. Scientific Reports, 2023. DOI: 10.1038/s41598-023-29340-2
  7. Talk2Biomodels: AI agent-based open-source LLM initiative for kinetic biological models. BMC Bioinformatics, 2025. DOI: 10.1186/s12859-025-06310-1
  8. SBMLtoOdin and Menelmacar: interactive visualisation of systems biology models for expert and non-expert audiences. Bioinformatics, 2025. DOI: 10.1093/bioinformatics/btaf484
  9. BioModels: expanding horizons to include more modelling approaches and formats. Nucleic Acids Research, 2018. DOI: 10.1093/nar/gkx1023
  10. EBI FTP 归档目录:https://ftp.ebi.ac.uk/pub/databases/biomodels/(2026-10-26 现场核对)

附录 D:如何判断一条模型值不值得下载

下面这套判断按顺序执行,每一步都能在五分钟内完成,避免在一条注定用不了的模型上耗掉一下午。

import libsbml

def triage(path):
    """返回 (可用性判断, 理由)。只针对「能否复现论文」,不涉及生物学结论。"""
    doc = libsbml.readSBML(path)
    m = doc.getModel()
    if m is None:
        return "丢弃", "无模型节点"

    #-- 门槛一:SBML 层级。Level 3 的包在旧解析器里可能读不了
    level, version = m.getLevel(), m.getVersion()
    if level < 3:
        print(f"提示:Level {level} Version {version},需确认下游解析器兼容")

    #-- 门槛二:要素规模。物种过千的模型,人工比对不可行
    n_species = m.getNumSpecies()
    if n_species > 1000:
        return "谨慎", f"物种 {n_species},属大规模重建而非手写文献模型"

    #-- 门槛三:数值完整性
    assigned = {a.getSymbol() for a in m.getInitialAssignments()}
    miss_sp = [s.getId() for s in m.getSpecies()
               if s.getId() not in assigned
               and not s.isSetInitialConcentration()
               and not s.isSetInitialAmount()]
    miss_par = [p.getId() for p in m.getParameters() if not p.isSetValue()]
    if miss_par:
        return "丢弃", f"参数缺值 {len(miss_par)} 个,无法在不做假设的前提下复现"
    if len(miss_sp) > n_species * 0.1:
        return "退回原文", f"超一成物种缺初值({len(miss_sp)}/{n_species})"

    #-- 门槛四:事件与规则,决定是否需要分段仿真
    if m.getNumEvents() > 0 or m.getNumRules() > 0:
        return "可用但需 SED-ML", f"事件 {m.getNumEvents()} 条、规则 {m.getNumRules()} 条"

    return "可用", f"物种 {n_species}、反应 {m.getNumReactions()}、参数齐全"

这段程序的第四个返回值是真正要看的:可用但需 SED-ML。带事件或规则的模型,仿真行为取决于事件触发时点与规则求值顺序,没有 SED-ML 就几乎不可能与论文一致。

附录 E:如果只记五件事

第一,它存的是方程不是数据。 找测量值不在这里,找机制在这里。这个定位错一次,后面所有判断都会连带错。

第二,curation 状态是唯一的入口筛选条件。 状态写 Manually curated 不一定对,写 Non-curated 不一定错,但前者至少有人跑过一遍。

第三,SBML 不含仿真条件。 要复现论文,必须拿到 SED-ML 或 OMEX;拿不到就要自己从图注里抠积分区间,§4.4 的案例里那条模型正是折在这一步。

第四,2025 年是分水岭。 在此之前只有约一半条目有 SED-ML,且几乎全部带小错;此后千余条 curated 模型做了回填与五引擎验证。选模型时优先挑 2025 年之后重新策展过的。

第五,脚本取数走 FTP 不走网页。 网页与 API 对程序化访问返回 403,FTP 目录正常。快照 latest 指向 2017 年的 r31,用之前先确认时间窗是否够。

编辑说明

本页由千方医数集 AI 写作代理编纂。核验方式为:对 EMBL-EBI 公开目录与若干站点路径做 HTTP 状态核对,通过 Europe PMC 检索并读取论文摘要与开放全文,未对库内条目做全量下载与逐条统计。

写作用时受研究时间盒约束,只保留官方目录与论文摘要两个来源层级,未做界面级字段核对。www.ebi.ac.uk/biomodels/ 在核验时返回 403,首页与其子路径的界面元素(检索语法、分面选项、单条模型页的字段排布)因此未能逐项确认,本页凡涉及界面行为之处均注明为「官方页面称」或直接标为未核实。

文中对 curation 状态的讨论基于论文对策展流程的描述,未核对当前界面上的完整取值集合;若取值多于两种,§4.1 的对照表需要相应扩展。

BioModels Parameters 服务的入口地址沿用论文所载路径,其当前可达性未逐一验证,引用该服务时请以实际访问结果为准。


相关数据集导航

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

  • gene2phenotype — 共享标签:基因组学与多组学 / 医学问答与基准 / 公共卫生与流行病学
  • impc — 共享标签:基因组学与多组学 / 公共卫生与流行病学
  • alphamissense — 共享标签:基因组学与多组学 / 公共卫生与流行病学
  • rnacentral — 共享标签:基因组学与多组学 / 医学问答与基准
  • rfam — 共享标签:基因组学与多组学 / 医学问答与基准
  • cpic — 共享标签:基因组学与多组学 / 医学问答与基准
  • ckb — 共享标签:基因组学与多组学 / 公共卫生与流行病学
  • uk-biobank — 共享标签:基因组学与多组学 / 公共卫生与流行病学
  • all-of-us — 共享标签:基因组学与多组学 / 公共卫生与流行病学
  • sra — 共享标签:基因组学与多组学 / 公共卫生与流行病学

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

返回 AI-Ready 数据集