Biopython BioSQL 模块


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

BioSQL 目前为以下数据库提供了特定的架构:

  • MySQL (biosqldb-mysql.sql)
  • PostgreSQL (biosqldb-pg.sql)
  • 甲骨文 (biosqldb-ora/*.sql)
  • SQLite (biosqldb-sqlite.sql)

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

BioPython 提供了非常简单、容易和高级的 ORM 功能来处理基于 BioSQL 的数据库。 BioPython 提供了一个模块,BioSQL 做以下功能:

  • 创建/删除 BioSQL 数据库
  • 连接到 BioSQL 数据库
  • 解析GenBank、Swisport、BLAST result、Entrez result等序列数据库,直接加载到BioSQL数据库中
  • 从 BioSQL 数据库中获取序列数据
  • 从 NCBI BLAST 获取分类数据并将其存储在 BioSQL 数据库中
  • 对 BioSQL 数据库运行任何 SQL 查询

BioSQL 数据库模式概述


在深入了解 BioSQL 之前,让我们先了解一下 BioSQL 模式的基础知识。 BioSQL 模式提供 25 多个表来保存序列数据、序列特征、序列类别/本体和分类信息。一些重要的表格如下:

  • 生物数据库
  • bioentry
  • 生物序列
  • 序列特征
  • taxon
  • 分类名称
  • antology
  • term
  • dxref

创建 BioSQL 数据库


在本节中,让我们使用 BioSQL 团队提供的模式创建一个示例 BioSQL 数据库,即 biosql。我们将使用 SQLite 数据库,因为它非常容易上手并且没有复杂的设置。

在这里,我们将使用以下步骤创建一个基于 SQLite 的 BioSQL 数据库。

步骤 1 : 下载SQLite数据库引擎并安装。

步骤 2 : 从 GitHub URL 下载 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项目(/sql/biosqldb-sqlite.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 https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk into the current directory and save it as 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 图


生物数据库 表位于层次结构的顶部,其主要目的是将一组序列数据组织到单个组/虚拟数据库中。 生物数据库中的每个条目都指向一个单独的数据库,并且不会与另一个数据库混合。 BioSQL 数据库中的所有相关表都引用了 biodatabase 条目。

bioentry 表包含有关序列的所有详细信息,除了序列数据。特定的序列数据 bioentry 将存储在 生物序列 table.

taxon 和 taxon_name 是分类详细信息,每个条目都引用此表以指定其分类信息。

Simple ER Diagram

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

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>

在这里,我们只有一个数据库, orchid .

列出数据库中可用的条目(前 3 个) orchid 使用下面给定的代码

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 gene and ITS1 and 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. 束状 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()

我们将深入了解每一行代码及其用途:

Line 1 : 加载 SeqIO 模块。

Line 2 : 加载 BioSeqDatabase 模块。该模块提供了与 BioSQL 数据库交互的所有功能。

Line 3 : 加载os模块。

Line 5 : open_database 用配置好的驱动程序(驱动程序)打开指定的数据库(db),并返回一个对BioSQL数据库(服务器)的句柄。 Biopython 支持 sqlite、mysql、postgresql 和 oracle 数据库。

6-10 号线 : load_database_sql 方法从外部文件加载sql并执行。 commit 方法提交事务。我们可以跳过这一步,因为我们已经使用模式创建了数据库。

Line 12 : new_database 方法创建新的虚拟数据库,orchid 并返回一个句柄 db 来对 orchid 数据库执行命令。

Line 13 : load 方法将序列条目(iterable SeqRecord)加载到兰花数据库中。 SqlIO.parse 解析 GenBank 数据库并将其中的所有序列作为可迭代的 SeqRecord 返回。 load 方法的第二个参数 (True) 指示它从 NCBI blast 网站获取序列数据的分类详细信息,如果它在系统中尚不可用。

Line 14 :commit 提交事务。

Line 15 :close关闭数据库连接,销毁服务器句柄。

获取序列数据


让我们从 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_database 方法,然后按照如下指定提交:

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