Open Library は書誌データのオンライン ライブラリです。このライブラリは、すべての著者、作品、版の完全なデータ ダンプを公開しています。
このプロジェクトでは、このデータを PostgreSQL データベースにインポートするための手順とスクリプト、およびデータベースをテストするためのサンプル クエリを提供します。
このデータベースは主に、ISBN を使用してデータベースにクエリを実行することを目的としており、これらの識別子に特化したテーブルが含まれています。これを拡張して、Open Library ID などの他の識別子に変更したり、タイトルや著者によってクエリを実行したりすることができます。
次の手順を実行すると、データベースが稼働するようになります。
Open Library は Web サイトで一括ダウンロードを提供しており、データ ダンプ ページから入手できます。
これらは毎月更新されます。利用可能なダウンロードには次のものが含まれます (圧縮サイズ)。
エディション、作品、および著者のデータ ダンプをダウンロードします。
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
ダウンロードフォルダーからデータを移動します。
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
次に、データ ファイルを解凍します。
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
残念ながら、提供されているダウンロードは、PostgreSQL への直接インポートでは適切に動作しないようです。提供される列の数が異なるため、インポート時に開いているライブラリ ファイルでエラーが発生します。エディションのテキストファイルだけでも 25GB あるため、クリーンアップするのは困難です。
注: これがまだ当てはまるかどうかを確認してください。そうであれば、これを行うための Linux ツールがある可能性があります。おそらくsed
とawk
試してください。
これは Python スクリプトで解決できます。ファイル openlibrary_data_process.py はテキスト ファイルを読み取り、行ごとに再度書き込みますが、列が 5 つある場合に限ります。
python openlibrary_data_process.py
ファイルは巨大で、今後も増加する一方であるため (エディションは現在 45 GB 以上)、 openlibrary_data_process_chunked.py
ファイルを使用してデータを小さなファイルに分割し、順次ロードできます。各チャンク内の行数を変更できます。デフォルトは 200 万です。
ファイルが分割されたら、圧縮されていないフォルダー内の 3 つの .txt ファイルを削除できます。領域不足エラーが発生せずに 3 つのファイルすべてをデータベースにロードするには、約 250 GB の空き領域が必要になるためです。十分なスペースがある場合は、ファイルを保存できます。
python openlibrary_data_process_chunked.py
これにより、 data/processed
ディレクトリに複数のファイルが生成されます。
これらのファイルの 1 つは、データのロード時に残りのファイルにアクセスするために使用されます。
データを PostgreSQL テーブルに直接インポートし、SQL を使用して複雑な検索を実行できるようになります。
データベースとテーブルを作成し、データをインポートする一連のデータベース スクリプトがあります。これらはデータベース フォルダー内にあります。これが機能するには、データ ファイル (前のプロセスで作成された) がdata/processed
フォルダー内にある必要があります。
スクリプトの実行には、PostgreSQL データベース コマンド ライン ツールpsql
が使用されます。次のコマンドはデータベースとテーブルを作成します。
psql --set=sslmode=require -f openlibrary-db.sql -h localhost -p 5432 -U username postgres
データベースは 5 つのメインテーブルに分割されています
データ | 説明 |
---|---|
著者 | 著者とは作品を書く個人のことです |
作品 | 作者が作成した、タイトルとサブタイトルが付いた作品 |
著者作品 | 作品と作者を結び付ける表 |
エディション | ISBN を含む作品の特定の版 |
版の ISBN | エディションの ISBN |
これでデータベースのセットアップが完了し、SQL を使用してクエリを実行できるようになります。
ISBN13 9781551922461 (ハリー・ポッターとアズカバンの囚人) を使用して、単一アイテムの詳細を取得します。
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 '