Biopython 简明教程
Biopython - BioSQL Module
BioSQL 是一种通用数据库架构,主要设计为存储所有 RDBMS 引擎的序列及其相关数据。它的设计方式是它保存来自所有流行的生物信息学数据库(如 GenBank、Swissport 等)的数据。它还可以用于存储内部数据。
BioSQL 目前为以下数据库提供特定架构 −
-
MySQL (biosqldb-mysql.sql)
-
PostgreSQL (biosqldb-pg.sql)
-
Oracle (biosqldb-ora/*.sql)
-
SQLite (biosqldb-sqlite.sql)
它还为基于 Java 的 HSQLDB 和 Derby 数据库提供最小的支持。
BioPython 提供非常简单、容易和高级的 ORM 功能,用于处理基于 BioSQL 的数据库。 BioPython provides a module, BioSQL 以执行以下功能 −
-
Create/remove a BioSQL database
-
连接到 BioSQL 数据库
-
解析序列数据库,如 GenBank、Swisport、BLAST 结果、Entrez 结果等,并直接将其加载到 BioSQL 数据库
-
从 BioSQL 数据库中获取序列数据
-
从 NCBI BLAST 中获取分类学数据并将其存储在 BioSQL 数据库中
-
对 BioSQL 数据库运行任何 SQL 查询
Overview of BioSQL Database Schema
在深入了解 BioSQL 之前,让我们了解 BioSQL 架构的基础知识。BioSQL 架构提供了 25+ 表来保存序列数据、序列特征、序列类别/本体和分类信息。一些重要的表如下所示 −
-
biodatabase
-
bioentry
-
biosequence
-
seqfeature
-
taxon
-
taxon_name
-
antology
-
term
-
dxref
Creating a BioSQL Database
在本节中,让我们使用由 BioSQL 团队提供的架构创建一个示例 BioSQL 数据库 biosql。我们将使用 SQLite 数据库,因为它很容易上手,并且没有复杂的设置。
这里,我们将按照以下步骤创建基于 SQLite 的 BioSQL 数据库。
Step 1 - 下载 SQLite 数据库引擎并安装它。
Step 2 - 从 GitHub URL 下载 BioSQL 项目。 https://github.com/biosql/biosql
Step 3 - 打开控制台,使用 mkdir 创建一个目录并进入其中。
cd /path/to/your/biopython/sample
mkdir sqlite-biosql
cd sqlite-biosql
Step 4 - 运行以下命令以创建一个新的 SQLite 数据库。
> sqlite3.exe mybiosql.db
SQLite version 3.25.2 2018-09-25 19:08:10
Enter ".help" for usage hints.
sqlite>
Step 5 - 从 BioSQL 项目(/sql/biosqldb-sqlite.sql`)复制 biosqldb-sqlite.sql 文件,并将其存储在当前目录中。
Step 6 - 运行以下命令以创建所有表。
sqlite> .read biosqldb-sqlite.sql
现在,所有表均已在我们的新数据库中创建。
Step 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 以格式化方式显示结果。
Step 8 - 复制 BioPython 团队提供的样例 GenBank 文件,ls_orchid.gbk https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk 到当前目录,并将其另存为 orchid.gbk。
Step 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 数据库,并将一些示例数据加载到其中。我们将在下一章讨论重要表格。
Simple ER Diagram
biodatabase 表位于层次结构的顶部,其主要目的是将一组序列数据组织成一个组/虚拟数据库。 Every entry in the biodatabase refers to a separate database and it does not mingle with another database. BioSQL 数据库中的所有相关表都引用 biodatabase 条目。
bioentry 表保存有关序列的所有详细信息,但序列数据除外。特定 bioentry 的序列数据将存储在 biosequence 表中。
taxon 和 taxon_name 是分类信息,并且每个条目都引用该表以指定其分类信息。
在理解了模式之后,让我们在下一节中研究一些查询。
BioSQL Queries
让我们深入了解一些 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 and .mode are formatting options to better visualize the data 。您还可以使用任何 SQLite 编辑器来运行查询。
如下所示,列出系统中可用的虚拟序列数据库 −
select
*
from
biodatabase;
*** Result ***
sqlite> .width 15 15 15 15
sqlite> select * from biodatabase;
biodatabase_id name authority description
--------------- --------------- --------------- ---------------
1 orchid
sqlite>
这里,我们只有一个数据库, orchid 。
使用以下给出的代码列出数据库 orchid 中可用的条目(前 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>
Load Data into BioSQL Database
让我们学习如何在本章中将序列数据加载到 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()
我们将深入了解代码的每一行及其目的 −
Line 1 − 加载 SeqIO 模块。
Line 2 − 加载 BioSeqDatabase 模块。此模块提供与 BioSQL 数据库交互的所有功能。
Line 3 − 加载 os 模块。
Line 5 − open_database 使用配置的驱动程序 (driver) 打开指定的数据库 (db) 并返回对 BioSQL 数据库 (server) 的句柄。Biopython 支持 sqlite、mysql、postgresql 和 oracle 数据库。
Line 6-10 − load_database_sql 方法从外部文件加载 sql 并执行它。commit 方法提交事务。我们可以跳过此步骤,因为我们已经使用 schema 创建了数据库。
Line 12 − new_database 方法创建新的虚拟数据库 orchid 并返回句柄 db 以对 orchid 数据库执行命令。
Line 13 − load 方法将序列条目(可迭代 SeqRecord)加载到 orchid 数据库中。SqlIO.parse 解析 GenBank 数据库并以可迭代 SeqRecord 的形式返回其中的所有序列。load 方法的第二个参数 (True) 指示它从 NCBI blast 网站获取序列数据的分类单元详细信息,如果系统中尚未提供这些详细信息。
Line 14 − commit 提交事务。
Line 15 − close 关闭数据库连接并销毁服务器句柄。
Fetch the Sequence Data
让我们按如下所示从 orchid 数据库中获取标识符为 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 选择了序列。 lookup 以 SeqRecordObject 的形式返回序列信息。由于我们已经知道如何使用 SeqRecord,因此很容易从中获取数据。