Biopython 简明教程

Biopython - BioSQL Module

BioSQL 是一种通用数据库架构,主要设计为存储所有 RDBMS 引擎的序列及其相关数据。它的设计方式是它保存来自所有流行的生物信息学数据库(如 GenBank、Swissport 等)的数据。它还可以用于存储内部数据。

BioSQL 目前为以下数据库提供特定架构 −

  1. MySQL (biosqldb-mysql.sql)

  2. PostgreSQL (biosqldb-pg.sql)

  3. Oracle (biosqldb-ora/*.sql)

  4. SQLite (biosqldb-sqlite.sql)

它还为基于 Java 的 HSQLDB 和 Derby 数据库提供最小的支持。

BioPython 提供非常简单、容易和高级的 ORM 功能,用于处理基于 BioSQL 的数据库。 BioPython provides a module, BioSQL 以执行以下功能 −

  1. Create/remove a BioSQL database

  2. 连接到 BioSQL 数据库

  3. 解析序列数据库,如 GenBank、Swisport、BLAST 结果、Entrez 结果等,并直接将其加载到 BioSQL 数据库

  4. 从 BioSQL 数据库中获取序列数据

  5. 从 NCBI BLAST 中获取分类学数据并将其存储在 BioSQL 数据库中

  6. 对 BioSQL 数据库运行任何 SQL 查询

Overview of BioSQL Database Schema

在深入了解 BioSQL 之前,让我们了解 BioSQL 架构的基础知识。BioSQL 架构提供了 25+ 表来保存序列数据、序列特征、序列类别/本体和分类信息。一些重要的表如下所示 −

  1. biodatabase

  2. bioentry

  3. biosequence

  4. seqfeature

  5. taxon

  6. taxon_name

  7. antology

  8. term

  9. 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 是分类信息,并且每个条目都引用该表以指定其分类信息。

simple er diagram

在理解了模式之后,让我们在下一节中研究一些查询。

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,因此很容易从中获取数据。

Remove a Database

删除一个数据库就像调用 remove_database 方法并使用正确的数据库名称,然后按以下说明提交它一样简单:

from BioSQL import BioSeqDatabase
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
server.remove_database("orchids")
server.commit()