开放图书馆是一个在线书目数据图书馆。该图书馆发布所有作者、作品和版本的完整数据转储。
该项目提供了用于将此数据导入 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 '