4. 标准数据库与自定义数据库

聊到 Kraken2 的数据库,很多新手第一反应是:直接用官方的不就行了吗?嗯,理论上没错。但我在实际项目中遇到过好几次,标准库要么太大,要么太旧,要么压根儿不包含你关心的物种。说白了,数据库选不对,后面跑得再快也是白费。

今天这章,我就带你把预置数据库和自定义数据库这两块儿彻底搞清楚。

4.1 预置数据库:官方给你备好的几种选择

Kraken2 官方维护了几种标准数据库,全都基于 NCBI 的 RefSeq 数据构建。你直接用 kraken2-build --standard 就能下载。我个人的习惯是,在做原型验证或者快速筛查时,优先考虑标准库。

目前主流的预置库有下面几种。我整理了一张表,你一眼就能看明白差异:

数据库名称覆盖范围大小(约)适用场景
标准库 (Standard)细菌、古菌、病毒、真菌、原虫、人类~70 GB综合性宏基因组分析
16S 库细菌与古菌的 16S rRNA 基因~1 GB16S 扩增子测序分析
minikraken2细菌、古菌、病毒(精简版)~4 GB内存受限或快速测试
绿基 (Greengenes)16S rRNA(旧版格式)~200 MB兼容老式分析流程
我的小建议: 如果你的服务器内存小于 64 GB,就别碰标准库了。它构建出来的索引文件(hash.k2d)超过 100 GB,光加载就能撑爆内存。这时候用 minikraken2 是更聪明的选择。

可能会问:直接跑标准库不就完了吗?为什么还要自己折腾?我给你讲个真实案例。有一次我分析一批土壤样本,想重点看某个罕见真菌。标准库里虽然有真菌,但那个物种的基因组版本太老了。结果 Kraken2 把大部分 reads 都分配到了“未分类”。我后来重新构建了一个包含最新基因组版本的自定义库,分类率直接从 18% 飙到了 67%。所以你看,预置库只是起点,不是终点。

4.2 自定义数据库:自己动手,丰衣足食

构建自定义数据库,说白了就是从 NCBI 的 RefSeq 或 GenBank 里挑你感兴趣的基因组,然后压成一个 Kraken2 能读的索引文件。整个过程分三步:

  1. 挑选基因组 – 明确你要包含哪些物种,以及用哪个版本的基因组。
  2. 下载并整理 – 用 kraken2-build 或手动下载 FASTA 文件。
  3. 构建索引 – 调用 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
避坑指南: 我曾经犯过一个低级错误——把质粒序列也当成基因组加了进去。结果分类时 Kraken2 把所有带质粒的 reads 都标成了“质粒来源”,完全打乱了物种分配。正确的做法是:只添加染色体和完整的质粒(如果必须要分析质粒的话),或者单独用一个库来存放质粒序列。

4.3 从 NCBI 挑选基因组:我的一线经验

NCBI 上的基因组数量庞大,怎么挑到真正有用的?我有几个判断标准,你照着做基本不会踩坑:

  • 优先选 RefSeq 而非 GenBank – RefSeq 经过人工审核,质量更稳。我一般在 NCBI Assembly 页面过滤 “RefSeq” 标签。
  • 看 assembly level – 选 “Complete Genome” 或 “Chromosome” 级别。Contig/Scaffold 级别缺失太多,容易产生假阳性。
  • 版本号 – 选最新版本,但别盲目追新。如果用旧版本跑过的项目,换版本后结果可能不可比。我通常会锁定一个版本,整个项目期间不换。
  • 核对物种名称 – NCBI 上很多序列标的是 “Candidatus” 或未定种,这些我一般会单独建一个 “unclassified” 子库,避免污染主库。

下面这个 SVG 图,把整个 “标准库 vs 自定义库” 的决策逻辑画出来了。你看一眼就能明白自己该走哪条路。

数据库选择与构建决策流程 开始:选择数据库 全基因组 vs 特定区域(如 16S) 选择标准库 kraken2-build --standard 选择自定义库 从 NCBI 挑选基因组 直接分类分析 下载 FASTA 文件 kraken2-build --build 生成三个核心索引文件 提示:自定义库必须包含 taxonomy 目录(names.dmp、nodes.dmp),否则构建会失败

你可能会问:如果我需要同时包含细菌和真菌,但只想用最新的数据,怎么办?我的做法是单独从 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 的自定义库,万一参数没调对,你光重建索引就能等到怀疑人生。