Biopython - Modulo BioSQL

BioSQLè uno schema di database generico progettato principalmente per memorizzare sequenze e dati correlati per tutti i motori RDBMS. È progettato in modo tale da contenere i dati di tutti i database bioinformatici più diffusi come GenBank, Swissport, ecc. Può essere utilizzato anche per archiviare dati interni.

BioSQL attualmente fornisce uno schema specifico per i database seguenti:

  • MySQL (biosqldb-mysql.sql)
  • PostgreSQL (biosqldb-pg.sql)
  • Oracle (biosqldb-ora / *. Sql)
  • SQLite (biosqldb-sqlite.sql)

Fornisce inoltre un supporto minimo per i database HSQLDB e Derby basati su Java.

BioPython fornisce funzionalità ORM molto semplici, facili e avanzate per lavorare con database basati su BioSQL. BioPython provides a module, BioSQL per eseguire le seguenti funzionalità:

  • Crea / rimuovi un database BioSQL
  • Connettiti a un database BioSQL
  • Analizza un database di sequenze come GenBank, Swisport, BLAST result, Entrez result, ecc. E caricalo direttamente nel database BioSQL
  • Recupera i dati della sequenza dal database BioSQL
  • Recupera i dati della tassonomia da NCBI BLAST e memorizzali nel database BioSQL
  • Esegui qualsiasi query SQL sul database BioSQL

Panoramica dello schema del database BioSQL

Prima di approfondire il BioSQL, comprendiamo le basi dello schema BioSQL. Lo schema BioSQL fornisce oltre 25 tabelle per contenere dati di sequenza, funzionalità di sequenza, categoria / ontologia di sequenza e informazioni sulla tassonomia. Alcune delle tabelle importanti sono le seguenti:

  • biodatabase
  • bioentry
  • biosequence
  • seqfeature
  • taxon
  • taxon_name
  • antology
  • term
  • dxref

Creazione di un database BioSQL

In questa sezione, creiamo un database BioSQL di esempio, biosql utilizzando lo schema fornito dal team BioSQL. Lavoreremo con il database SQLite poiché è molto facile iniziare e non ha una configurazione complessa.

Qui creeremo un database BioSQL basato su SQLite utilizzando i passaggi seguenti.

Step 1 - Scarica il motore di database SQLite e installalo.

Step 2 - Scarica il progetto BioSQL dall'URL di GitHub. https://github.com/biosql/biosql

Step 3 - Apri una console e crea una directory usando mkdir ed entra in essa.

cd /path/to/your/biopython/sample 
mkdir sqlite-biosql 
cd sqlite-biosql

Step 4 - Esegui il comando seguente per creare un nuovo database SQLite.

> sqlite3.exe mybiosql.db 
SQLite version 3.25.2 2018-09-25 19:08:10 
Enter ".help" for usage hints. 
sqlite>

Step 5 - Copia il file biosqldb-sqlite.sql dal progetto BioSQL (/ sql / biosqldb-sqlite.sql`) e memorizzalo nella directory corrente.

Step 6 - Esegui il comando seguente per creare tutte le tabelle.

sqlite> .read biosqldb-sqlite.sql

Ora, tutte le tabelle vengono create nel nostro nuovo database.

Step 7 - Esegui il comando seguente per vedere tutte le nuove tabelle nel nostro database.

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>

I primi tre comandi sono comandi di configurazione per configurare SQLite per mostrare il risultato in modo formattato.

Step 8 - Copia il file GenBank di esempio, ls_orchid.gbk fornito dal team di BioPython https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk nella directory corrente e salvarlo come orchid.gbk.

Step 9 - Crea uno script python, load_orchid.py usando il codice seguente ed eseguilo.

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()

Il codice sopra analizza il record nel file e lo converte in oggetti Python e lo inserisce nel database BioSQL. Analizzeremo il codice nella sezione successiva.

Infine, abbiamo creato un nuovo database BioSQL e vi abbiamo caricato alcuni dati di esempio. Discuteremo le tabelle importanti nel prossimo capitolo.

Schema ER semplice

biodatabase table è in cima alla gerarchia e il suo scopo principale è organizzare una serie di dati di sequenza in un singolo gruppo / database virtuale. Every entry in the biodatabase refers to a separate database and it does not mingle with another database. Tutte le tabelle correlate nel database BioSQL hanno riferimenti alla voce del biodatabase.

bioentrytabella contiene tutti i dettagli su una sequenza tranne i dati della sequenza. dati di sequenza di un particolarebioentry verrà memorizzato in biosequence tavolo.

taxon e taxon_name sono dettagli della tassonomia e ogni voce fa riferimento a questa tabella per specificare le informazioni sul taxon.

Dopo aver compreso lo schema, esaminiamo alcune query nella sezione successiva.

Query BioSQL

Approfondiamo alcune query SQL per capire meglio come sono organizzati i dati e le tabelle sono correlate tra loro. Prima di procedere, apriamo il database utilizzando il comando seguente e impostiamo alcuni comandi di formattazione:

> 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. È inoltre possibile utilizzare qualsiasi editor SQLite per eseguire la query.

Elenca il database delle sequenze virtuali disponibile nel sistema come indicato di seguito:

select 
   * 
from 
   biodatabase;
*** Result ***
sqlite> .width 15 15 15 15 
sqlite> select * from biodatabase; 
biodatabase_id       name        authority       description    
---------------  --------------- --------------- --------------- 
1                   orchid 
sqlite>

Qui abbiamo un solo database, orchid.

Elenca le voci (prime 3) disponibili nel database orchid con il codice indicato di seguito

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>

Elenca i dettagli della sequenza associati a una voce (accession - Z78530, name - C. fasciculatum 5.8S rRNA gene and ITS1 and ITS2 DNA) with the given code -

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>

Ottieni la sequenza completa associata a una voce (accessione - Z78530, nome - gene rRNA C. fasciculatum 5.8S e DNA ITS1 e ITS2) utilizzando il codice seguente -

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>

Elenca il taxon associato al database bio, orchidea

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>

Carica i dati nel database BioSQL

Impariamo come caricare i dati di sequenza nel database BioSQL in questo capitolo. Abbiamo già il codice per caricare i dati nel database nella sezione precedente e il codice è il seguente:

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()

Daremo uno sguardo più approfondito a ogni riga del codice e al suo scopo:

Line 1 - Carica il modulo SeqIO.

Line 2- Carica il modulo BioSeqDatabase. Questo modulo fornisce tutte le funzionalità per interagire con il database BioSQL.

Line 3 - Carica il modulo del sistema operativo.

Line 5- open_database apre il database specificato (db) con il driver configurato (driver) e restituisce un handle al database BioSQL (server). Biopython supporta i database sqlite, mysql, postgresql e Oracle.

Line 6-10- Il metodo load_database_sql carica sql dal file esterno e lo esegue. Il metodo commit esegue il commit della transazione. Possiamo saltare questo passaggio perché abbiamo già creato il database con lo schema.

Line 12 - i metodi new_database creano un nuovo database virtuale, orchid e restituiscono un handle db per eseguire il comando sul database orchid.

Line 13- Il metodo load carica le voci della sequenza (SeqRecord iterabile) nel database dell'orchidea. SqlIO.parse analizza il database GenBank e restituisce tutte le sequenze in esso contenute come SeqRecord iterabile. Il secondo parametro (True) del metodo di caricamento indica di recuperare i dettagli della tassonomia dei dati della sequenza dal sito Web NCBI Blast, se non è già disponibile nel sistema.

Line 14 - commit esegue il commit della transazione.

Line 15 - close chiude la connessione al database e distrugge l'handle del server.

Recupera i dati della sequenza

Andiamo a prendere una sequenza con identificatore, 2765658 dal database orchidea come di seguito -

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))

Qui, il server ["orchid"] restituisce l'handle per recuperare i dati dal database virtualeorchid. lookup fornisce un'opzione per selezionare le sequenze in base a criteri e abbiamo selezionato la sequenza con identificatore, 2765658. lookuprestituisce le informazioni sulla sequenza come SeqRecordobject. Poiché sappiamo già come lavorare con SeqRecord`, è facile ottenere dati da esso.

Rimuovi un database

La rimozione di un database è semplice come chiamare il metodo remove_database con il nome del database corretto e quindi eseguirne il commit come specificato di seguito -

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