Open Library ist eine Online-Bibliothek bibliografischer Daten. Die Bibliothek veröffentlicht vollständige Datendumps aller Autoren, Werke und Ausgaben.
Dieses Projekt bietet Anweisungen und Skripte zum Importieren dieser Daten in eine PostgreSQL-Datenbank sowie einige Beispielabfragen zum Testen der Datenbank.
Die Datenbank dient in erster Linie der Abfrage der Datenbank anhand der ISBN und enthält Tabellen speziell für diese Kennungen. Es könnte erweitert werden, um dies auf andere Identifikatoren wie die Open Library ID zu ändern oder eine Abfrage nach Titel oder Autor durchzuführen.
Mit den folgenden Schritten sollten Sie mit einer funktionierenden Datenbank einsatzbereit sein.
Open Library bietet auf ihrer Website Massen-Downloads an, die auf der Seite mit den Daten-Dumps verfügbar sind.
Diese werden jeden Monat aktualisiert. Zu den verfügbaren Downloads gehören (in komprimierter Größe):
Laden Sie die Daten-Dumps zu Editionen, Werken und Autoren herunter.
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
Verschieben Sie die Daten aus Ihrem Download-Ordner.
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
Dann entpacken Sie die Datendateien.
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
Leider scheinen die bereitgestellten Downloads für den direkten Import in PostgreSQL nicht geeignet zu sein. Beim Öffnen der Bibliotheksdatei treten beim Import Fehler auf, da die Anzahl der bereitgestellten Spalten variiert. Das Bereinigen ist schwierig, da allein die Textdatei für Editionen 25 GB groß ist.
Hinweis: Überprüfen Sie, ob dies immer noch der Fall ist. Wenn ja, gibt es möglicherweise einige Linux-Tools, die dies tun. Versuchen Sie es möglicherweise sed
und awk
Das lässt sich mit einem Python-Skript lösen. Die Datei openlibrary_data_process.py liest die Textdatei ein und schreibt sie für jede Zeile wieder aus, jedoch nur bei 5 Spalten.
python openlibrary_data_process.py
Da die Dateien riesig sind und nur noch wachsen werden (die Editionen sind jetzt 45 GB+), können Sie die Datei openlibrary_data_process_chunked.py
verwenden, um die Daten in kleinere Dateien aufzuteilen und sie nacheinander zu laden. Sie können die Anzahl der Zeilen in jedem Block ändern. Der Standardwert ist 2 Millionen.
Sobald die Dateien aufgeteilt sind, können Sie die drei TXT-Dateien im unkomprimierten Ordner löschen, da Sie etwa 250 GB freien Speicherplatz benötigen, um alle drei Dateien in die Datenbank zu laden, ohne dass Fehler aufgrund von Speicherplatzmangel auftreten. Wenn Sie genügend Platz haben, können Sie die Dateien behalten!
python openlibrary_data_process_chunked.py
Dadurch werden mehrere Dateien im Verzeichnis data/processed
generiert.
Eine dieser Dateien wird verwendet, um beim Laden der Daten auf die übrigen Dateien zuzugreifen.
Anschließend ist es möglich, die Daten direkt in PostgreSQL-Tabellen zu importieren und komplexe Suchen mit SQL durchzuführen.
Es gibt eine Reihe von Datenbankskripten, die die Datenbank und Tabellen erstellen und dann die Daten importieren. Diese befinden sich im Datenbankordner. Damit dies funktioniert, müssen sich die (im vorherigen Prozess erstellten) Datendateien im Ordner data/processed
befinden.
Zum Ausführen der Skripte wird das PostgreSQL-Datenbank-Befehlszeilentool psql
verwendet. Der folgende Befehl erstellt die Datenbank und Tabellen:
psql --set=sslmode=require -f openlibrary-db.sql -h localhost -p 5432 -U username postgres
Die Datenbank ist in 5 Haupttabellen aufgeteilt
Daten | Beschreibung |
---|---|
Autoren | Autoren sind die Personen, die die Werke schreiben |
Funktioniert | Die von den Autoren erstellten Werke mit Titeln und Untertiteln |
Autorenwerke | Eine Tabelle, die die Werke mit den Autoren verknüpft |
Editionen | Die jeweiligen Ausgaben der Werke, inklusive ISBNs |
Editions-ISBNs | Die ISBNs der Ausgaben |
Damit ist die Datenbank eingerichtet – sie kann jetzt mit SQL abgefragt werden.
Erhalten Sie Details zu einem einzelnen Artikel mit der ISBN 13 9781551922461 (Harry Potter und der Gefangene von Askaban):
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 '