Biopython - moduł BioSQL

BioSQLto ogólny schemat bazy danych przeznaczony głównie do przechowywania sekwencji i powiązanych z nimi danych dla wszystkich silników RDBMS. Został zaprojektowany w taki sposób, że przechowuje dane ze wszystkich popularnych baz danych bioinformatycznych, takich jak GenBank, Swissport itp. Może być również używany do przechowywania danych wewnętrznych.

BioSQL obecnie zapewnia określony schemat dla poniższych baz danych -

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

Zapewnia również minimalne wsparcie dla baz danych HSQLDB i Derby opartych na języku Java.

BioPython zapewnia bardzo proste, łatwe i zaawansowane możliwości ORM do pracy z bazą danych opartą na BioSQL. BioPython provides a module, BioSQL wykonać następującą funkcjonalność -

  • Utwórz / usuń bazę danych BioSQL
  • Połącz się z bazą danych BioSQL
  • Przeanalizuj bazę danych sekwencji, taką jak GenBank, Swisport, wynik BLAST, wynik Entrez itp., I załaduj ją bezpośrednio do bazy danych BioSQL
  • Pobierz dane sekwencji z bazy danych BioSQL
  • Pobierz dane taksonomii z NCBI BLAST i przechowuj je w bazie danych BioSQL
  • Uruchom dowolne zapytanie SQL w bazie danych BioSQL

Omówienie schematu bazy danych BioSQL

Zanim zagłębimy się w BioSQL, pozwól nam zrozumieć podstawy schematu BioSQL. Schemat BioSQL zapewnia ponad 25 tabel do przechowywania danych sekwencji, cech sekwencji, kategorii / ontologii sekwencji i informacji taksonomicznych. Oto niektóre z ważnych tabel -

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

Tworzenie bazy danych BioSQL

W tej sekcji stwórzmy przykładową bazę danych BioSQL, biosql przy użyciu schematu dostarczonego przez zespół BioSQL. Będziemy pracować z bazą danych SQLite, ponieważ jest naprawdę łatwa do rozpoczęcia i nie ma skomplikowanej konfiguracji.

W tym miejscu utworzymy bazę danych BioSQL opartą na SQLite, wykonując poniższe kroki.

Step 1 - Pobierz silnik bazy danych SQLite i zainstaluj go.

Step 2 - Pobierz projekt BioSQL z adresu URL GitHub. https://github.com/biosql/biosql

Step 3 - Otwórz konsolę i utwórz katalog za pomocą mkdir i wejdź do niego.

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

Step 4 - Uruchom poniższe polecenie, aby utworzyć nową bazę danych SQLite.

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

Step 5 - Skopiuj plik biosqldb-sqlite.sql z projektu BioSQL (/ sql / biosqldb-sqlite.sql`) i zapisz go w bieżącym katalogu.

Step 6 - Uruchom poniższe polecenie, aby utworzyć wszystkie tabele.

sqlite> .read biosqldb-sqlite.sql

Teraz wszystkie tabele są tworzone w naszej nowej bazie danych.

Step 7 - Uruchom poniższe polecenie, aby wyświetlić wszystkie nowe tabele w naszej bazie danych.

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>

Pierwsze trzy polecenia to polecenia konfiguracyjne służące do skonfigurowania programu SQLite w celu wyświetlenia wyniku w sformatowany sposób.

Step 8 - Skopiuj przykładowy plik GenBank, ls_orchid.gbk dostarczony przez zespół BioPython https://raw.githubusercontent.com/biopython/biopython/master/Doc/examples/ls_orchid.gbk do bieżącego katalogu i zapisz go jako orchid.gbk.

Step 9 - Utwórz skrypt Pythona, load_orchid.py, używając poniższego kodu i wykonaj go.

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

Powyższy kod analizuje rekord w pliku i konwertuje go na obiekty Pythona i wstawia do bazy danych BioSQL. Przeanalizujemy kod w dalszej części.

Na koniec stworzyliśmy nową bazę danych BioSQL i załadowaliśmy do niej kilka przykładowych danych. W następnym rozdziale omówimy ważne tabele.

Prosty schemat ER

biodatabase tabela znajduje się na szczycie hierarchii, a jej głównym celem jest zorganizowanie zestawu danych sekwencyjnych w pojedynczą grupę / wirtualną bazę danych. Every entry in the biodatabase refers to a separate database and it does not mingle with another database. Wszystkie powiązane tabele w bazie danych BioSQL zawierają odniesienia do wpisu bazy danych biologicznych.

bioentrytabela zawiera wszystkie szczegóły dotyczące sekwencji z wyjątkiem danych sekwencji. dane sekwencyjne konkretnegobioentry będą przechowywane w biosequence stół.

Takson i nazwa_takonu są szczegółami taksonomii i każda pozycja odsyła do tej tabeli w celu określenia informacji o taksonu.

Po zrozumieniu schematu przyjrzyjmy się niektórym zapytaniom w następnej sekcji.

Zapytania BioSQL

Zagłębmy się w niektóre zapytania SQL, aby lepiej zrozumieć, w jaki sposób dane są zorganizowane i tabele są ze sobą powiązane. Zanim przejdziesz dalej, otwórzmy bazę danych za pomocą poniższego polecenia i ustaw kilka poleceń formatujących -

> 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. Możesz również użyć dowolnego edytora SQLite, aby uruchomić zapytanie.

Wymień wirtualną bazę danych sekwencji dostępną w systemie, jak podano poniżej -

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

Tutaj mamy tylko jedną bazę danych, orchid.

Wypisz wpisy (pierwsze 3) dostępne w bazie danych orchid z poniższym kodem

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>

Wymień szczegóły sekwencji związane z wpisem (przystąpienie - Z78530, nazwa - gen C. fasciculatum 5.8S rRNA oraz DNA ITS1 i ITS2) z podanym kodem -

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>

Uzyskaj pełną sekwencję związaną z wpisem (dostęp - Z78530, nazwa - gen C. fasciculatum 5.8S rRNA oraz DNA ITS1 i ITS2), używając poniższego kodu -

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>

Lista taksonów powiązanych z bio bazą danych, 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>

Załaduj dane do bazy danych BioSQL

W tym rozdziale nauczmy się, jak ładować dane sekwencji do bazy danych BioSQL. Mamy już kod do ładowania danych do bazy danych w poprzedniej sekcji, a kod wygląda następująco -

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

Przyjrzymy się dokładniej każdej linii kodu i jego przeznaczeniu -

Line 1 - Ładuje moduł SeqIO.

Line 2- Ładuje moduł BioSeqDatabase. Ten moduł zapewnia wszystkie funkcje do interakcji z bazą danych BioSQL.

Line 3 - Ładuje moduł systemu operacyjnego.

Line 5- open_database otwiera określoną bazę danych (db) ze skonfigurowanym sterownikiem (sterownikiem) i zwraca uchwyt do bazy danych BioSQL (serwera). Biopython obsługuje bazy danych sqlite, mysql, postgresql i oracle.

Line 6-10- metoda load_database_sql ładuje sql z zewnętrznego pliku i wykonuje go. Metoda commit zatwierdza transakcję. Możemy pominąć ten krok, ponieważ utworzyliśmy już bazę danych ze schematem.

Line 12 - metody new_database tworzy nową wirtualną bazę danych, orchid i zwraca db uchwyt do wykonania polecenia w bazie danych orchidei.

Line 13- metoda load ładuje wpisy sekwencji (iterowalny SeqRecord) do bazy danych orchidei. SqlIO.parse analizuje bazę danych GenBank i zwraca wszystkie zawarte w niej sekwencje jako iterowalne SeqRecord. Drugi parametr (True) metody load nakazuje jej pobranie szczegółów taksonomii danych sekwencji ze strony internetowej NCBI, jeśli nie są one jeszcze dostępne w systemie.

Line 14 - commit zatwierdza transakcję.

Line 15 - close zamyka połączenie z bazą danych i niszczy uchwyt serwera.

Pobierz dane sekwencji

Pobierzmy sekwencję z identyfikatorem 2765658 z bazy danych orchidei, jak poniżej -

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

Tutaj serwer ["orchid"] zwraca uchwyt do pobierania danych z wirtualnej bazy danychorchid. lookup metoda zapewnia opcję wyboru sekwencji na podstawie kryteriów i wybraliśmy sekwencję o identyfikatorze 2765658. lookupzwraca informacje o sekwencji jako SeqRecordobject. Ponieważ wiemy już, jak pracować z SeqRecord`, łatwo jest uzyskać z niego dane.

Usuń bazę danych

Usunięcie bazy danych jest tak proste, jak wywołanie metody remove_database z odpowiednią nazwą bazy danych, a następnie zatwierdzenie jej zgodnie z poniższym opisem -

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