3. BLAST 变体与工具选择:到底该用哪一个?

好,这是很关键的一讲。我们刚才聊了 BLAST 的基本原理,但你打开 NCBI 的 BLAST 页面,会发现一堆选项:BLASTN、BLASTP、BLASTX、TBLASTN、TBLASTX……再加上一个 blastx 的变体……嗯,有点晕是吧?

别急。实际项目里不是每个工具都要用,选错了轻则跑得慢,重则漏掉关键注释。我今天就把这几个「变体」的适用场景拆开揉碎了讲清楚。每个工具解决什么问题,写什么命令,我在项目里踩过什么坑,一起过一遍。

一句话总结选择逻辑:看你的“查询序列”和“目标数据库”分别是什么“语言”——是核酸(DNA/RNA)还是氨基酸(蛋白质)。两两组合,就是五种模式。

3.1 BLASTN:核酸 vs 核酸

简单粗暴。你的查询序列是 DNA,数据库也是 DNA。它直接比较碱基序列,速度最快,对同源性的分辨率也最高。特别适合:

  • 已知基因在另一个菌株里的等位基因查找
  • 16S rRNA 鉴定(物种鉴定经典场景)
  • 质粒序列比对,看同源区域

我个人习惯在跑 BLASTN 时把 -word_size 调小一点,默认一般是 11,但如果在做耐药基因筛查(比如找 mecA 的同源变异),我会降到 7,这样能抓到更发散的同源片段。代价是速度下降,不过小基因组无所谓。

常用命令示例:

blastn -query query.fasta -db nt -out results.txt \
       -outfmt 6 -evalue 1e-10 -word_size 11

我的实战经验:BLASTN 的 -task 参数有个坑。默认是 megablast(对大段高度相似序列优化),如果你在找跨种属的保守区,记得换成 blastn 或 dc-megablast,不然会漏。我之前有一次跑沙门氏菌的毒力基因,差点因为这个漏了一个关键缺失片段。

3.2 BLASTP:蛋白 vs 蛋白

你手上有一段蛋白序列,或者你已将基因翻译成了蛋白质,去比对蛋白质数据库。

做抗生素抗性基因注释时,我几乎首选 BLASTP。为什么?因为蛋白质序列比核酸更保守。核酸序列很容易因同义突变而看上去“差异大”,但蛋白序列能保留核心功能结构域。换句话说,你用 BLASTP 能找到更远缘的同源基因——这在你注释未知病原菌时特别重要。

  • 适用于:已有 ORF 预测结果,做功能注释
  • 推荐数据库:NR、Swiss-Prot、UniRef
  • 参数注意:-evalue 我一般设为 1e-5,再高噪声太多

命令示例:

blastp -query proteins.faa -db nr -out blastp_results.txt \
       -outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore" \
       -num_threads 8 -evalue 1e-5

避坑:NR 数据库很大。我第一次跑全基因组注释,拿了一整条 Klebsiella 染色体翻译后的蛋白,对着 NR 跑 BLASTP……跑了 3 天。
现在我的习惯是先拿 Swiss-Prot 跑一轮拿到功能标签,再用 NR 查漏补缺。这样快很多。

3.3 BLASTX:核酸 vs 蛋白(我最常用的一个)

你有一段 DNA 或 cDNA,但不知道它里面有没有“隐藏”的编码区。BLASTX 会帮你把输入的核酸序列自动按六种读框翻译成蛋白质,再比对蛋白数据库。

这在病原菌基因组里太常用了:你测序得到一个 contig,有很多片段,你想立刻知道这些片段大概编码什么——不需要等 ORF 预测完成。BLASTX 能做到。

  • 典型场景:新基因组初步功能标注、RNA-seq 读段的功能注释
  • 优势:能发现新基因、跨物种的远同源关系
  • 注意点:速度慢(因为内部要翻译六框架)

我一般做初筛时这么用:

blastx -query contigs.fasta -db nr -out blastx_contigs.txt \
       -outfmt 6 -evalue 1e-3 -num_threads 8

小技巧:如果你不想等太久,可以先用 -max_target_seqs 设为 1,先拿一条最优匹配,后面再有针对性地细做。另外,BLASTX 的 -strand both 默认打开,我一般保持默认,因为不明白链方向。

3.4 TBLASTN:蛋白 vs 核酸

和 BLASTX 刚好反过来——你的查询是蛋白质序列,数据库是核酸。工具会把数据库中的每条核酸序列翻译成六框蛋白,然后和你的查询蛋白比对。

这有什么用?比如你有一个已知的抗性蛋白序列,想看看在某个细菌基因组(DNA序列)里有没有编码类似蛋白的区域——即使这些区域没有正式标注为基因,也能找到。

  • 适合场景:在未注释的基因组草图中找同源结构域
  • 一种“反向”推测:已知蛋白,找其编码基因的可能位置
  • 我曾在噬菌体序列注释中用过,效果很好

命令示例:

tblastn -query protein.fasta -db assembled_genome.fasta \
        -out tblastn.out -outfmt 6 -evalue 1e-5

注意:TBLASTN 的计算开销大,因为数据库每条序列翻译6次。如果基因组较大,建议先做索引或用分块查询。我曾经在跑一个 50 Mb 的植物病原菌基因组时,TBLASTN 跑了将近 8 小时。建议只在必要场景用。

3.5 TBLASTX:核酸 vs 核酸,但蛋白层面

这个最「重型」。查询序列和数据库序列都是核酸,但内部都会翻译成六种读框的蛋白序列,再在蛋白层面比对——相当于你做了两次 BLASTX。

说实话,我个人很少用。只在一种情况下用过:当我比对两条相距较远的基因组(比如不同属的细菌),且怀疑存在极保守的新基因,核酸层面的比对全无结果时,才会尝试 TBLASTX。

它超级慢,而且结果解读需要小心。因为从核酸到蛋白、再到跨读框匹配,假阳性会增加。

tblastx -query unknown.fasta -db reference_genome.fasta \
        -out tblastx.txt -outfmt 6 -evalue 1e-3

一句话总结:常规基因组注释,BLASTX 是最平衡的选择。但具体场景具体分析,没有万金油。

3.6 对比一览表

工具查询类型数据库类型核心用途推荐频率
BLASTN核酸核酸同源基因、标记基因鉴定高频
BLASTP蛋白蛋白蛋白功能注释高频
BLASTX核酸蛋白新基因组初步注释、RNA-seq极高频
TBLASTN蛋白核酸在未注释序列中找同源区中频
TBLASTX核酸核酸极远缘同源搜索低频

3.7 一个直观的选择逻辑

我把这个选择逻辑画了一张流程图,方便你贴在工位旁:

BLAST变体选择逻辑图 查询序列和数据库各是什么 ? 查询是核酸 数据库是核酸 ? BLASTN 同源基因查找 数据库是蛋白 ? BLASTX 最常用 查询是蛋白 数据库是蛋白 ? BLASTP 蛋白功能注释 否 TBLASTN 在基因组找蛋白 说明: • TBLASTX 很少用,图上未展开。它常见于跨属/远亲缘种之间的探索性筛选。 • BLASTX、TBLASTN 在处理「未知读框」的核酸序列时,效率极高。

核心原则:DNA vs DNA 用 BLASTN;Protein vs Protein 用 BLASTP;跨类型比对需要额外翻译步骤,但回报是能跨更大的进化距离找到同源关系。