[!序言] 好久以以前有
KEGG.db,后来KEGG不开放了,这个包也就一直不更新了,然后过了几年,也就被移除了,距今又是好几年。clusterProfiler一开始的KEGG支持也是基于这个包,在KEGG不开放之时,我很快就上线了在线爬数据的KEGG版本。但之前支持KEGG.db依然保留着。后来我们就搞了个createKEGGdb的R包,让你可以用我们在线爬数据的功能来生成一个可以安装的KEGG.db包,然后可以对接原来clusterProfiler的功能,就变成了你可以缓存KEGG的数据,分析时是本地的。由于我现在搞个新格式:KEGG的富集分析终于真的本地化了。,原来的方式等同于废弃。但最近有github issue,说
createKEGGdb报错,我发现这还真有人在用。于是顺手就修复了。同时也看看以前的issue。发现了一个想把微生物的KEGG本地化的需求,这一点都不难,然后我想做宏基因组的小伙伴大概也是有这需求的,反手就是支持了一下。

做微生物组功能注释时,大家最常碰到的一个现实问题是:注释用的 KEGG 路径—基因映射太分散,在线查询速度慢、还容易被网络波动打断。createKEGGdb 的目标很简单:把 KEGG REST API 的结果打包成一个本地 KEGG.db(sqlite + AnnDbPkg 结构),后续富集分析就只读本地文件。
但当需求变成“所有微生物(细菌、病毒、真菌、古菌)”时,很多人会卡在第一步:微生物物种代码怎么拿?哪些算微生物?
这篇文章给出一个可执行的做法:直接从 KEGG 提供的 organism 列表筛选出我们要的物种代码,然后一键构建。
1. 关键事实:KEGG 已经给了完整物种列表
KEGG REST API 的 organism 列表在这里:
每一行大致是 4 列:
- KEGG 的 taxonomy id(例如
T01001) - 物种代码(例如
hsa) - 物种名称
- 系统分类路径(lineage),例如
Eukaryotes;Animals;Mammals;Primates
对我们来说,真正需要的是第 2 列“物种代码”,它正是 create_kegg_db() 的输入。
2. 怎么定义“微生物”?
issue #6 的问题是“所有微生物(所有细菌、病毒、真菌、古菌)”。在 KEGG 的 lineage 里,这几类可以直接用前缀匹配:
- 细菌:
Prokaryotes;Bacteria... - 古菌:
Prokaryotes;Archaea... - 真菌:
Eukaryotes;Fungi... - 病毒:
Viruses...
这不是唯一的“微生物”定义。例如某些原生生物并不属于 Fungi,但也可能出现在微生物组数据里。如果你需要把它们也纳入,可以在脚本里增加额外规则(比如把某些 Eukaryotes 分支也纳入)。本文先按 issue #6 的四类做。
3. 可直接调用的函数
现在可以直接调用 createKEGGdb 包内置的函数 create_kegg_db_microbiota()。
它会:
- 下载 organism 列表
- 按 lineage 过滤出细菌/古菌/真菌/病毒
- 取出物种代码(第二列)
- 调用
createKEGGdb::create_kegg_db()构建
示例:
createKEGGdb::create_kegg_db_microbiota(output_dir = "/path/to/output")输出目录下会生成 KEGG.db_*.tar.gz。
4. 运行时的几个现实提醒
- 这会很慢
微生物物种数量非常大,构建“全微生物版”数据库必然会跑很久。建议在稳定网络环境下运行,并预留足够时间。
- 网络波动不可避免
KEGG REST 在高频请求下偶尔会返回 400、SSL connect error 等问题。当前版本在遇到“某个物种无 pathway/请求失败”时会跳过该物种并继续,避免全局中断。
- 先从子集开始
如果你只是做常见细菌富集,建议先只做 Prokaryotes;Bacteria,验证流程没问题后再扩展到古菌/真菌/病毒。
5. 常见问题
Q1:我只想构建细菌,怎么改?
在函数里设置 include 参数即可:
createKEGGdb::create_kegg_db_microbiota(
output_dir = "/path/to/output",
include = "bacteria"
)Q2:KEGG 的 pathway 名称里有物种后缀,能去掉吗?
当前代码已经做了简单清洗(把 - ... (xxx) 的尾巴去掉),主要是为了后续展示更一致。