【数据库】本地KEGG数据库如何拆分子库?
根据相似性原理,序列相似,功能相似,所有功能注释无非是用比对工具将输入序列比对到数据库序列,再将输入ID对应数据库ID,进一步对应到功能条目的关系。
数据库要么建到本地,要么联网调用API,一般的软件或包做注释都是通过联网来获得,或者调用依赖的一些专门注释的包(文件较大)。工业生产中,一般需要构建本地数据库。
如果不对原始数据库按物种或其他分类来进行拆分的话,整个数据库会很大,比对和注释消耗的时间和资源都会很大,显然不经济,而且也会有一些假阳性的结果。比如将人特有的功能比对到了小鼠上,客户无法结果。所以分库是很有必要的,只是怎么分以及分多大的问题。
KEGG本地库文件
-
序列数据库文件
如kegg_all_clean.fa
image.png
-
ko系列文件(ko与其他ID的对应关系),ko与不同类型数据库
我们这里要用到的是ko和geneID的对应关系,其他数据库类似
image.png

-
物种文件
misc下的taxonomy文件,按物种分库的依据。
image.png
-
map目录,通路图。
每条通路有三个文件:png是通路图,html是网页通路,conf是通路的配置
image.png
conf文件内容
image.png
-
map_title.tab文件,是通路的三个层级
image.png
-
ko_map.tab文件,是K与通路的全部物种对应文件
是联系注释结果之间对应关系的必需文件。
image.png
-
komap目录下,是各个物种(三个字母缩写)的通路图(png)及其配置(conf),以及该物种对应的通路。
如人的komap/hsa目录:
image.png
当然也可以不细分到单物种,可以划分物种大类,如动物、植物等,相对应地文件animal_ko_map.tab、plant_ko_map.tab
利用上面的这些文件,其实我们就可以进行KEGG Pathway功能注释了,即存在这样的关系:蛋白——序列ID(基因)——K号——ko(pathway)——Level1-3——通路图。这样得到的通路图,都是map开头,即reference pathway;如果是物种特异通路,即ko开头,则用komap目录结果。KEGG的5种通路类型等基础知识这里不讲,不懂可去查。
如果要按物种进行拆库,则需要将上面的文件都按物种进行分类,使用是一样的。
KEGG数据库非常庞大,除了Pathway,genes等数据库外,还有很多其他的文件,比如:
-
links目录,pathway与其他ID的对应关系
image.png
如pathway_ko.list
image.png
-
ligand目录,即配体数据库,不做介绍。
按物种拆分KEGG数据库
1.获得物种分类信息
按物种拆分可大可小:最大就是原始库,最小就是单一物种,中间可以按不同分类来拆。关键取决于你的输入序列是什么成分,当然不大不小恰好能全部包含是最理想的分库结果。比如taxonomy文件(misc目录下)格式是:

我们可以按Eukaryotes、Animals、Vertebrates、Mammals中的任一个层级来分。也可以自定义分类,将不同物种添加到一起进行归类。
这里写一个简单脚本来用上面文件中的第二层级物种来进行数据库分库:
#!urs/bin/perl
open F , $ARGV[0];
while (<F>){
chomp;
if (/^## (.+)/){
$spec=$1;
open OUT, ">>$spec.specie.xls";
}
elsif (!/^#/){
@aa=split/\t/,$_;
print OUT "$spec\t$aa[1]\t$aa[3]\n";
}
}
拆分后得到Animals.specie.xls、 Archaea.specie.xls、 Bacteria.specie.xls、 Fungi.specie.xls、 Plants.specie.xls、 Protists.specie.xls
等系列分类文件。如Animals.specie.xls
文件如下:

2.获得物种分类的序列信息并建库
从全部物种的原始序列数据库中拆分出以上分类物种的序列,编写如下get_fasta.pl
脚本:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
unless(@ARGV>=2){
print "perl $0 list.txt db.fa specie.fa\n";
exit(1);
}
my %hash;
open L,"$ARGV[0]" or die "$!\n";
my %list;
while(<L>){
chomp;
my @aa=split/\t/,$_;
$list{$aa[1]}='';
}
close L;
my $num_need = scalar keys %list;
print("begin fetch $num_need sequence...\n");
open F,"$ARGV[1]" or die "$!\n";
my %seq;
while(<F>){
LINE: #if(m/^>([^\|]+)/){
if(/^>([^:]+):([^\s]+)/){
chomp;
my $acc = $1;
my $line=$_;
my $idd=$1.':'.$2;
$hash{$idd}=$line;
next unless exists $list{$acc};
while(<F>){
goto LINE if /^>/;
s/[^a-z]//gsi;
$seq{$idd} .= $_;
}
last;
}
elsif (/^>(12122[^\s]+)(.*)/){
chomp;
my $acc = $1;
$hash{$1}=$_;
next unless exists $list{$acc};
while(<F>){
goto LINE if /^>/;
s/[^a-z]//gsi;
$seq{$acc} .= $_;
}
last;
}
}
close F;
open O,">$ARGV[2]" or die "$!\n";
foreach my $acc (keys %seq){
print O "$hash{$acc}\n$seq{$acc}\n";
}
my $yesn = scalar keys %seq;
my $non = $num_need - $yesn;
if($non>=1){
print "have $non sequence not found!\n";
}else{
print "you have successfully got $yesn sequence!\n";
}
close O;
获得分类后的序列:
perl get_fasta.pl Animals.specie.xls kegg_all_clean.fa animals.fa
获得分类后的数据库后,可用blast/diamond等软件进行建库,以便进行输入序列的比对。
3.获得物种分类的K-ko对应文件
从全部物种的ko_map.tab
文件(K与通路的对应关系文件)中获取物种分类后的子文件。编写脚本get_species_komap.pl
:
#!/usr/bin/perl
=pod
this script is subsplit species komap
perl $0 species.xls ko_genes.list ko_map.tab species_ko_map.tab
=cut
my $spe=shift;
my $ko_gene=shift;
my $ko_map=shift;
my $map=shift;
my (%spe,%ko);
open F,"<$spe";
while(<F>){
chomp;
my @F=split/\t/,$_;
$spe{$F[1]}=1;
}
close F;
open F,"<$ko_gene";
while(<F>){
chomp;
my @F=split/\t/,$_;
my $ko=(split/:/,$F[0])[1];
my $spe=(split/:/,$F[1])[0];
if(exists $spe{$spe}){
$ko{$ko}=1;
}
}
close F;
open F,"<$ko_map";
open O,">$map";
while(<F>){
chomp;
my @F=split/\t/,$_;
if(exists ($ko{$F[0]})){
print O "$_\n";
}
}
close F;
close O;
得到animal_ko_map.tab
文件,其他分类物种也是类似。
拆分子库后比对获得该子库中的功能信息,后续注释的数据处理其实和不分库时是一样的,都是一些文本的格式转换以及可视化。
比如我们可将KEGG数据库拆分:动物animal.fa、植物plant.fa、真菌fungi.fa、真核eukaryotes.fa、原核prokaryote.fa、原生生物microorganism.fa,以及包含原核、真菌和原生生物三种组合的微生物库other.fa,除动植物、真菌、原核、原生之外但在KEGG数据库中的其他生物unknow.fa。
后面比对注释时只需设置物种参数即可。