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
ที่สามารถจัดการได้ด้วยสคริปต์หลาม ไฟล์ openlibrary_data_process.py อ่านในไฟล์ข้อความและเขียนอีกครั้งสำหรับแต่ละแถว แต่จะมีเพียง 5 คอลัมน์เท่านั้น
python openlibrary_data_process.py
เนื่องจากไฟล์มีขนาดใหญ่และกำลังจะขยายใหญ่ขึ้นเท่านั้น (รุ่นปัจจุบันมีขนาด 45gb+) คุณสามารถใช้ไฟล์ openlibrary_data_process_chunked.py
เพื่อแยกข้อมูลออกเป็นไฟล์เล็กลงเพื่อโหลดตามลำดับ คุณสามารถเปลี่ยนจำนวนบรรทัดในแต่ละอันได้ ค่าเริ่มต้นคือ 2 ล้าน
เมื่อแยกไฟล์แล้ว คุณสามารถลบไฟล์ .txt 3 ไฟล์ในโฟลเดอร์ที่ไม่มีการบีบอัดได้ เนื่องจากคุณจะต้องมีพื้นที่ว่างประมาณ 250 Gb เพื่อโหลดไฟล์ทั้ง 3 ไฟล์ลงในฐานข้อมูล โดยไม่พบข้อผิดพลาดเรื่องพื้นที่ว่าง หากคุณมีพื้นที่เพียงพอคุณสามารถเก็บไฟล์ไว้ได้!
python openlibrary_data_process_chunked.py
สิ่งนี้จะสร้างไฟล์หลายไฟล์ลงในไดเร็กทอรี data/processed
ไฟล์ใดไฟล์หนึ่งเหล่านี้จะถูกใช้เพื่อเข้าถึงไฟล์ที่เหลือเมื่อโหลดข้อมูล
จากนั้นจึงสามารถนำเข้าข้อมูลลงในตาราง PostgreSQL ได้โดยตรง และทำการค้นหาที่ซับซ้อนด้วย SQL
มีสคริปต์ฐานข้อมูลหลายชุดซึ่งจะสร้างฐานข้อมูลและตาราง จากนั้นจึงนำเข้าข้อมูล สิ่งเหล่านี้อยู่ในโฟลเดอร์ฐานข้อมูล ไฟล์ข้อมูล (สร้างขึ้นในกระบวนการก่อนหน้า) จะต้องอยู่ในโฟลเดอร์ data/processed
จึงจะสามารถใช้งานได้
psql
เครื่องมือบรรทัดคำสั่งฐานข้อมูล PostgreSQL ใช้เพื่อเรียกใช้สคริปต์ คำสั่งต่อไปนี้จะสร้างฐานข้อมูลและตาราง:
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 '