2 BLAST数据库:选对库,结果就成功了一半

做BLAST这么多年,我最大的感悟就是——数据库选错了,后面的一切分析都是白搭。你想想看,拿着一个未知序列去比对,如果库里的参考数据全是错的或者不全的,那出来的结果能靠谱吗?

这一章,咱们就聊聊BLAST的三大数据库家族:NCBI非冗余数据库、参考基因组数据库,还有你自己构建的自定义数据库。我会把每个库的特点、适用场景、还有我踩过的坑,都跟你说明白。

核心要点:不同数据库解决不同问题。NR数据库适合广撒网找同源序列,参考基因组库适合精确定位,自定义库则是解决特殊问题的利器。

2.1 NCBI非冗余数据库(NR)

NR,全称Non-Redundant Protein Database。说白了,就是NCBI把GenBank、RefSeq、EMBL、DDBJ等多个数据库的蛋白序列合并起来,去掉了重复的部分。嗯,这样做的好处很明显——节省你的比对时间,避免冗余结果干扰判断。

NR数据库的特点:

  • 覆盖最广:几乎涵盖所有已知物种的蛋白序列
  • 更新最快:每两周更新一次,跟上科研前沿
  • 非冗余:相同的序列只保留一条
  • 体积巨大:目前已经超过5亿条序列,索引文件上百GB

什么时候该用NR?我个人习惯是做物种鉴定或功能注释的第一步。比如你从一个环境样本里拿到了一段未知基因序列,想知道它是什么东西、可能有什么功能,直接用NR blastp或者blastx扫一遍,基本就能有个数。

但NR也有它的隐患。我曾经在项目里遇到过一个情况:用NR比对结果里出现了大量低置信度的匹配,后来查了才发现,是因为NR里包含了很多未验证的预测序列。所以我的建议是——用NR做初筛没问题,但别完全相信排在后面的匹配。

数据库 序列来源 去重方式 典型大小 更新频率
NR (protein) GenBank, RefSeq, EMBL, DDBJ, PDB等 100% 序列去重 ~500GB 每2周
NT (nucleotide) GenBank, EMBL, DDBJ 100% 序列去重 ~200GB 每2周
RefSeq NCBI手工审核+自动流程 严格的非冗余 ~50GB 每月
小技巧:如果你的机器内存有限,建议使用BLAST的-num_threads参数控制并行度,别让NR数据库把内存吃光了。我一般设成物理核心数的一半,比较稳妥。
避坑指南:不要用NR数据库去做全基因组比对分析!NR里的序列片段化严重,用它做全基因组水平分析会得到大量碎片化的、不完整的结果。我见过有人拿着NR的blast结果去拼基因组,结果拼出来的东西根本不能用。

2.2 参考基因组数据库(RefSeq/Genome)

参考基因组数据库和NR数据库最大的区别是什么?一个是「百科全书」,一个是「专题著作」。NR像百科全书,什么都有一点;而参考基因组数据库更像是一个物种的完整基因组专著,序列完整、注释规范。

我个人的经验是——做call变异、比较基因组、基因家族分析这类事情,永远优先选择参考基因组数据库。因为它的序列是完整的染色体级别,有稳定的基因注释,方便你做后续的定位和统计分析。

参考基因组数据库的核心特点:

  • 序列完整:从染色体到线粒体,覆盖完整
  • 注释标准:基因、外显子、CDS等区域有标准标注
  • 版本明确:比如GRCh38/hg38,版本号清晰可追溯
  • 专门化:每个物种一个库,大小适中

但是——这里有个坑。参考基因组数据库的序列虽然完整,但它的变异多样性不如NR。什么意思呢?比如你研究的是一个稀有品种的细菌,但参考基因组库只收录了标准株,那比对结果的灵敏度就会下降。我曾经遇到过一个情况,用标准参考基因组库去比对野生菌株的测序数据,结果大量read无法比对,后来换成NR做核苷酸比对才找到同源序列。

总结一下:什么时候该用哪个,取决于你的研究目的。做精确的基因组分析用参考基因组库,做广泛的同源性搜索用NR。

# 下载人类参考基因组(GRCh38)的索引
# 这一步不要用wget直接下载,建议用NCBI的datasets工具
datasets download genome taxon human --reference --assembly-level complete

# 解压并构建BLAST索引
tar -xzf ncbi_dataset.zip
makeblastdb -in GCF_000001405.40_GRCh38.p14_genomic.fna \
            -dbtype nucl \
            -parse_seqids \
            -out human_GRCh38

2.3 自定义数据库构建

最后聊一个我个人认为最有用的东西——自定义数据库。为什么说它有用?因为真实世界里的生物信息学问题,很多时候标准数据库根本搞不定。

举几个例子你就明白了:

  • 你有一个细菌基因组的完整序列,想知道它跟某个特定基因家族的所有成员有哪些同源关系——这种问题只能建一个自定义库
  • 你的项目需要对特定的功能基因集合(比如抗性基因、毒力因子)做定向搜索——标准库太大了,建个小库更快
  • 你想比较自己的测序序列跟实验室之前积累的所有克隆序列——那就建个实验室专用数据库

构建自定义数据库其实很简单,就两步:

  1. 准备好FASTA文件(序列数据)
  2. 用makeblastdb命令构建索引

这里我写一个标准的构建流程:

# 创建一个自定义的FASTA文件(假设叫 my_sequences.fasta)
# 注意FASTA格式要求:>开头ID行,后面序列行,不能有空行

>geneA_bacillus_subtilis
ATGCGTATCGTAGCTAGCTAGCTAGC
>geneA_escherichia_coli
ATGCTAGCTAGCTAGCTAAACGTAGC
>geneA_pseudomonas_aeruginosa
ATGCGTACGTAGCTAGCTAGCGATCG

# 构建BLAST索引
makeblastdb -in my_sequences.fasta \
            -dbtype nucl \
            -title "My Custom GeneA Database" \
            -parse_seqids \
            -out my_custom_db
注意:-dbtype参数只有两个选项:nucl(核酸)和prot(蛋白)。别弄混了。我刚开始做自定义库的时候,就犯过拿核酸库当蛋白库用的低级错误,结果blastp报错报了半天。

关于自定义库的一些参数建议:

参数 作用 我的建议
-dbtype 指定序列类型 看情况选,别选错
-title 设置库的名称 建议包含日期和版本信息
-parse_seqids 解析ID信息 建议开启,后面做序列提取方便
-out 输出库的路径和前缀 写清楚路径,别随便丢在桌面上
一个我踩过的坑:自定义数据库构建完后,千万要注意文件名不要包含中文字符或特殊符号。我有个项目就是因为文件名里加了空格和下划线混用,结果BLAST在Linux环境下一直找不到数据库,排查了半天才发现是路径问题。建议统一用小写字母加下划线。

构建完自定义库之后,用到BLAST的时候只要指定库的路径就行:

blastn -query unknown_sequence.fasta \
       -db /path/to/my_custom_db \
       -out result.txt \
       -outfmt 6 \
       -evalue 1e-5

哦对了,还有一点要提醒你——自定义库构建后会产生几个后缀为 .nhr、.nin、.nsq 的索引文件,这些文件必须放在一起,不能移动或删除。我曾经因为磁盘空间不够,把索引文件挪到了另一个目录,结果BLAST直接报错说找不到数据库。

BLAST数据库选型与知识体系总览 未知序列 (核酸/蛋白) 需要功能/物种鉴定 NCBI NR / NT 非冗余·覆盖广·更新快 适用于初筛与跨物种搜索 参考基因组数据库 完整基因组·标准注释 适用于变异检测·比较基因组 自定义数据库 针对特定问题构建 适用于定向搜索·内部数据集 功能注释 物种鉴定·同源分析 精确分析 变异检测·基因定位 定向搜索 内部数据库比对 💡 决策要点 • 大范围初筛 → NR数据库(广覆盖·快比对) • 精确变异/定位 → 参考基因组库(完整·标准) • 特定问题/内部数据 → 自定义库(灵活·高效)