VD17-Dump
Dump der bibliographischen Metadaten aus dem VD 17. Die Daten werden über die SRU-Schnittstelle in PICA-XML geharvestet und in ein nutzerfreundliches JSON-Format umgerechnet.
Die Transformation wird laufend optimiert. Änderungs- und Ergänzungswünsche können über "Issues" eingebracht werden.
Der Dump gibt den Stand des VD 17 vom 10.01.2025 wieder.
Allgemeines
Grundlage sind die Daten für Monographien oder Teile eines mehrteiligen Werks, die über die SRU-Schnittstelle des VD 17 in PICA-XML heruntergeladen werden können.
Beispiel für das erste 500er-Set:
Das Datenmodell entspricht dem Pica3-Format, das in der Erfassungsrichtlinie von BSZ und GBV dokumentiert ist. Die Daten werden vom GBV unter der Creative Commons Lizenz CC0 zur Verfügung gestellt, s. hierzu das WikiK10plus. Die Derivate in diesem Repositorium stehen ebenfalls unter einer CC0-Lizenz. Der Quellcode zur Erzeugung des Dumps steht unter einer MIT-Lizenz.
Die Konversion erfolgt mit einem eigens entwickelten Python-Modul, dazu Näheres unter "Quellcode".
Dokumentation des Zielformats
Felder für bibliographische Einheiten
Feld | Typ | Inhalt |
---|---|---|
ppn | String | ID in der Datenbank |
vdn | String | VD17-Nummer |
bbg | String | Code für Bibliographische Gattung und Status s. Dokumentation |
recType | String | Bibliographische Gattung: "Monographie", "Teilband" oder "Teilband mit eigenem Titel", errechnet aus bbg |
catRule | String | Bei der Katalogisierung angewandtes Regelwerk, entweder "rak" oder "rda" |
date | String | Datierung als Jahreszahl |
lang | String | Sprachcodes nach ISO 639-2, getrennt durch ";" |
langOrig | String | Sprachcodes der Originalsprache bei Übersetzungen |
title | String | Titel einschließlich Untertitel |
resp | String | Verantwortlichkeitsangabe |
edition | String | Ausgabevermerk |
format | String | Bibliographisches Format |
pages | String | Kollationsvermerk |
normPages | Integer | Normalisierte Seitenangabe. Der Algorithmus berücksichtigt Seiten- und Blattangaben, von-bis-Angaben, Ausdrücke mit "i.e." oder "das heißt" und römische Zahlen. S. die Funktion get_norm_p() unter https://github.com/hbeyer/pylib/blob/main/lib/pica.py |
ppn_sup | String | Bei Teilen mehrbändiger Werke: ID der Gesamtaufnahme |
title_sup | String | Bei Teilen mehrbändiger Werke: Titel der Gesamtaufnahme |
vol | String | Bei Teilen mehrbändiger Werke: Bandangabe |
digi | String | URLs von Digitalisaten, mehrere getrennt durch ";" |
gat | String | Gattungsbegriffe der AAD, getrennt durch ";". Gattungsbegriffe von Teilbänden sind aus den Gesamtaufnahmen übernommen. |
persons | Array | Personen, die als VerfasserInnen, BeiträgerInnen oder sonstige Personen erwähnt sind |
publishers | Array | DruckerInnen und/oder VerlegerInnen |
places | Array | Erscheinungsorte |
copies | Array | Exemplare |
Unterfelder persons
Feld | Typ | Inhalt |
---|---|---|
persName | String | Name, in der Form "Vorname, Nachname" |
role | String | Beziehungskennzeichnung nach RDA (VerfasserIn etc.) oder DC (creator, contributor) |
gnd | String | GND-Nummer |
dateBirth | String | Geburtsdatum |
dateDeath | String | Sterbedatum |
Unterfelder publishers
Ist strukturiert wie persons, Feld role hat den Wert "publisher"
Unterfelder places
Feld | Typ | Inhalt |
---|---|---|
placeName | String | Ortsname |
relation | String | Beziehungskennzeichnung: "Erscheinungsort", "Herstellungsort", "Enstehungsort" oder "Vertriebsort" |
Unterfelder copies
Feld | Typ | Inhalt |
---|---|---|
place | String | Bibliotheksort |
bib | String | Bibliothek |
isil | String | ISIL der Bibliothek, s. ISIL-Datei |
eln | String | ELN (External Library Number) der Bibliothek |
iln | String | ILN (Internal Library Number) der Bibliothek |
shelfmark | String | Signatur |
epn | String | ID des Lokalsatzes |
provenances | String | Provenienzinformationen, mehrere Angaben verkettet mit ";" |
Beispieldatensatz
{
"ppn":"005973309",
"vdn":"VD17 3:693602L",
"permalink":"https://kxp.k10plus.de/DB=1.28/CMD?ACT=SRCHA&IKT=8079&TRM=%273:693602L%27",
"bbg":"Aau",
"recType":"Monographie",
"catRule":"rak",
"date":"1686",
"lang":"ger",
"title":"Theologische Send-Schreiben Von dem rechten Kirchen-gehen/ An Magr: G. S. einen Hoff-Prediger.. Darinnen auß wahrem Grunde und Verstand der Heyl: Schrifft/ wie auch nach der fürnehmsten alten und neuen Theologen ihren Zeugnissen/ kurtzlich dargethan und erwiesen wird/ wie weit/ und wie weit nicht/ das Kirchen-gehen einem Gott-suchenden Menschen nützlich und nöthig sey ; Darbey noch ein Brieff/ in welchem zu sehen/ was der rechte Adel seye",
"resp":"Auffgesetzet von numehro Weyland Abraham von Franckenberg ... nebenst einem Verzeicnus seiner Schrifften.",
"format":"8°",
"pages":"[6] Bl., 95 S",
"normPages":"107",
"digi":"http://nbn-resolving.de/urn:nbn:de:gbv:3:1-538155",
"gat":"Brief;Legende",
"persons":[
{
"persName":"Frankenberg, Abraham",
"role":"creator",
"gnd":"118855050",
"dateBirth":"1593",
"dateDeath":"1652"
}
],
"publishers":[
{
"persName":"Balthasar, Wilhelm",
"role":"publisher",
"gnd":"1037612523"
},
{
"persName":"Balthasar, Jacob",
"role":"publisher",
"gnd":"1037541766"
}
],
"places":[
{
"placeName":"Amsterdam",
"relation":"Erscheinungsort"
}
],
"copies":[
{
"place":"Halle (Saale)",
"bib":"Universitäts- und Landesbibliothek Sachsen-Anhalt",
"isil":"DE-3",
"eln":"0003",
"iln":"65",
"shelfmark":"S Tsch D0845",
"epn":"005930863"
},
{
"place":"Hannover",
"bib":"Gottfried Wilhelm Leibniz Bibliothek - Niedersächsische Landesbibliothek",
"isil":"DE-35",
"eln":"0035",
"iln":"72",
"shelfmark":"T-A 57",
"epn":"008409072"
}
]
}
Quellcode
Der Dump kann mit Python neu erzeugt werden. Hierfür muss zunächst der Quellcode aus dem Repositorium https://github.com/hbeyer/pylib geladen werden. Beispiel für Linux:
sudo git clone https://github.com/hbeyer/pylib
In dem dabei angelegten Verzeichnis pylib
können dann Skripte mit Python 3 ausgeführt werden.
Das Herunterladen der PICA-XML-Dateien und die Umrechnung in JSON geschieht durch folgendes Skript:
import logging
import pickle
from lib import sru
from lib import isil
from lib import xmlreader as xr
from lib import pica
logging.basicConfig(level=logging.INFO)
# Festlegen der Speicherpfade und der Datensätze pro JSON-Datei
source_folder = "{Ordner mit den PICAXML-Dateien}/"
source_folder_ac = "{Ordner mit den PICAXML-Dateien für Gesamtaufnahmen mehrbändiger Werke (Ac-Sätze)}/"
target_folder = "{Ordner zum Speichern der JSON-Dateien}/"
size = 1000
limit = 350000
# Laden der Ac-Sätze und Extrahieren der Gattungsbegriffe
req = sru.Request_VD17()
num = req.prepare("pica.bbg=Ac*")
print(req.url)
print(req.numFound)
req.download(source_folder_ac)
res = {}
reader = xr.DownloadReader(source_folder_ac, "record", "info:srw/schema/5/picaXML-v1.0")
for count, node in enumerate(reader):
rec = pica.RecordVD17(node)
gatt = [gat for gat in rec.gatt]
if gatt == []:
continue
res[rec.ppn] = gatt
if count > 100000:
break
with open('gattungen-ac', 'wb') as file:
pickle.dump(res, file)
# Download der PICA-XML-Daten
req = sru.Request_VD17()
num = req.prepare("pica.bbg=(Aa* or Af*)")
print(req.url)
print(req.numFound)
req.download(source_folder)
# Auslesen und Abspeichern in JSON
with open('gattungen-ac','rb') as file:
gatt_ac = pickle.load(file)
reader = xr.DownloadReader(source_folder, "record", "info:srw/schema/5/picaXML-v1.0")
content = []
fnn = []
setn = 1
count = 0
for no, node in enumerate(reader):
rec = pica.RecordVD17(node)
if rec.get_rec_type() in ["Teilband", "Teilband mit eigenem Titel"]:
try:
rec.gatt = gatt_ac[rec.ppn_sup]
except:
#logging.info(f"Keine Gattungsbegriffe bei PPN {rec.ppn_sup}")
pass
content.append(rec)
count += 1
if count >= size:
recl = pica.RecordList(content)
fn = f"vd17-{str(setn).zfill(3)}"
recl.to_json(target_folder + fn)
logging.info(f"{no + 1} Datensätze abgespeichert")
content = []
setn += 1
count = 0
if no > limit:
break
if content != []:
recl = pica.RecordList(content)
fn = f"vd17-{str(setn).zfill(3)}"
recl.to_json(target_folder + fn)
logging.info(f"{no + 1} Datensätze abgespeichert")