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 | 每月 |
-num_threads参数控制并行度,别让NR数据库把内存吃光了。我一般设成物理核心数的一半,比较稳妥。
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 自定义数据库构建
最后聊一个我个人认为最有用的东西——自定义数据库。为什么说它有用?因为真实世界里的生物信息学问题,很多时候标准数据库根本搞不定。
举几个例子你就明白了:
- 你有一个细菌基因组的完整序列,想知道它跟某个特定基因家族的所有成员有哪些同源关系——这种问题只能建一个自定义库
- 你的项目需要对特定的功能基因集合(比如抗性基因、毒力因子)做定向搜索——标准库太大了,建个小库更快
- 你想比较自己的测序序列跟实验室之前积累的所有克隆序列——那就建个实验室专用数据库
构建自定义数据库其实很简单,就两步:
- 准备好FASTA文件(序列数据)
- 用
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的时候只要指定库的路径就行:
blastn -query unknown_sequence.fasta \
-db /path/to/my_custom_db \
-out result.txt \
-outfmt 6 \
-evalue 1e-5
哦对了,还有一点要提醒你——自定义库构建后会产生几个后缀为 .nhr、.nin、.nsq 的索引文件,这些文件必须放在一起,不能移动或删除。我曾经因为磁盘空间不够,把索引文件挪到了另一个目录,结果BLAST直接报错说找不到数据库。