Biopython - Módulo BioSQL

BioSQLes un esquema de base de datos genérico diseñado principalmente para almacenar secuencias y sus datos relacionados para todos los motores RDBMS. Está diseñado de tal manera que contiene los datos de todas las bases de datos bioinformáticas populares como GenBank, Swissport, etc. También se puede utilizar para almacenar datos internos.

BioSQL actualmente proporciona un esquema específico para las siguientes bases de datos:

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

También proporciona un soporte mínimo para bases de datos Derby y HSQLDB basadas en Java.

BioPython proporciona capacidades ORM muy simples, fáciles y avanzadas para trabajar con bases de datos basadas en BioSQL. BioPython provides a module, BioSQL para hacer la siguiente funcionalidad -

  • Crear / eliminar una base de datos BioSQL
  • Conéctese a una base de datos de BioSQL
  • Analice una base de datos de secuencias como GenBank, Swisport, BLAST result, Entrez result, etc., y cárguela directamente en la base de datos BioSQL
  • Obtenga los datos de la secuencia de la base de datos de BioSQL
  • Obtenga datos de taxonomía de NCBI BLAST y guárdelos en la base de datos BioSQL
  • Ejecute cualquier consulta SQL contra la base de datos BioSQL

Descripción general del esquema de la base de datos de BioSQL

Antes de profundizar en BioSQL, comprendamos los conceptos básicos del esquema de BioSQL. El esquema de BioSQL proporciona más de 25 tablas para contener datos de secuencia, función de secuencia, categoría de secuencia / ontología e información de taxonomía. Algunas de las tablas importantes son las siguientes:

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

Creación de una base de datos BioSQL

En esta sección, creemos una base de datos BioSQL de muestra, biosql, utilizando el esquema proporcionado por el equipo de BioSQL. Trabajaremos con la base de datos SQLite, ya que es muy fácil comenzar y no tiene una configuración compleja.

Aquí, crearemos una base de datos BioSQL basada en SQLite siguiendo los pasos a continuación.

Step 1 - Descargue el motor de base de datos SQLite e instálelo.

Step 2 - Descargue el proyecto BioSQL desde la URL de GitHub. https://github.com/biosql/biosql

Step 3 - Abra una consola y cree un directorio usando mkdir y entre en él.

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

Step 4 - Ejecute el siguiente comando para crear una nueva base de datos SQLite.

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

Step 5 - Copie el archivo biosqldb-sqlite.sql del proyecto BioSQL (/ sql / biosqldb-sqlite.sql`) y guárdelo en el directorio actual.

Step 6 - Ejecute el siguiente comando para crear todas las tablas.

sqlite> .read biosqldb-sqlite.sql

Ahora, todas las tablas se crean en nuestra nueva base de datos.

Step 7 - Ejecute el siguiente comando para ver todas las tablas nuevas en nuestra base de datos.

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>

Los primeros tres comandos son comandos de configuración para configurar SQLite para mostrar el resultado de forma formateada.

Step 8 - Copie el archivo GenBank de muestra, ls_orchid.gbk proporcionado por el equipo de BioPython https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk en el directorio actual y guárdelo como orchid.gbk.

Step 9 - Cree un script de Python, load_orchid.py usando el código siguiente y ejecútelo.

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

El código anterior analiza el registro en el archivo y lo convierte en objetos de Python y lo inserta en la base de datos de BioSQL. Analizaremos el código en una sección posterior.

Finalmente, creamos una nueva base de datos BioSQL y cargamos algunos datos de muestra en ella. Discutiremos las tablas importantes en el próximo capítulo.

Diagrama ER simple

biodatabase La tabla está en la parte superior de la jerarquía y su propósito principal es organizar un conjunto de datos de secuencia en un solo grupo / base de datos virtual. Every entry in the biodatabase refers to a separate database and it does not mingle with another database. Todas las tablas relacionadas en la base de datos BioSQL tienen referencias a la entrada de la base de datos biológica.

bioentryLa tabla contiene todos los detalles sobre una secuencia, excepto los datos de la secuencia. secuencia de datos de un particularbioentry será almacenado en biosequence mesa.

taxon y taxon_name son detalles de taxonomía y cada entrada hace referencia a esta tabla para especificar su información de taxón.

Después de comprender el esquema, veamos algunas consultas en la siguiente sección.

Consultas de BioSQL

Profundicemos en algunas consultas SQL para comprender mejor cómo se organizan los datos y cómo se relacionan las tablas entre sí. Antes de continuar, abramos la base de datos usando el siguiente comando y establezcamos algunos comandos de formato:

> 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. También puede utilizar cualquier editor de SQLite para ejecutar la consulta.

Enumere la base de datos de secuencia virtual disponible en el sistema como se indica a continuación:

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

Aquí, solo tenemos una base de datos, orchid.

Enumere las entradas (las 3 principales) disponibles en la base de datos orchid con el código dado a continuación

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>

Enumere los detalles de la secuencia asociados con una entrada (accesión - Z78530, nombre - gen del ARNr de C. fasciculatum 5.8S y ADN de ITS1 e ITS2) con el código dado -

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>

Obtenga la secuencia completa asociada con una entrada (accesión - Z78530, nombre - gen de ARNr de C. fasciculatum 5.8S y ADN de ITS1 e ITS2) usando el siguiente código -

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>

Listar taxón asociado con la base de datos biológica, orquídea

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>

Cargar datos en la base de datos BioSQL

Aprendamos cómo cargar datos de secuencia en la base de datos de BioSQL en este capítulo. Ya tenemos el código para cargar datos en la base de datos en la sección anterior y el código es el siguiente:

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

Veremos en profundidad cada línea del código y su propósito:

Line 1 - Carga el módulo SeqIO.

Line 2- Carga el módulo BioSeqDatabase. Este módulo proporciona toda la funcionalidad para interactuar con la base de datos BioSQL.

Line 3 - Módulo de carga del sistema operativo.

Line 5- open_database abre la base de datos especificada (db) con el controlador configurado (controlador) y devuelve un identificador a la base de datos BioSQL (servidor). Biopython admite bases de datos sqlite, mysql, postgresql y oracle.

Line 6-10- El método load_database_sql carga el sql desde el archivo externo y lo ejecuta. El método de confirmación confirma la transacción. Podemos omitir este paso porque ya creamos la base de datos con el esquema.

Line 12 - Los métodos new_database crean una nueva base de datos virtual, orchid y devuelve un identificador db para ejecutar el comando contra la base de datos de orchid.

Line 13- El método de carga carga las entradas de secuencia (SeqRecord iterable) en la base de datos de orquídeas. SqlIO.parse analiza la base de datos de GenBank y devuelve todas las secuencias en ella como SeqRecord iterable. El segundo parámetro (Verdadero) del método de carga le indica que obtenga los detalles de la taxonomía de los datos de secuencia del sitio web de NCBI blast, si aún no está disponible en el sistema.

Line 14 - confirmar confirma la transacción.

Line 15 - cerrar cierra la conexión de la base de datos y destruye el identificador del servidor.

Obtener los datos de la secuencia

Busquemos una secuencia con identificador, 2765658 de la base de datos de orquídeas como se muestra a continuación:

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

Aquí, el servidor ["orchid"] devuelve el identificador para recuperar datos de la base de datos virtualorchid. lookup El método proporciona una opción para seleccionar secuencias en función de los criterios y hemos seleccionado la secuencia con el identificador, 2765658. lookupdevuelve la información de secuencia como SeqRecordobject. Dado que ya sabemos cómo trabajar con SeqRecord`, es fácil obtener datos de él.

Eliminar una base de datos

Eliminar una base de datos es tan simple como llamar al método remove_database con el nombre de base de datos adecuado y luego confirmarlo como se especifica a continuación:

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