Open Library는 서지 데이터의 온라인 라이브러리입니다. 도서관은 모든 저자, 작품 및 판의 전체 데이터 덤프를 게시합니다.
이 프로젝트는 이 데이터를 PostgreSQL 데이터베이스로 가져오기 위한 지침과 스크립트, 그리고 데이터베이스를 테스트하기 위한 몇 가지 샘플 쿼리를 제공합니다.
데이터베이스는 주로 ISBN을 사용하여 데이터베이스를 쿼리하는 것을 목표로 하며 특히 이러한 식별자에 대한 테이블을 포함합니다. 이를 Open Library ID와 같은 다른 식별자로 변경하거나 제목이나 저자별로 쿼리하도록 확장할 수 있습니다.
다음 단계를 수행하면 작업 중인 데이터베이스를 시작하고 실행할 수 있습니다.
Open Library는 웹사이트의 데이터 덤프 페이지에서 대량 다운로드를 제공합니다.
매달 업데이트됩니다. 사용 가능한 다운로드에는 다음이 포함됩니다(압축된 크기 포함).
에디션, 저작물 및 저자 데이터 덤프를 다운로드하세요.
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
파일을 사용하여 데이터를 더 작은 파일로 분할하여 순차적으로 로드할 수 있습니다. 각 청크의 줄 수를 변경할 수 있습니다. 기본값은 2백만입니다.
파일이 분할되면 압축되지 않은 폴더에서 3개의 .txt 파일을 삭제할 수 있습니다. 공간 부족 오류가 발생하지 않고 3개의 파일을 모두 데이터베이스에 로드하려면 약 250GB의 여유 공간이 필요하기 때문입니다. 공간이 충분하다면 파일을 보관할 수 있습니다!
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 '