開放圖書館是一個線上書目資料圖書館。圖書館發布所有作者、作品和版本的完整資料轉儲。
該專案提供了將此資料匯入 PostgreSQL 資料庫的說明和腳本,以及一些用於測試資料庫的範例查詢。
該資料庫主要旨在使用 ISBN 查詢資料庫,並包含專門針對這些標識符的表。它可以擴展以將其更改為其他標識符,例如開放圖書館 ID,或按標題或作者進行查詢。
以下步驟應該可以讓您啟動並執行一個工作資料庫。
開放圖書館在其網站上提供大量下載,可從資料轉儲頁面取得。
這些每月都會更新。可用的下載包括(壓縮大小):
下載版本、作品和作者資料轉儲。
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
由於檔案很大且只會增長(版本現在為 45gb+),因此您可以使用openlibrary_data_process_chunked.py
檔案將資料拆分為較小的檔案以按順序載入。您可以更改每個區塊中的行數。預設值為 200 萬。
文件分割後,您可以刪除未壓縮資料夾中的 3 個 .txt 文件,因為您需要大約 250 GB 的可用空間才能將所有 3 個文件載入到資料庫中,而不會遇到空間不足錯誤。如果您有足夠的空間,您可以保留文件!
python openlibrary_data_process_chunked.py
這會在data/processed
目錄中產生多個檔案。
載入資料時,將使用其中一個檔案來存取其餘檔案。
然後可以將資料直接匯入 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 '