Biopython - BioSQL-Modul
BioSQList ein generisches Datenbankschema, das hauptsächlich zum Speichern von Sequenzen und den zugehörigen Daten für alle RDBMS-Engines entwickelt wurde. Es ist so konzipiert, dass es die Daten aus allen gängigen Bioinformatik-Datenbanken wie GenBank, Swissport usw. enthält. Es kann auch zum Speichern von internen Daten verwendet werden.
BioSQL bietet derzeit ein spezifisches Schema für die folgenden Datenbanken -
- MySQL (biosqldb-mysql.sql)
- PostgreSQL (biosqldb-pg.sql)
- Oracle (biosqldb-ora / *. Sql)
- SQLite (biosqldb-sqlite.sql)
Es bietet auch minimale Unterstützung für Java-basierte HSQLDB- und Derby-Datenbanken.
BioPython bietet sehr einfache, einfache und erweiterte ORM-Funktionen für die Arbeit mit BioSQL-basierten Datenbanken. BioPython provides a module, BioSQL um die folgende Funktionalität zu tun -
- Erstellen / Entfernen einer BioSQL-Datenbank
- Stellen Sie eine Verbindung zu einer BioSQL-Datenbank her
- Analysieren Sie eine Sequenzdatenbank wie GenBank, Swisport, BLAST-Ergebnis, Entrez-Ergebnis usw. und laden Sie sie direkt in die BioSQL-Datenbank
- Rufen Sie die Sequenzdaten aus der BioSQL-Datenbank ab
- Rufen Sie Taxonomiedaten von NCBI BLAST ab und speichern Sie sie in der BioSQL-Datenbank
- Führen Sie eine SQL-Abfrage für die BioSQL-Datenbank aus
Übersicht über das BioSQL-Datenbankschema
Bevor wir uns eingehend mit BioSQL befassen, sollten wir uns mit den Grundlagen des BioSQL-Schemas vertraut machen. Das BioSQL-Schema bietet mehr als 25 Tabellen für Sequenzdaten, Sequenzmerkmale, Sequenzkategorie / Ontologie und Taxonomieinformationen. Einige der wichtigen Tabellen lauten wie folgt:
- biodatabase
- bioentry
- biosequence
- seqfeature
- taxon
- taxon_name
- antology
- term
- dxref
Erstellen einer BioSQL-Datenbank
In diesem Abschnitt erstellen wir eine BioSQL-Beispieldatenbank, biosql, unter Verwendung des vom BioSQL-Team bereitgestellten Schemas. Wir werden mit der SQLite-Datenbank arbeiten, da der Einstieg sehr einfach ist und keine komplexe Einrichtung aufweist.
Hier erstellen wir eine SQLite-basierte BioSQL-Datenbank mit den folgenden Schritten.
Step 1 - Laden Sie die SQLite-Datenbank-Engine herunter und installieren Sie sie.
Step 2 - Laden Sie das BioSQL-Projekt von der GitHub-URL herunter. https://github.com/biosql/biosql
Step 3 - Öffnen Sie eine Konsole, erstellen Sie mit mkdir ein Verzeichnis und geben Sie es ein.
cd /path/to/your/biopython/sample
mkdir sqlite-biosql
cd sqlite-biosql
Step 4 - Führen Sie den folgenden Befehl aus, um eine neue SQLite-Datenbank zu erstellen.
> sqlite3.exe mybiosql.db
SQLite version 3.25.2 2018-09-25 19:08:10
Enter ".help" for usage hints.
sqlite>
Step 5 - Kopieren Sie die Datei biosqldb-sqlite.sql aus dem BioSQL-Projekt (/ sql / biosqldb-sqlite.sql`) und speichern Sie sie im aktuellen Verzeichnis.
Step 6 - Führen Sie den folgenden Befehl aus, um alle Tabellen zu erstellen.
sqlite> .read biosqldb-sqlite.sql
Jetzt werden alle Tabellen in unserer neuen Datenbank erstellt.
Step 7 - Führen Sie den folgenden Befehl aus, um alle neuen Tabellen in unserer Datenbank anzuzeigen.
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>
Die ersten drei Befehle sind Konfigurationsbefehle zum Konfigurieren von SQLite, um das Ergebnis formatiert anzuzeigen.
Step 8 - Kopieren Sie die vom BioPython-Team bereitgestellte GenBank-Beispieldatei ls_orchid.gbk https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk in das aktuelle Verzeichnis und speichern Sie es als orchid.gbk.
Step 9 - Erstellen Sie ein Python-Skript, load_orchid.py, mit dem folgenden Code und führen Sie es aus.
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()
Der obige Code analysiert den Datensatz in der Datei, konvertiert ihn in Python-Objekte und fügt ihn in die BioSQL-Datenbank ein. Wir werden den Code im späteren Abschnitt analysieren.
Schließlich haben wir eine neue BioSQL-Datenbank erstellt und einige Beispieldaten in diese geladen. Wir werden die wichtigen Tabellen im nächsten Kapitel diskutieren.
Einfaches ER-Diagramm
biodatabase Die Tabelle befindet sich oben in der Hierarchie und dient hauptsächlich dazu, einen Satz von Sequenzdaten in einer einzelnen Gruppe / virtuellen Datenbank zu organisieren. Every entry in the biodatabase refers to a separate database and it does not mingle with another database. Alle zugehörigen Tabellen in der BioSQL-Datenbank enthalten Verweise auf den Eintrag in die Biodatabase.
bioentryDie Tabelle enthält alle Details zu einer Sequenz mit Ausnahme der Sequenzdaten. Sequenzdaten eines bestimmtenbioentry wird gespeichert in biosequence Tabelle.
taxon und taxon_name sind Taxonomiedetails und jeder Eintrag verweist auf diese Tabelle, um seine Taxoninformationen anzugeben.
Nachdem wir das Schema verstanden haben, wollen wir uns im nächsten Abschnitt einige Fragen ansehen.
BioSQL-Abfragen
Lassen Sie uns einige SQL-Abfragen untersuchen, um besser zu verstehen, wie die Daten organisiert sind und die Tabellen miteinander in Beziehung stehen. Bevor Sie fortfahren, öffnen wir die Datenbank mit dem folgenden Befehl und legen einige Formatierungsbefehle fest.
> 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. Sie können die Abfrage auch mit einem beliebigen SQLite-Editor ausführen.
Listen Sie die im System verfügbare virtuelle Sequenzdatenbank wie folgt auf:
select
*
from
biodatabase;
*** Result ***
sqlite> .width 15 15 15 15
sqlite> select * from biodatabase;
biodatabase_id name authority description
--------------- --------------- --------------- ---------------
1 orchid
sqlite>
Hier haben wir nur eine Datenbank, orchid.
Listen Sie die in der Datenbank verfügbaren Einträge (Top 3) auf orchid mit dem unten angegebenen Code
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>
Listen Sie die mit einem Eintrag verbundenen Sequenzdetails (Zugang - Z78530, Name - C. fasciculatum 5.8S rRNA-Gen und ITS1- und ITS2-DNA) mit dem angegebenen Code auf -
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>
Holen Sie sich die vollständige Sequenz, die einem Eintrag zugeordnet ist (Zugang - Z78530, Name - C. fasciculatum 5.8S rRNA-Gen und ITS1- und ITS2-DNA), unter Verwendung des folgenden Codes:
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>
Liste Taxon mit Bio-Datenbank, Orchidee verbunden
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>
Laden Sie Daten in die BioSQL-Datenbank
In diesem Kapitel erfahren Sie, wie Sie Sequenzdaten in die BioSQL-Datenbank laden. Wir haben bereits den Code zum Laden von Daten in die Datenbank im vorherigen Abschnitt und der Code lautet wie folgt:
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()
Wir werden uns jede Zeile des Codes und seinen Zweck genauer ansehen -
Line 1 - Lädt das SeqIO-Modul.
Line 2- Lädt das BioSeqDatabase-Modul. Dieses Modul bietet alle Funktionen für die Interaktion mit der BioSQL-Datenbank.
Line 3 - Lädt das OS-Modul.
Line 5- open_database öffnet die angegebene Datenbank (db) mit dem konfigurierten Treiber (Treiber) und gibt ein Handle an die BioSQL-Datenbank (Server) zurück. Biopython unterstützt SQLite-, MySQL-, Postgresql- und Oracle-Datenbanken.
Line 6-10- Die Methode load_database_sql lädt die SQL aus der externen Datei und führt sie aus. Die Commit-Methode schreibt die Transaktion fest. Wir können diesen Schritt überspringen, da wir die Datenbank bereits mit Schema erstellt haben.
Line 12 - new_database-Methoden erstellen eine neue virtuelle Datenbank, Orchidee und geben eine Handle-Datenbank zurück, um den Befehl für die Orchideendatenbank auszuführen.
Line 13- Die Methode load lädt die Sequenzeinträge (iterable SeqRecord) in die Orchideendatenbank. SqlIO.parse analysiert die GenBank-Datenbank und gibt alle darin enthaltenen Sequenzen als iterierbaren SeqRecord zurück. Der zweite Parameter (True) der Lademethode weist sie an, die Taxonomiedetails der Sequenzdaten von der NCBI-Explosionswebsite abzurufen, sofern diese nicht bereits im System verfügbar sind.
Line 14 - Commit schreibt die Transaktion fest.
Line 15 - close schließt die Datenbankverbindung und zerstört das Serverhandle.
Holen Sie sich die Sequenzdaten
Lassen Sie uns eine Sequenz mit der Kennung 2765658 aus der Orchideendatenbank wie folgt abrufen -
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))
Hier gibt Server ["Orchidee"] das Handle zurück, um Daten aus der virtuellen Datenbankorchid abzurufen. lookup Methode bietet eine Option zur Auswahl von Sequenzen basierend auf Kriterien und wir haben die Sequenz mit der Kennung 2765658 ausgewählt. lookupGibt die Sequenzinformationen als SeqRecordobject zurück. Da wir bereits wissen, wie man mit SeqRecord arbeitet, ist es einfach, Daten daraus zu erhalten.
Entfernen Sie eine Datenbank
Das Entfernen einer Datenbank ist so einfach wie das Aufrufen der Methode remove_database mit dem richtigen Datenbanknamen und das anschließende Festschreiben wie unten angegeben.
from BioSQL import BioSeqDatabase
server = BioSeqDatabase.open_database(driver = 'sqlite3', db = "orchid.db")
server.remove_database("orchids")
server.commit()