- Biopython 教程
- Biopython - 首页
- Biopython - 简介
- Biopython - 安装
- 创建简单的应用程序
- Biopython - 序列
- 高级序列操作
- 序列 I/O 操作
- Biopython - 序列比对
- Biopython - BLAST 概述
- Biopython - Entrez 数据库
- Biopython - PDB 模块
- Biopython - 基序对象
- Biopython - BioSQL 模块
- Biopython - 群体遗传学
- Biopython - 基因组分析
- Biopython - 表型微阵列
- Biopython - 绘图
- Biopython - 聚类分析
- Biopython - 机器学习
- Biopython - 测试技术
- Biopython 资源
- Biopython - 快速指南
- Biopython - 有用资源
- Biopython - 讨论
Biopython - BioSQL 模块
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 提供了一个名为 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 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 项目复制 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 复制到当前目录 https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/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 条目。
bioentry 表保存序列的所有详细信息,除了序列数据本身。特定bioentry 的序列数据将存储在biosequence 表中。
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>
这里,我们只有一个数据库,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>
列出与生物数据库 orchid 关联的分类单元
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 打开指定的数据库 (db),并使用配置的驱动程序 (driver),并返回到 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 关闭数据库连接并销毁服务器句柄。
获取序列数据
让我们从 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 将序列信息作为 SeqRecord 对象返回。由于我们已经知道如何使用 SeqRecord,因此很容易从中获取数据。
删除数据库
删除数据库就像使用正确的数据库名称调用 remove_database 方法然后提交它一样简单,如下所示:
from BioSQL import BioSeqDatabase server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db") server.remove_database("orchids") server.commit()