Open Library é uma biblioteca online de dados bibliográficos. A biblioteca publica despejos de dados completos de todos os autores, obras e edições.
Este projeto fornece instruções e scripts para importar esses dados para um banco de dados PostgreSQL e alguns exemplos de consultas para testar o banco de dados.
A base de dados destina-se principalmente à consulta da base de dados através do ISBN e inclui tabelas específicas para estes identificadores. Poderia ser estendido para alterar isso para outros identificadores, como Open Library ID, ou para consultar por título ou autor.
As etapas a seguir devem ajudá-lo a começar a usar um banco de dados funcional.
A Open Library oferece downloads em massa em seu site, disponíveis na página de despejos de dados.
Eles são atualizados todos os meses. Os downloads disponíveis incluem (com tamanho compactado):
Baixe os dumps de dados de Edições, Obras e Autores.
wget https://openlibrary.org/data/ol_dump_editions_latest.txt.gz -P ~/downloads
wget https://openlibrary.org/data/ol_dump_works_latest.txt.gz -P ~/downloads
wget https://openlibrary.org/data/ol_dump_authors_latest.txt.gz -P ~/downloads
Mova os dados da sua pasta de downloads.
mv ~/downloads/ol_dump_authors_*txt.gz ./data/unprocessed/ol_dump_authors.txt.gz
mv ~/downloads/ol_dump_works_*txt.gz ./data/unprocessed/ol_dump_works.txt.gz
mv ~/downloads/ol_dump_editions_*txt.gz ./data/unprocessed/ol_dump_editions.txt.gz
Em seguida, descompacte os arquivos de dados.
gzip -d -c data/unprocessed/ol_dump_editions.txt.gz > data/unprocessed/ol_dump_editions.txt
gzip -d -c data/unprocessed/ol_dump_works.txt.gz > data/unprocessed/ol_dump_works.txt
gzip -d -c data/unprocessed/ol_dump_authors.txt.gz > data/unprocessed/ol_dump_authors.txt
Infelizmente, os downloads fornecidos não parecem funcionar bem para importação direta para o PostgreSQL. Os erros do arquivo de biblioteca aberto na importação, pois o número de colunas fornecidas varia. Limpar é difícil porque apenas o arquivo de texto das edições tem 25 GB.
Nota: Verifique se este ainda é o caso e, em caso afirmativo, pode haver algumas ferramentas Linux para fazer isso - talvez tente sed
e awk
Isso pode ser resolvido com um script python. O arquivo openlibrary_data_process.py lê o arquivo de texto e o grava novamente para cada linha, mas apenas onde houver 5 colunas.
python openlibrary_data_process.py
Como os arquivos são enormes e só vão crescer (as edições agora têm 45 GB ou mais), você pode usar o arquivo openlibrary_data_process_chunked.py
para dividir os dados em arquivos menores para carregar sequencialmente. Você pode alterar o número de linhas em cada bloco. O padrão é 2 milhões.
Depois que os arquivos forem divididos, você poderá excluir os 3 arquivos .txt da pasta descompactada, pois precisará de cerca de 250 Gb de espaço livre para carregar todos os 3 arquivos no banco de dados sem encontrar erros de falta de espaço. Se você tiver bastante espaço, poderá guardar os arquivos!
python openlibrary_data_process_chunked.py
Isso gera vários arquivos no diretório data/processed
.
Um desses arquivos será usado para acessar os demais ao carregar os dados.
É então possível importar os dados diretamente para tabelas PostgreSQL e fazer pesquisas complexas com SQL.
Há uma série de scripts de banco de dados que criarão o banco de dados e as tabelas e depois importarão os dados. Eles estão na pasta do banco de dados. Os arquivos de dados (criados no processo anterior) precisam estar dentro da pasta data/processed
para que isso funcione.
A ferramenta de linha de comando do banco de dados PostgreSQL psql
é usada para executar os scripts. O seguinte comando criará o banco de dados e as tabelas:
psql --set=sslmode=require -f openlibrary-db.sql -h localhost -p 5432 -U username postgres
O banco de dados é dividido em 5 tabelas principais
Dados | Descrição |
---|---|
Autores | Autores são as pessoas que escrevem as obras |
Funciona | As obras criadas pelos autores, com títulos e subtítulos |
Obras do autor | Uma tabela ligando as obras aos autores |
Edições | As edições particulares das obras, incluindo ISBNs |
ISBNs de edição | Os ISBNs das edições |
Essa é a configuração do banco de dados - agora ele pode ser consultado usando SQL.
Obtenha detalhes de um único item usando o ISBN13 9781551922461 (Harry Potter e o Prisioneiro de Azkaban):
select
e . data - >> ' title ' " EditionTitle " ,
w . data - >> ' title ' " WorkTitle " ,
a . data - >> ' name ' " Name " ,
e . data - >> ' subtitle ' " EditionSubtitle " ,
w . data - >> ' subtitle ' " WorkSubtitle " ,
e . data - >> ' subjects ' " Subjects " ,
e . data - > ' description ' - >> ' value ' " EditionDescription " ,
w . data - > ' description ' - >> ' value ' " WorkDescription " ,
e . data - > ' notes ' - >> ' value ' " EditionNotes " ,
w . data - > ' notes ' - >> ' value ' " WorkNotes "
from editions e
join edition_isbns ei
on ei . edition_key = e . key
join works w
on w . key = e . work_key
join author_works a_w
on a_w . work_key = w . key
join authors a
on a_w . author_key = a . key
where ei . isbn = ' 9781551922461 '