4. 标准数据库与自定义数据库
聊到 Kraken2 的数据库,很多新手第一反应是:直接用官方的不就行了吗?嗯,理论上没错。但我在实际项目中遇到过好几次,标准库要么太大,要么太旧,要么压根儿不包含你关心的物种。说白了,数据库选不对,后面跑得再快也是白费。
今天这章,我就带你把预置数据库和自定义数据库这两块儿彻底搞清楚。
4.1 预置数据库:官方给你备好的几种选择
Kraken2 官方维护了几种标准数据库,全都基于 NCBI 的 RefSeq 数据构建。你直接用 kraken2-build --standard 就能下载。我个人的习惯是,在做原型验证或者快速筛查时,优先考虑标准库。
目前主流的预置库有下面几种。我整理了一张表,你一眼就能看明白差异:
| 数据库名称 | 覆盖范围 | 大小(约) | 适用场景 |
|---|---|---|---|
| 标准库 (Standard) | 细菌、古菌、病毒、真菌、原虫、人类 | ~70 GB | 综合性宏基因组分析 |
| 16S 库 | 细菌与古菌的 16S rRNA 基因 | ~1 GB | 16S 扩增子测序分析 |
| minikraken2 | 细菌、古菌、病毒(精简版) | ~4 GB | 内存受限或快速测试 |
| 绿基 (Greengenes) | 16S rRNA(旧版格式) | ~200 MB | 兼容老式分析流程 |
可能会问:直接跑标准库不就完了吗?为什么还要自己折腾?我给你讲个真实案例。有一次我分析一批土壤样本,想重点看某个罕见真菌。标准库里虽然有真菌,但那个物种的基因组版本太老了。结果 Kraken2 把大部分 reads 都分配到了“未分类”。我后来重新构建了一个包含最新基因组版本的自定义库,分类率直接从 18% 飙到了 67%。所以你看,预置库只是起点,不是终点。
4.2 自定义数据库:自己动手,丰衣足食
构建自定义数据库,说白了就是从 NCBI 的 RefSeq 或 GenBank 里挑你感兴趣的基因组,然后压成一个 Kraken2 能读的索引文件。整个过程分三步:
- 挑选基因组 – 明确你要包含哪些物种,以及用哪个版本的基因组。
- 下载并整理 – 用
kraken2-build或手动下载 FASTA 文件。 - 构建索引 – 调用
kraken2-build --build生成三个核心文件。
我个人最喜欢用的工具是 kraken2-build 自带的 --add-to-library 功能。它能把单个 FASTA 文件自动放进库目录里。举个实际操作的例子:
# 先创建一个空目录作为数据库工作区
mkdir my_custom_db
cd my_custom_db
# 下载目标基因组的 FASTA 文件(这里以大肠杆菌为例)
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/005/845/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_genomic.fna.gz
# 解压并添加到库中
gunzip GCF_000005845.2_ASM584v2_genomic.fna.gz
kraken2-build --add-to-library GCF_000005845.2_ASM584v2_genomic.fna --db my_custom_db
# 重复上面的步骤,添加你需要的所有基因组……
# 最后构建索引
kraken2-build --build --db my_custom_db --threads 16
4.3 从 NCBI 挑选基因组:我的一线经验
NCBI 上的基因组数量庞大,怎么挑到真正有用的?我有几个判断标准,你照着做基本不会踩坑:
- 优先选 RefSeq 而非 GenBank – RefSeq 经过人工审核,质量更稳。我一般在 NCBI Assembly 页面过滤 “RefSeq” 标签。
- 看 assembly level – 选 “Complete Genome” 或 “Chromosome” 级别。Contig/Scaffold 级别缺失太多,容易产生假阳性。
- 版本号 – 选最新版本,但别盲目追新。如果用旧版本跑过的项目,换版本后结果可能不可比。我通常会锁定一个版本,整个项目期间不换。
- 核对物种名称 – NCBI 上很多序列标的是 “Candidatus” 或未定种,这些我一般会单独建一个 “unclassified” 子库,避免污染主库。
下面这个 SVG 图,把整个 “标准库 vs 自定义库” 的决策逻辑画出来了。你看一眼就能明白自己该走哪条路。
你可能会问:如果我需要同时包含细菌和真菌,但只想用最新的数据,怎么办?我的做法是单独从 NCBI 下载每个物种的 RefSeq 完整基因组,然后把 FASTA 文件一股脑放到一个目录里,再用 --add-to-library 全部添加。最后构建时指定 --threads 32,大概 2-3 小时就能跑完一个 50 GB 规模的库。
4.4 实战:一个完整的小型自定义库构建
我拿一个真实的需求给你演示。假设我只分析 沙门氏菌 和 李斯特菌 两个属,外加一个 人类基因组 用来过滤宿主污染。这是我的操作流程:
# 1. 创建数据库目录
mkdir food_pathogen_db
cd food_pathogen_db
# 2. 下载基因组
# 沙门氏菌参考基因组
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/006/945/GCF_000006945.2_ASM694v2/GCF_000006945.2_ASM694v2_genomic.fna.gz
# 李斯特菌参考基因组
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/168/755/GCF_000168755.3_ASM16875v3/GCF_000168755.3_ASM16875v3_genomic.fna.gz
# 人类基因组(只需染色体部分)
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/001/405/GCF_000001405.39_GRCh38.p13/GCF_000001405.39_GRCh38.p13_genomic.fna.gz
# 3. 解压所有文件
for f in *.fna.gz; do gunzip $f; done
# 4. 添加到库
kraken2-build --add-to-library GCF_000006945.2_ASM694v2_genomic.fna --db food_pathogen_db
kraken2-build --add-to-library GCF_000168755.3_ASM16875v3_genomic.fna --db food_pathogen_db
kraken2-build --add-to-library GCF_000001405.39_GRCh38.p13_genomic.fna --db food_pathogen_db
# 5. 构建索引
kraken2-build --build --db food_pathogen_db --threads 16 --protein
# 6. 检查输出文件
ls -lh food_pathogen_db/*.k2d
--protein 参数会启动 “proteins” 模式,内存占用会翻倍,但准确率在近缘物种区分上明显提升。我在做食品微生物鉴定时必开这个参数。如果你内存紧张,就别加了。
构建完成后,你会得到三个文件:hash.k2d(核心索引)、opts.k2d(构建选项)、taxo.k2d(分类树信息)。缺少任何一个,Kraken2 都会报错。我曾经有一次只复制了 hash.k2d 到另一台机器,结果跑分类时直接崩溃。
数据库这块儿就这么多。核心就两句话:预置库省事但不够灵活,自定义库可控但需要你花时间选基因组。我个人建议,没有特殊需求时先用 minikraken2 跑通流程,后续再慢慢构建专属库。否则一上来就弄个上百 GB 的自定义库,万一参数没调对,你光重建索引就能等到怀疑人生。