Biopython BioSQL模块
BioSQL 是一个通用的数据库模式,主要是为所有RDBMS引擎存储序列及其相关数据而设计。它的设计方式是,它可以保存所有流行的生物信息学数据库的数据,如GenBank, Swissport等。它也可以用来存储内部数据。
BioSQL currently provides specific schema for the below databases −
- MySQL (biosqldb-mysql.sql)
- PostgreSQL (biosqldb-pg.sql)
- Oracle (biosqldb-ora/*.sql)
- SQLite (biosqldb-sqlite.sql)
它还提供了对基于Java的HSQLDB和Derby数据库的最小支持。
BioPython为基于BioSQL的数据库提供了非常简单、方便和先进的ORM功能。 BioPython提供了一个模块,BioSQL 可以实现以下功能
- 创建/删除一个BioSQL数据库
- 连接到BioSQL数据库
- 解析序列数据库,如GenBank、Swisport、BLAST结果、Entrez结果等,并直接将其加载到BioSQL数据库。
- 从BioSQL数据库中获取序列数据
- 从NCBI BLAST中获取分类数据并将其存储在BioSQL数据库中
- 对BioSQL数据库运行任何SQL查询
BioSQL数据库模式概述
在深入了解BioSQL之前,让我们了解一下BioSQL模式的基本知识。BioSQL模式提供了25个以上的表来保存序列数据、序列特征、序列类别/本体和分类学信息。其中一些重要的表如下
- biodatabase
- bioentry
- biosequence
- seqfeature
- taxon
- taxon_name
- antology
- term
- dxref
创建一个BioSQL数据库
在本节中,让我们使用BioSQL团队提供的模式创建一个BioSQL数据库样本,biosql。我们将使用SQLite数据库,因为它很容易上手,而且没有复杂的设置。
在这里,我们将使用以下步骤创建一个基于SQLite的BioSQL数据库。
第1步 - 下载SQLite数据库引擎并安装它。
第2步 - 从GitHub网址下载BioSQL项目。 https://github.com/biosql/biosql
第3步 - 打开一个控制台,使用mkdir创建一个目录,并进入其中。
cd /path/to/your/biopython/sample
mkdir sqlite-biosql
cd sqlite-biosql
第4步 - 运行下面的命令来创建一个新的SQLite数据库。
> sqlite3.exe mybiosql.db
SQLite version 3.25.2 2018-09-25 19:08:10
Enter ".help" for usage hints.
sqlite>
第5步 --从BioSQL项目中复制biosqldb-sqlite.sql文件(/sql/biosqldb-sqlite.sql`),并将其保存在当前目录中。
第6步 - 运行下面的命令来创建所有的表。
sqlite> .read biosqldb-sqlite.sql
现在,所有的表都在我们的新数据库中创建。
第7步 - 运行下面的命令来查看我们数据库中所有的新表。
sqlite> .headers on
sqlite> .mode column
sqlite> .separator ROW "\n"
sqlite> SELECT name FROM sqlite_master WHERE type = 'table';
biodatabase
taxon
taxon_name
ontology
term
term_synonym
term_dbxref
term_relationship
term_relationship_term
term_path
bioentry
bioentry_relationship
bioentry_path
biosequence
dbxref
dbxref_qualifier_value
bioentry_dbxref
reference
bioentry_reference
comment
bioentry_qualifier_value
seqfeature
seqfeature_relationship
seqfeature_path
seqfeature_qualifier_value
seqfeature_dbxref
location
location_qualifier_value
sqlite>
前三个命令是配置命令,用于配置SQLite,使其以格式化的方式显示结果。
第8步 - 将BioPython团队提供的GenBank样本文件ls_orchid.gbk复制到 当前目录并保存为orchid.gbk。
第9步 - 使用下面的代码创建一个python脚本,load_orchid.py,并执行它。
from Bio import SeqIO
from BioSQL import BioSeqDatabase
import os
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
db = server.new_database("orchid")
count = db.load(SeqIO.parse("orchid.gbk", "gb"), True) server.commit()
server.close()
上述代码解析了文件中的记录,并将其转换为python对象,然后插入到BioSQL数据库中。我们将在后面的部分分析该代码。
最后,我们创建了一个新的BioSQL数据库并将一些样本数据加载到其中。我们将在下一章中讨论重要的表格。
简单的ER图
biodatabase 表位于层次结构的顶端,它的主要目的是将一组序列数据组织到一个单一的组/虚拟数据库中。 biodatabase中的每个条目都指向一个单独的数据库,它不会与另一个数据库混合。 BioSQL数据库中的所有相关表都引用biodatabase条目。
生物条目 表保存了所有关于序列的细节,除了序列数据。一个特定的 生物条目的 序列数据将被保存在 生物序列 表中。
taxon和taxon_name是分类学细节,每个条目都参考这个表来指定它的分类信息。
在了解了模式之后,让我们在下一节看看一些查询。
BioSQL查询
让我们深入研究一些SQL查询,以更好地了解数据是如何组织的,以及表之间的关系。在继续之前,让我们用下面的命令打开数据库,并设置一些格式化的命令–
> sqlite3 orchid.db
SQLite version 3.25.2 2018-09-25 19:08:10
Enter ".help" for usage hints.
sqlite> .header on
sqlite> .mode columns
.header和.mode是格式化选项,可以更好地将数据可视化。 你也可以使用任何SQLite编辑器来运行查询。
列出系统中可用的虚拟序列数据库,如下所示-
select
*
from
biodatabase;
*** Result ***
sqlite> .width 15 15 15 15
sqlite> select * from biodatabase;
biodatabase_id name authority description
--------------- --------------- --------------- ---------------
1 orchid
sqlite>
这里,我们只有一个数据库, 兰花
用下面的代码列出 兰花 数据库中的条目(前3条)。
select
be.*,
bd.name
from
bioentry be
inner join
biodatabase bd
on bd.biodatabase_id = be.biodatabase_id
where
bd.name = 'orchid' Limit 1,
3;
*** Result ***
sqlite> .width 15 15 10 10 10 10 10 50 10 10
sqlite> select be.*, bd.name from bioentry be inner join biodatabase bd on
bd.biodatabase_id = be.biodatabase_id where bd.name = 'orchid' Limit 1,3;
bioentry_id biodatabase_id taxon_id name accession identifier division description version name
--------------- --------------- ---------- ---------- ---------- ---------- ----------
---------- ---------- ----------- ---------- --------- ---------- ----------
2 1 19 Z78532 Z78532 2765657 PLN
C.californicum 5.8S rRNA gene and ITS1 and ITS2 DN 1
orchid
3 1 20 Z78531 Z78531 2765656 PLN
C.fasciculatum 5.8S rRNA gene and ITS1 and ITS2 DN 1
orchid
4 1 21 Z78530 Z78530 2765655 PLN
C.margaritaceum 5.8S rRNA gene and ITS1 and ITS2 D 1
orchid
sqlite>
列出与一个条目相关的序列细节(加入-Z78530,名称-C. fasciculatum 5.8S rRNA基因和ITS1和ITS2 DNA),并给出代码-
select
substr(cast(bs.seq as varchar), 0, 10) || '...' as seq,
bs.length,
be.accession,
be.description,
bd.name
from
biosequence bs
inner join
bioentry be
on be.bioentry_id = bs.bioentry_id
inner join
biodatabase bd
on bd.biodatabase_id = be.biodatabase_id
where
bd.name = 'orchid'
and be.accession = 'Z78532';
*** Result ***
sqlite> .width 15 5 10 50 10
sqlite> select substr(cast(bs.seq as varchar), 0, 10) || '...' as seq,
bs.length, be.accession, be.description, bd.name from biosequence bs inner
join bioentry be on be.bioentry_id = bs.bioentry_id inner join biodatabase bd
on bd.biodatabase_id = be.biodatabase_id where bd.name = 'orchid' and
be.accession = 'Z78532';
seq length accession description name
------------ ---------- ---------- ------------ ------------ ---------- ---------- -----------------
CGTAACAAG... 753 Z78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA orchid
sqlite>
使用以下代码获得与条目相关的完整序列(加入号 – Z78530,名称 – C. fasciculatum 5.8S rRNA基因和ITS1和ITS2 DNA) —
select
bs.seq
from
biosequence bs
inner join
bioentry be
on be.bioentry_id = bs.bioentry_id
inner join
biodatabase bd
on bd.biodatabase_id = be.biodatabase_id
where
bd.name = 'orchid'
and be.accession = 'Z78532';
*** Result ***
sqlite> .width 1000
sqlite> select bs.seq from biosequence bs inner join bioentry be on
be.bioentry_id = bs.bioentry_id inner join biodatabase bd on bd.biodatabase_id =
be.biodatabase_id where bd.name = 'orchid' and be.accession = 'Z78532';
seq
----------------------------------------------------------------------------------------
----------------------------
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAACAGAATATATGATCGAGTGAATCT
GGAGGACCTGTGGTAACTCAGCTCGTCGTGGCACTGCTTTTGTCGTGACCCTGCTTTGTTGTTGGGCCTCC
TCAAGAGCTTTCATGGCAGGTTTGAACTTTAGTACGGTGCAGTTTGCGCCAAGTCATATAAAGCATCACTGATGAATGACATTATTGT
CAGAAAAAATCAGAGGGGCAGTATGCTACTGAGCATGCCAGTGAATTTTTATGACTCTCGCAACGGATATCTTGGCTC
TAACATCGATGAAGAACGCAG
sqlite>
列出与生物数据库相关的分类群,兰花
select distinct
tn.name
from
biodatabase d
inner join
bioentry e
on e.biodatabase_id = d.biodatabase_id
inner join
taxon t
on t.taxon_id = e.taxon_id
inner join
taxon_name tn
on tn.taxon_id = t.taxon_id
where
d.name = 'orchid' limit 10;
*** Result ***
sqlite> select distinct tn.name from biodatabase d inner join bioentry e on
e.biodatabase_id = d.biodatabase_id inner join taxon t on t.taxon_id =
e.taxon_id inner join taxon_name tn on tn.taxon_id = t.taxon_id where d.name =
'orchid' limit 10;
name
------------------------------
Cypripedium irapeanum
Cypripedium californicum
Cypripedium fasciculatum
Cypripedium margaritaceum
Cypripedium lichiangense
Cypripedium yatabeanum
Cypripedium guttatum
Cypripedium acaule
pink lady's slipper
Cypripedium formosanum
sqlite>
将数据加载到BioSQL数据库中
让我们在本章中学习如何将序列数据加载到BioSQL数据库中。我们在上一节已经有了将数据加载到数据库的代码,代码如下
from Bio import SeqIO
from BioSQL import BioSeqDatabase
import os
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
DBSCHEMA = "biosqldb-sqlite.sql"
SQL_FILE = os.path.join(os.getcwd(), DBSCHEMA)
server.load_database_sql(SQL_FILE)
server.commit()
db = server.new_database("orchid")
count = db.load(SeqIO.parse("orchid.gbk", "gb"), True) server.commit()
server.close()
我们将深入了解每一行的代码及其目的
第1行 - 加载SeqIO模块。
第2行 - 加载BioSeqDatabase模块。这个模块提供了与BioSQL数据库交互的所有功能。
第3 行 – 加载os模块。
第5 行 – open_database用配置好的驱动(driver)打开指定的数据库(db),并返回一个到BioSQL数据库(server)的句柄。Biopython支持sqlite, mysql, postgresql和oracle数据库。
第6-10行 - load_database_sql方法从外部文件加载sql并执行它。 commit方法提交事务。我们可以跳过这一步,因为我们已经用模式创建了数据库。
第12行 - new_database方法创建了新的虚拟数据库orchid,并返回一个句柄db来执行针对orchid数据库的命令。
第13 行 – load方法将序列条目(可迭代的SeqRecord)加载到orchid数据库中。SqlIO.parse解析GenBank数据库并将其中的所有序列作为可迭代的SeqRecord返回。load方法的第二个参数(True)指示它从NCBI blast网站获取序列数据的分类细节,如果它在系统中还没有可用的话。
第14行 - commit 提交交易。
第15行 - close 关闭数据库连接并销毁服务器句柄。
获取序列数据
让我们从兰花数据库中获取一个标识符为2765658的序列,如下所示
from BioSQL import BioSeqDatabase
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
db = server["orchid"]
seq_record = db.lookup(gi = 2765658)
print(seq_record.id, seq_record.description[:50] + "...")
print("Sequence length %i," % len(seq_record.seq))
这里,server["orchid"]
返回从虚拟数据库orchid中获取数据的句柄。 lookup 方法提供了一个基于标准选择序列的选项,我们选择了标识符为2765658的序列。因为我们已经知道如何使用SeqRecord`,所以很容易从它获得数据。
删除一个数据库
删除一个数据库很简单,只要用适当的数据库名称调用remove_database方法,然后按照下面的规定提交即可。
from BioSQL import BioSeqDatabase
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
server.remove_database("orchids")
server.commit()