OAI-PMH
Motivation und Entstehung
Im Jahr 2012 entstand an der UB Leipzig der Wunsch nach einem URN-Server, der nächtlich alle über den Tag neu erstellten URNs zusammenfasst und für die Deutsche Nationalbibliothek (DNB) abrufbereit präsentiert, damit diese in den Index der DNB aufgenommen werden können. Die DNB arbeitete damals wie heute mit OAI-Clients zum Abrufen der URNs. Stefan Freitag, mittlerweile Leiter der Softwareentwicklung an der UB Leipzig, hat daraufhin zunächst einen OAI-PMH-Server für URNs unter Nutzung des xepicur-Formats implementiert. In 2018 wurde dieser unter Verwendung aktuellerer Technologien (u.a. Java 11, vert.x‑Framework) neu implementiert.
Zur gleichen Zeit entstand der Wunsch, METS/MODS-Dateien ebenfalls öffentlich verfügbar zu machen. METS/MODS-Dateien enstehen während des Kitodo-Digitalisierungsworkflows und werden zur IIIF-Verarbeitung herangezogen. IIIF ist eine wunderbare Technologie zum Austauschen und Präsentieren von Bilddateien, es fehlt der Technologie jedoch an Funktionalität, um detaillierte bibliografische Informationen darzustellen, die wiederum in den METS/MODS-Daten aggregiert sind. Aus diesem Grunde hat Stefan Freitag den OAI-Server modifiziert und eine neue Instanz aufgesetzt. Darüber werden seitdem die METS/MODS-Daten verfügbar gemacht. Um diese Schnittstelle performant zu gestalten, werden die Daten in einer Datenbank zwischengespeichert, die wiederum intervallmäßig aus einer selbst entwickelten Schnittstelle (igiL-Backend) mit den Daten versorgt wird. Die UB Leipzig erreicht dadurch ein sehr performantes Zwischenspeichern (Caching) der Daten für die sehr vielen und zudem teilweise sehr großen METS/MODS-Beschreibungen.
Nutzung und Nutzungsbeispiel
Open Archives Initiative Protocol for Metadata Harvesting (OAI-PMH) ist ein webbasiertes standardisiertes Protokoll für das Sammeln von Metadaten und bietet ein anwendungsunabhängiges Interoperabilitäts-Framework. Mit Hilfe eines Harvesters (Clientanwendung), können Metadaten gesammelt werden.
Mithilfe von OAI-PMH werden bevorzugt Datenabgleiche zwischen Datenbanken vollzogen. Das schließt jedoch nicht aus, Metadaten ohne eigene Datenbank über die Schnittstelle zu beziehen. Wie eingangs erwähnt, findet die Schnittstelle bei uns hauptsächlich Anwendung beim Datenabgleich mit der DNB. So können Datensätze automatisiert und in einem festgelegten Standard zwischen den Einrichtungen ausgetauscht werden.
Die einfachste Art eines solchen Clients ist beispielsweise ein Webbrowser. Es können aber auch Anfragen (Requests) in Computerprogrammen von Programmierern integriert werden, um diese an den Server zu senden, eine Antwort (Response) zu bekommen und diese Antwort entsprechend im Computerprogramm zu verarbeiten.
Im Folgenden zeigen wir Ihnen, anhand von 2 Beispielen, wie Sie die Schnittstelle nutzen können. Eine ausführliche Beschreibung des Protokolls finden Sie unter https://www.openarchives.org/OAI/openarchivesprotocol.html
Request
OAI-PMH-Anfragen müssen entweder mit den Methoden HTTP GET oder POST gesendet werden. POST hat den Vorteil, dass die Länge der Argumente nicht eingeschränkt wird. Bei den Anfragen muss das URL-Encoding beachtet werden.
Für eine Anfrage (Request) wird eine Basis-URL benötigt, welche durch Schlüsselwortargumente (keyword arguments) ergänzt wird. Zwischen der Basis-URL und den Schlüsselwortargumenten muss eine Trennung durch ein Fragezeichen [?] erfolgen.
Basis-URL der UB Leipzig
https://services.ub.uni-leipzig.de/digitalcollections/oai2
Keyword Arguments
Zusätzlich zur Basis-URL bestehen alle Anfragen aus einer Liste von Schlüsselwortargumenten (keyword arguments), die die Form von Schlüssel-Wert-Paaren haben (key=value). Die Argumente können dabei in beliebiger Reihenfolge aneinandergereiht werden. Mehrere Argumente müssen durch das kaufmännische Und [&] getrennt werden. Dabei ist zu beachten, dass jede OAI-PMH-Anfrage mindestens ein Schlüssel-Wert-Paar enthalten muss.
Beispiel für den Abruf des Impressums vom OAI-Server mithilfe des Wertes „Identify”:
https://services.ub.uni-leipzig.de/digitalcollections/oai2?verb=Identify
Basis-URL:
https://services.ub.uni-leipzig.de/digitalcollections/oai2
keyword arguments:
verb=identify
Repositories machen standardmäßig ihre Basis-URL als Wert des baseURL-Elements in der sogenannten Identify-Antwort verfügbar.
Beispiel für die Eingrenzung der Records auf einen bestimmten Zeitraum:
https://services.ub.uni-leipzig.de/digitalcollections/oai2?verb=ListRecords&metadataPrefix=mets&from=2020-01-10&until=2020-05-15
Basis-URL:
https://services.ub.uni-leipzig.de/digitalcollections/oai2
keyword arguments:
verb=ListRecords
metadataPrefix=mets
from=2020-01-10
until=2020-05-15
Response
Alle Antworten auf OAI-PMH-Anfragen sind wohlgeformte XML-Dokumente die in UTF-8 codiert sind.
Verfügbare Formate:
METS | Metadata Encoding & Transmission Standard | Format zur Beschreibung von digitalen Sammlungen von Objekten mit Metadaten |
MODS | Metadata Object Description Schema | Format für bibliografische Metadaten |
Im Folgenden ist ein Ausschnitt für den Response zum Beispiel 2 zu sehen. Das Beispiel enthält Elemente und Attribute, welche in den Schemadefinitionen hinterlegt sind. Diese werden mit entsprechenden Daten gefüllt, wie es die Schemadefinition verlangt. Betrachten wir hierzu den folgenden Abschnitt, wobei erkennbar ist, dass die Bezeichnung recht eindeutig sind. Hier der Titel des Werks:
<mods:title>Dominica Aduentus Domini, Matth. 21.</mods:title>
<mets:mets xsi:schemaLocation="http://www.loc.gov/standards/premis/ http://www.loc.gov/standards/premis/v2/premis-v2-0.xsd http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-7.xsd http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/version17/mets.v1-7.xsd http://www.loc.gov/standards/mix/ http://www.loc.gov/standards/mix/mix.xsd" > <mets:metsHdr CREATEDATE="2017-04-25T06:56:22" > <mets:agent OTHERTYPE="SOFTWARE" ROLE="CREATOR" TYPE="OTHER" > <mets:name>Goobi - UGH-1.11.0-7b3c2be - 26−March−2015</mets:name> <mets:note>Goobi</mets:note> </mets:agent> </mets:metsHdr> <mets:dmdSec ID="DMDLOG_0000" > <mets:mdWrap MDTYPE="MODS" > <mets:xmlData> <mods:mods> <mods:identifier type="goobi" >2552</mods:identifier> <mods:relatedItem type="series" > <mods:titleInfo> <mods:title>VD16</mods:title> </mods:titleInfo> </mods:relatedItem> <mods:identifier type="urn" >urn:nbn:de:bsz:15-0010-122769</mods:identifier> <mods:identifier type="swb-ppn" >084461748</mods:identifier> <mods:extension> <slub:slub> <slub:id type="source" >084461748</slub:id> <slub:id type="tsl-ats" >DresPrec</slub:id> </slub:slub> </mods:extension> <mods:identifier type="vd16" >VD16 D 2761</mods:identifier> <mods:titleInfo> <mods:title>Precationum formulae Ex Singvlis Evangeliis Dominicorvm, Et Festorvm Diervm Deliberate</mods:title> <mods:subTitle>Latinè, & Graecè</mods:subTitle> </mods:titleInfo> <mods:titleInfo type="alternative" > <mods:title>Precationum formulae ex singulis Evangeliis Dominicorum, et festorum dierum deliberate</mods:title> </mods:titleInfo> <mods:language> <mods:languageTerm authority="rfc3066" type="code" >grc</mods:languageTerm> </mods:language> <mods:language> <mods:languageTerm authority="rfc3066" type="code" >lat</mods:languageTerm> </mods:language> <mods:originInfo> <mods:place> <mods:placeTerm type="text" >Lipsiae</mods:placeTerm> </mods:place> <mods:dateIssued keyDate="yes" >1596</mods:dateIssued> <mods:dateOther encoding="w3cdtf" type="order" >1596</mods:dateOther> <mods:publisher>Lantzenberger</mods:publisher> </mods:originInfo> <mods:name type="personal" > <mods:role> <mods:roleTerm authority="marcrelator" type="code" >aut</mods:roleTerm> </mods:role> <mods:namePart type="family" >Dresser</mods:namePart> <mods:namePart type="given" >Matthaeus</mods:namePart> <mods:displayForm>Dresser, Matthaeus</mods:displayForm> </mods:name> <mods:physicalDescription> <mods:extent unit="leaves" >[176] Bl.</mods:extent> </mods:physicalDescription> </mods:mods> </mets:xmlData> </mets:mdWrap> </mets:dmdSec> <mets:dmdSec ID="DMDLOG_0001" > <mets:mdWrap MDTYPE="MODS" > <mets:xmlData> <mods:mods> <mods:titleInfo> <mods:title>Dominica Aduentus Domini, Matth. 21.</mods:title> </mods:titleInfo> </mods:mods> </mets:xmlData> </mets:mdWrap> </mets:dmdSec>