在 GitHub 上編輯此頁面

使用 BioSQL 模組管理本地生物資料庫。

BioSQLOBF 專案 (BioPerl、BioJava 等) 之間的共同努力,旨在支援用於儲存序列資料的共享資料庫綱要。理論上,您可以使用 BioPerl 將 GenBank 檔案載入資料庫,然後使用 Biopython 從資料庫中提取此資料作為具有特徵的記錄物件 — 並且獲得與直接使用 SeqIO 將 GenBank 檔案載入為 SeqRecord 幾乎相同的結果。

我們有一些現有的文件(HTMLPDF)介紹了 Biopython 與 BioSQL 的介面,涵蓋了安裝 Python 資料庫適配器以及 BioSQL 的基本用法。這些文件有點舊了,我希望未來能夠使用這個 Wiki 頁面來更新上述文件。

以下文字適用於 Biopython 1.64 或更新版本 (並假設使用 Python 3)。

安裝

這相當複雜 - 部分原因是選項太多了。例如,您可以使用各種不同的 SQL 資料庫套件(我們將重點關注 MySQL),您可以將資料庫放在您自己的電腦上(此處的假設)或放在單獨的伺服器上,當然,資料庫還會關聯使用者名稱和密碼。最後,詳細資訊還會因您的作業系統而異。

此文字部分基於 BioSQL 綱要安裝說明,其中也涵蓋了 MySQL 的替代方案。

安裝所需的軟體

您需要安裝一些資料庫軟體以及相關的 Python 程式庫,以便 Biopython 可以與資料庫「交談」。在此範例中,我們將討論最常見的選擇 MySQL。您如何執行此操作也將取決於您的作業系統,例如在 Debian 或 Ubuntu Linux 機器上,請嘗試以下操作

sudo apt install mysql-common mysql-server python3-mysqldb

登入需要密碼。請參閱 MySQL 文件

Python 也需要資料庫驅動程式才能存取 MySQL 資料庫。在您的虛擬環境中

pip install mysql-connector-python

擁有 perl (來執行一些設定腳本) 也很重要。同樣,在 Debian 或 Ubuntu Linux 機器上,請嘗試以下操作

sudo apt-get install perl

您可能會發現 perl 已經安裝好了。

對於 Windows 使用者,請參閱 Windows 上的 BioSQL

下載 BioSQL 綱要和腳本

安裝軟體後,您的下一個任務是設定資料庫並匯入 BioSQL 綱要 (即在資料庫中設定相關的表格)。請參閱 BioSQL 下載 – 您需要解壓縮封存檔。

或者,若要取得最新的 BioSQL,請檢視他們的 git 儲存庫。或者,導覽至您的資料庫的相關綱要檔案並僅下載該檔案,例如 MySQL 的 biosqldb-mysql.sql。您也會需要 NCBI 分類載入 perl 腳本 load_ncbi_taxonomy.pl

建立空的資料庫

MySQL

以下命令列應該會在您自己的電腦上建立一個名為 *bioseqdb* 的新資料庫,該資料庫屬於 *root* 使用者帳戶

mysqladmin -u root -p create biosqldb

然後,我們可以告知 MySQL 載入我們上面下載的 BioSQL 綱要。從解壓縮的 BioSQL 下載中變更為 scripts 子目錄,然後

mysql -u root -p bioseqdb < biosqldb-mysql.sql

您可以使用 mysql 命令列工具快速執行操作,例如

mysql --user=root -p bioseqdb -e "show tables"

給出

+----------------------------+
| Tables_in_bioseqdb         |
+----------------------------+
| biodatabase                |
| bioentry                   |
| bioentry_dbxref            |
| bioentry_path              |
| bioentry_qualifier_value   |
| bioentry_reference         |
| bioentry_relationship      |
| biosequence                |
| comment                    |
| dbxref                     |
| dbxref_qualifier_value     |
| location                   |
| location_qualifier_value   |
| ontology                   |
| reference                  |
| seqfeature                 |
| seqfeature_dbxref          |
| seqfeature_path            |
| seqfeature_qualifier_value |
| seqfeature_relationship    |
| taxon                      |
| taxon_name                 |
| term                       |
| term_dbxref                |
| term_path                  |
| term_relationship          |
| term_relationship_term     |
| term_synonym               |
+----------------------------+

或者,若要查看表格內部

mysql --user=root -p bioseqdb -e "select * from bioentry;"

由於表格是空的,因此這應不會傳回任何列。

PostgreSQL

PostgreSQL 使用者的重要注意事項:在將 biosqldb-pg.sql 綱要載入 Postgres 之前,您必須刪除名為 rule_bioentry_i1rule_bioentry_i2 的兩個 RULES;biosqldb-pg.sql BioSQL 版本 1.0.1 中的第 771-791 行

首先,您需要設定使用者權限,如果您不確定如何執行此操作,請嘗試

su - postgres
createuser <your user name>

然後,假設您以以下身分登入並且 Postgres 正在本機電腦上執行,您應該能夠執行以下操作

createdb biosqldb
psql biosqldb < biosqldb-pg.sql

執行 *psql* 並輸入 enter *\d* 以查看所有建立的實體。

NCBI 分類

BioSQL 套件包含 scripts/load_ncbi_taxonomy.pl 下的 perl 腳本,可下載和更新分類表格。該腳本應該能夠自動從 NCBI 分類 FTP 網站 下載其所需檔案。

在 Biopython 1.49 之前,如果您想使用 NCBI 分類資料庫,最好在開始將序列載入資料庫之前預先載入 NCBI 分類。對於 Biopython 1.49 以後的版本,這並不那麼重要,您可以選擇從 Entrez 視需要下載所需的資訊。

若要更新 NCBI 分類,請從解壓縮的 BioSQL 下載中變更為 scripts 子目錄,然後

./load_ncbi_taxonomy.pl --dbname bioseqdb --driver mysql --dbuser root --download true

對於 PostgreSQL,您需要安裝 perl DBD-Pg 模組 - 使用 CPAN:「perl -MCPAN -e ‘install DBI’; perl -MCPAN -e ‘install DBD::Pg’」。在上述命令中,將 *Pg* 替換為 *mysql*。

需要提取大約 10MB 的資料,因此可能需要一點時間 (並且在發生這種情況時不會提供任何回饋)。如果您擔心,請開啟檔案瀏覽器視窗並檢查以查看它是否將名為 taxdump.tar.gz 的檔案下載到 taxdata 子目錄。

您應該會在命令提示字元中看到此輸出 - 請注意,其中某些步驟確實需要一些時間 (尤其是 *重建巢狀設定左右值*)

Loading NCBI taxon database in taxdata:
        ... retrieving all taxon nodes in the database
        ... reading in taxon nodes from nodes.dmp
        ... insert / update / delete taxon nodes
        ... (committing nodes)
        ... rebuilding nested set left/right values
        ... reading in taxon names from names.dmp
        ... deleting old taxon names
        ... inserting new taxon names
        ... cleaning up
Done.

這可能是休息一下喝杯茶的好時機 - 我沒有計時,但超過了十分鐘。

填入初始表格後,重新執行腳本的速度會快得多。您可以再次執行此腳本來更新分類表格,NCBI 會定期將其新增至表格。您可能想要設定排定的作業來自動執行此操作 (例如每兩週一次)。

附註:如果您將使用分類表格中的左右值,則最好執行更新分類的操作(另請參閱 BioSQL 增強請求 GitHub 問題 14 (Redmine 2493))。Biopython 1.67 以後的版本在寫入分類表格時會執行此操作。

請注意,Biopython 在載入或擷取序列時會忽略這些選用欄位 - 而僅使用父連結。有關這種替代樹狀結構表示方式的更多資訊,請參閱 http://www.oreillynet.com/pub/a/network/2002/11/27/bioconf.html

執行單元測試

因為您設定 BioSQL 資料庫的方式太多了,所以您必須透過編輯檔案 Tests/setup_BioSQL.py 並填入以下欄位來告訴單元測試一些資訊

DBDRIVER = "mysql.connector"
DBTYPE = "mysql"

以及下方一點點的欄位,

DBHOST = "localhost"
DBUSER = "root"
DBPASSWD = "your-password"
TESTDB = "biosql_test"

變更這些以符合您的設定。然後,您可以像往常一樣執行 BioSQL 單元測試,例如

python run_tests.py test_BioSQL test_BioSQL_SeqIO

對於 PostgreSQL,請使用

DBDRIVER = "psycopg2"
DBTYPE = "pg"

建立 (子) 資料庫

BioSQL 可讓我們在單個 SQL 資料庫 (我們之前稱為 *bioseqdb*) 中定義已命名的「子」資料庫或「命名空間」。在此範例中,讓我們為一些蘭花序列建立一個資料庫

from BioSQL import BioSeqDatabase

server = BioSeqDatabase.open_database(
    driver="mysql.connector",
    user="root",
    passwd="your-password",
    host="localhost",
    db="bioseqdb",
)
db = server.new_database("orchids", description="Just for testing")
server.commit()

(如果您使用的是 PostgreSQL 而不是 MySQL,只需將驅動程式引數變更為「psycopg2」即可。這同樣適用於本文檔中的其他範例)

commit 呼叫會告知資料庫儲存到目前為止的變更 (提交 SQL 交易)。您可以自行決定何時提交 SQL 交易和/或復原變更,而不是讓 Biopython 嘗試為您決定並冒險出錯。請參閱顯式優於隱式 (Python 之禪)。

現在,在 *biodatabase* 表格中應該會有一列代表我們新的蘭花命名空間。您可以在命令列檢查這一點

MySQL

mysql --user=root -p bioseqdb -e "select * from biodatabase;"

PostgreSQL

psql -c "SELECT * FROM biodatabase;" bioseqdb

這應該會顯示如下內容 (假設您尚未執行任何其他測試)

+----------------+---------+-----------+------------------+
| biodatabase_id | name    | authority | description      |
+----------------+---------+-----------+------------------+
|              1 | orchids | NULL      | Just for testing |
+----------------+---------+-----------+------------------+

現在,我們已在 *biosqldb* MySQL 資料庫中設定了 *orchids* 命名空間,讓我們將一些序列新增至其中。

將序列載入資料庫

當使用 Biopython 將序列載入 BioSQL 資料庫時,我們必須提供已加上註解的 SeqRecord 物件。這讓我們有另一個使用 SeqIO 模組的理由!快速回顧一下如何將序列讀入為 SeqRecord,基於 Biopython 教學課程中的蘭花範例之一

from Bio import Entrez
from Bio import SeqIO

handle = Entrez.efetch(
    db="nuccore", id="6273291,6273290,6273289", rettype="gb", retmode="text"
)
for seq_record in SeqIO.parse(handle, "genbank"):
    print(seq_record.id, seq_record.description[:50] + "...")
    print("Sequence length %i," % len(seq_record.seq))
    print("from: %s" % seq_record.annotations["source"])
handle.close()

預期的輸出如下,請注意我們有三筆記錄,總共有九個特徵

AF191665.1 Opuntia marenae rpl16 gene; chloroplast gene for c...
Sequence length 902, 3 features, from: chloroplast Opuntia marenae
AF191664.1 Opuntia clavata rpl16 gene; chloroplast gene for c...
Sequence length 899, 3 features, from: chloroplast Grusonia clavata
AF191663.1 Opuntia bradtiana rpl16 gene; chloroplast gene for...
Sequence length 899, 3 features, from: chloroplast Opuntia bradtianaa

現在,讓我們將這三筆記錄新增至新的 (空的) *orchid* 資料庫,而不是在螢幕上列印內容

from Bio import Entrez
from Bio import SeqIO
from BioSQL import BioSeqDatabase

server = BioSeqDatabase.open_database(
    driver="mysql.connector",
    user="root",
    passwd="your-password",
    host="localhost",
    db="bioseqdb",
)
db = server["orchids"]
handle = Entrez.efetch(
    db="nuccore", id="6273291,6273290,6273289", rettype="gb", retmode="text"
)
count = db.load(SeqIO.parse(handle, "genbank"))
print("Loaded %i records" % count)
server.commit()

同樣地,您必須明確呼叫 *commit* 以記錄 SQL 交易,否則該交易會保持擱置狀態。

db.load() 函式應已傳回載入的記錄數 (在此範例中為三個),並且再次檢視資料庫,您應該會在幾個表格中看到新列。

bioentry 和 *biosequence* 表格應具有三個新列

mysql --user=root bioseqdb -e "select * from bioentry;"
mysql --user=root bioseqdb -e "select * from biosequence;"

還應該有九個新特徵

mysql --user=root -p bioseqdb -e "select * from seqfeature;"

接下來,我們將嘗試從資料庫中將這三筆記錄載入回去。

從資料庫中擷取序列

這會接續上一個範例,其中我們將三筆記錄載入 *orchids* 資料庫 (命名空間)

from BioSQL import BioSeqDatabase

server = BioSeqDatabase.open_database(
    driver="mysql.connector",
    user="root",
    passwd="your-password",
    host="localhost",
    db="bioseqdb",
)
db = server["orchids"]
for identifier in ["6273291", "6273290", "6273289"]:
    seq_record = db.lookup(gi=identifier)
    print(seq_record.id, seq_record.description[:50] + "...")
    print("Sequence length %i," % len(seq_record.seq))

給出

AF191665.1 Opuntia marenae rpl16 gene; chloroplast gene for c...
Sequence length 902
AF191664.1 Opuntia clavata rpl16 gene; chloroplast gene for c...
Sequence length 899
AF191663.1 Opuntia bradtiana rpl16 gene; chloroplast gene for...
Sequence length 899

您從 BioSQL 取回的物件的作用方式類似於以 Seq 物件作為序列的 SeqRecord 物件,但它們並不完全相同。您實際上會獲得它們的 BioSQL 資料庫等價物,即以 DBSeq 物件作為序列的 DBSeqRecord 物件。這些只會根據需求從資料庫載入序列和註解。

還有其他方法可以提取記錄 - 此處的 'db' 物件的作用有點像字典 (包括支援從其索引鍵中刪除項目)。python 字典索引鍵實際上是資料庫內部用於 bioentry 表格的資料庫主要索引鍵。例如

from BioSQL import BioSeqDatabase

server = BioSeqDatabase.open_database(
    driver="mysql.connector",
    user="root",
    passwd="your-password",
    host="localhost",
    db="bioseqdb",
)
db = server["orchids"]
print("This database contains %i records" % len(db))
for key, record in db.iteritems():
    print("Key %r maps to a sequence record with id %s" % (key, record.id))

刪除 (子) 資料庫

如前所述,BioSQL 允許我們在單一 SQL 資料庫(我們稱之為 bioseqdb)內定義具名的「子」資料庫(又稱命名空間)。在先前的範例中,我們為一些蘭花序列建立了一個子資料庫。以下程式碼將刪除 orchid 資料庫(以及其中的所有紀錄)。

from BioSQL import BioSeqDatabase

server = BioSeqDatabase.open_database(
    driver="mysql.connector",
    user="root",
    passwd="your-password",
    host="localhost",
    db="bioseqdb",
)
server.remove_database("orchids")
server.commit()

再次強調,您必須明確地使用 commit 完成 SQL 交易,才能套用此變更。

現在 biodatabase 表格中應該少了一列,請在命令列中檢查。

mysql --user=root -p bioseqdb -e "select * from biodatabase;"

您也可以檢查其他表格中是否已刪除三個蘭花序列。

資料是如何儲存的?

如果您需要或想要直接存取資料,略過 Biopython 方法來檢索記錄,那麼了解底層表格的使用方式將會很有幫助。為此,我們建議您參考 BioSQL 文件,從他們的綱要概觀和關於註解映射的頁面開始。

MySQL 提示與技巧

如果您遇到逾時錯誤,請檢查您的 SQL 伺服器是否有任何孤立的執行緒。

mysql --user=root -p bioseqdb -e "SHOW INNODB STATUS\G" | grep "thread id"

如果有,假設您是唯一使用此資料庫的人,您可以嘗試使用上述命令給出的執行緒 ID 來終止它們。

mysql --user=root -p bioseqdb -e "KILL 123;"

請自行承擔風險!