lobid-gnd – Eine Schnittstelle zur Gemeinsamen Normdatei für Mensch und Maschine

07 Jun 2018, Adrian Pohl, Fabian Steeg | 🏷 lobid-gnd 

Wie im letzten Beitrag geschrieben, entwickeln wir seit einiger Zeit die neue Version des lobid-Normdatendienstes lobid-gnd, erreichbar über https://lobid.org/gnd.1 Noch befindet sich der Dienst im beta-Status, allerdings sind wir kurz davor, mit lobid-gnd in Produktion zu gehen. Das nehmen wir zum Anlass, um hier einen Einblick in die Funktionsweise von lobid-gnd zu geben.

Die Benutzeroberfläche

Screenshot

Als Einstieg in die GND dient ein einfacher Suchschlitz. Die Suche unterstützt Boolesche Operatoren, Phrasensuche und Trunkierung. Für noch speziellere Abfragen wird die Lucene Query Parser Syntax unterstützt (siehe für Beispiele die API-Dokumentation).2 Während der Eingabe werden Vorschläge gemacht, um direkt den gewünschten Eintrag auswählen zu können. Zur leichteren Identifikation werden neben dem Namen auch der Typ einer GND-Entität angezeigt sowie weitere für eine Identifikation relevante Informationen wie etwa Geburts- und Sterbejahr bei Personen.

Wenn kein vorgeschlagener Eintrag ausgewählt und stattdessen die Suche abgeschickt wird, öffnet sich die Suchergebnisliste.

Screenshot

Ein Piktogramm am Anfang jeder Zeile zeigt den allgemeinen Typ der Ressource an. Zur leichten Identifikation einer GND-Entität werden in der Zeile ebenfalls ihr spezieller Entitätstyp und weitere Informationen je nach Art des Eintrags angezeigt. Auf der rechten Seite werden Facetten angezeigt anhand derer die Suchergebnisse gefiltert werden können. Derzeit wird eine Facettierung nach Entitätstyp, GND-Sachgruppe, Ländercode und “Beruf oder Beschäftigung” (nur Personen) angeboten. In Klammern wird hinter jeder Facette wie üblich angezeigt, wieviele Ressourcen mit Klick auf die Facette herausgefiltert werden.

Mit Klick auf den Eintrag einer Suchergebnisliste wie auch der Vorschlagsliste gelangt man zur Einzeltrefferansicht.

Screenshot

Im Titel des Eintrags steht die präferierte Namensform plus Informationen zum Entitätstyp. Als Untertitel werden weitere identifizierende Merkmale wie auch in den Suchvorschlägen und der Ergebnisliste gezeigt. Darunter werden standardmäßig alle Beschreibungsfelder angezeigt sowie daneben – falls über EntityFacts vorhanden – eine zum Eintrag passende Abbildung. Aus EntityFacts werden auch die Links zu anderen Quellen wie Wikidata oder der Deutschen Digitalen Bibliothek bezogen (unter “Siehe auch” angezeigt).

In der tabellarischen Beschreibung finden sich sowohl textuelle Informationen als auch Links. Die Verlinkungen führen zur jeweilig verknüpften GND-Entität oder zum Eintrag im jeweiligen externen kontrollierten Vokabular (z. B. GND Geographic Area Codes oder GND-Sachgruppen). Wird die Lupe hinter einem Link geklickt, werden alle GND-Entitäten mit derselben Eigenschaft angezeigt, im Beispiel aus dem Foto z. B. alle Einträge mit Beruf oder Beschäftigung “Philosophin”.

Im Tab “Beziehungen” gibt es eine anschauliche Repräsentation der GND-internen Verlinkungen in Form eines Graphen. Hier lassen sich die Knoten klicken, um zum Beziehungsgraphen eines verlinkten Eintrags zu kommen oder die Kanten, um eine Suche nach allen anderen Ressourcen mit derselben Relation anzustoßen, wie etwa alle Personen mit einer freundschaftlichen Beziehung zu Hilde Fränkel.

lobid-gnd-Beziehungsgraph

Das Piktogramm JSON-LD-Piktogramm verweist auf die dem Eintrag zugrundeliegenden strukturierten Daten im Format JSON-LD. Im folgenden wird die Herkunft, Aktualität und Struktur dieser Daten erläutert.

Datengenerierung und Anreicherung

lobid-gnd ist – neben seiner Funktion als Endnutzerschnittstelle – auch eine Maschinenschnittstelle zur GND. Die Endnutzerschnittstelle basiert auf HTML für die Ansicht im Browser, aber ebenso liefern alle HTTP-GET-Anfragen auf Wunsch JSON(-LD) für die maschinelle Verarbeitung etwa durch Anwendungsentwickler. Bevor wir aber näher auf die Web-API (Application Programming Interface, deutsch: Anwendungsschnittstelle) eingehen, möchten wir zunächst beschreiben, wie und in welcher Form die GND-Daten indexiert werden.

Die Datenquelle sind die RDF-Daten der GND, die von der Deutschen Nationalbliothek (DNB) bereitgestellt werden. Das hbz hat Zugriff auf eine OAI-PMH-Schnittstelle der DNB, über die täglich Updates der Daten geholt werden, um Aktualität zu gewährleisten. Diese Daten werden dann für lobid-gnd mit einigen Anpassungen nach JSON-LD konvertiert.3

Der JSON-LD-Kontext

Die meiste Arbeit zur Optimierung der Datenstruktur übernimmt der JSON-LD-Kontext unter https://lobid.org/gnd/context.jsonld. Er bewirkt unter anderem folgende Dinge:

  • Der Kontext bestimmt, welche JSON-Keys auf welche RDF-Properties gemappt werden, so dass im JSON nicht lange URIs als Keys angezeigt werden.
  • Mit Einträgen wie "AuthorityResource": "gnd:AuthorityResource" werden Typen (type) im JSON nicht als umständliche URI, sondern als einfacher String angezeigt, so dass die Daten auch für Entwickler leicht verständlich sind, die bisher nicht viel mit Linked Data gearbeitet haben.
  • Mittels "@container": "@set" wird festgelegt, dass bis auf wenige Ausnahmen alle Properties ein Array als Wert haben, auch wenn es nur ein Element als Wert gibt. Dadurch ist die Datenstruktur homogener und vorhersagbarer4. Im Zusammenspiel mit der Option compactArrays in JSON-LD ermöglicht dies eine gezielte Konfiguration einzelner Felder.

Framing

Außerdem nutzen wir einen einfachen JSON-LD Frame, um das JSON in eine hierarchische JSON-Struktur mit einem Wurzelelement zu bringen. Der Frame ist denkbar einfach:

{
  "@context": "http://lobid.org/gnd/context.jsonld",
  "@type": "AuthorityResource",
  "@embed": "@always"
}

Homogenisierung von Typen und Label-Properties

Damit das Framing bei jeder GND-Entität funktioniert, muss allen Entitäten der Typ AuthorityResource zugewiesen sein. Hier kommen wir zum Punkt, wo wir die Daten der DNB ergänzen, um bestimmte Funktionalitäten zu ermöglichen. Das von der DNB gelieferte RDF zum Eintrag von Hannah Arendt enthält folgende Informationen (in Turtle-Notation):

@prefix gndo: <https://d-nb.info/standards/elementset/gnd#> .

<https://d-nb.info/gnd/11850391X> a gndo:DifferentiatedPerson ;
  gndo:preferredNameForThePerson "Arendt, Hannah" ;
  gndo:variantNameForThePerson "Blücher, Johanna" .

Wie man sieht, wird hier nur die spezifische Klasse (gndo:DifferentiatedPerson) angegeben und typspezifische Properties (gndo:preferredNameForThePerson, gndo:variantNameForThePerson) zur Angabe der Ansetzungs- und Verweisungsformen verwendet. Dies mag für eine Abfrage der Daten über einen SPARQL-Endpoint ausreichend sein, weil die GND-Ontologie die Informationen enthält, welches die Überklassen und -Properties sind und somit mit Hilfe von Reasoning auch entsprechende Abfragen funktionieren.

Für eine einheitliche Abfrage der Ansetzungsformen aller GND-Entitäten in einem Suchmaschinenindex bzw. über eine Web-API und die Bereitstellung von Filtermöglichkeiten nach Oberklassen (Person, Schlagwort, Körperschaft, Geografikum etc.) reicht das aber nicht aus. Deshalb verzichten wir zum einen auf die Nutzung der spezifischen Namen-Properties und zum anderen ergänzen wir die Überklassen im JSON-LD. Die entsprechenden Teile im JSON-LD zu Hannah Arendt sehen in lobid-gnd etwa so aus:

{
  "@context": "http://lobid.org/gnd/context.jsonld",
  "id":"https://d-nb.info/gnd/11850391X",
  "type":[
    "DifferentiatedPerson",
    "AuthorityResource",
    "Person"
  ],
  "preferredName":"Arendt, Hannah",
  "variantName":[
    "Blücher, Johanna",
    "..."
  ]
}

Labels für verlinkte Ressourcen

Im JSON-LD wird zu jeder in Beziehung gesetzten GND-Ressource sowie zu den GND-Sachgruppen und Ländercodes die entsprechende Ansetzungsform wie in den anderen lobid-Diensten als label mitgeliefert. Beim Eintrag zu Hannah Arendt gibt es unter anderen einen Link auf den Sterbeort, auf verschiedene Berufe/Beschäftigungen, auf drei GND-Sachgruppen und auf verwandte Personen. Wo im RDF der GND nur URIs zu finden sind, sieht es in lobid-gnd wie folgt aus:

{
  "@context": "http://lobid.org/gnd/context.jsonld",
  "id":"https://d-nb.info/gnd/11850391X",
  "placeOfDeath":[
    {
      "id":"https://d-nb.info/gnd/4042011-5",
      "label":"New York, NY"
    }
  ],
  "familialRelationship":[
    {
      "id":"https://d-nb.info/gnd/119378418",
      "label":"Blücher, Heinrich"
    },
    {
      "id":"https://d-nb.info/gnd/118502751",
      "label":"Anders, Günther"
    }
  ],
  "gndSubjectCategory":[
    {
      "id":"https://d-nb.info/standards/vocab/gnd/gnd-sc#4.7p",
      "label":"Personen zu Philosophie"
    }
  ],
  "geographicAreaCode":[
    {
      "id":"https://d-nb.info/standards/vocab/gnd/geographic-area-code#XA-DE",
      "label":"Deutschland"
    }
  ]
}

Dies ermöglicht es API-Nutzer/innen auf einfache Weise, menschenlesbare Labels in Anwendungsoberflächen anzuzeigen anstatt bloße URIs. Es macht zudem die Suche nach Einträgen mit diesen Labels (z.B. Schriftsteller) überhaupt erst möglich wie auch Performance-kritische Anwendungsfälle, bei denen zusätzliche Lookups zu Ermittlung der Labels nicht praktikabel wären. So verwendet etwa die oben beschriebene Vorschlagsfunktion die Labels zum schnellen Auffinden des gesuchten Eintrags.

Neben dem GND-RDF stellt die DNB mit EntityFacts einen Dienst bereit, der einfaches JSON-LD zu Personen, Körperschaften und Geographika aus der GND anbietet, angereichert um Links zu anderen Datenanbietern (Wikidata, ORCID, BnF etc.) sowie zu Abbildungen einer GND-Entität auf Wikimedia Commons. Die Bereitstellung eines Dumps der EntityFacts-Daten seitens der DNB hat uns dazu ermutigt, diese zusätzlichen Informationen zu ergänzen.5 Im Beispiel Hannah Arendt sind dies unter anderem folgende Informationen:

{
  "id":"https://d-nb.info/gnd/11850391X",
  "depiction":[
    {
      "id":"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg",
      "url":"https://commons.wikimedia.org/wiki/File:Hannah_arendt-150x150.jpg?uselang=de",
      "thumbnail":"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg?width=270"
    }
  ],
  "sameAs":[
    {
      "collection":{
        "abbr":"BNF",
        "name":"Bibliothèque nationale de France",
        "publisher":"Bibliothèque nationale de France",
        "icon":"http://www.bnf.fr/bnf_dev/icono/favicon.ico",
        "id":"http://www.wikidata.org/entity/Q19938912"
      },
      "id":"http://catalogue.bnf.fr/ark:/12148/cb118890622"
    },
    {
      "collection":{
        "abbr":"WIKIDATA",
        "name":"Wikidata",
        "publisher":"Wikimedia Foundation Inc.",
        "icon":"https://www.wikidata.org/static/favicon/wikidata.ico",
        "id":"http://www.wikidata.org/entity/Q2013"
      },
      "id":"http://www.wikidata.org/entity/Q60025"
    }
  ]
}

Mit diesen Anreicherungen kann auf der Basis von Identifikatoren Dritter in lobid-gnd gesucht werden, etwa anhand einer ORCID oder eines ISNI. Mit den Bildern können Einträge wie z.B. Autorenseiten illustriert werden.6

Web-API

Das im vorherigen Abschnitt beschriebene JSON-LD indexieren wir in einen Elasticsearch-Suchmaschinenindex und bieten die Elasticsearch-Abfragesprache für Suchanfragen und zum Filtern an. Somit sind nützlichen Elasticsearch-Funktionen für interessierte Nutzer verfügbar wie z.B. Unterstützung der Lucene Query Language und exists-Abfragen. Eine Dokumentation der Elasticsearch query_string DSL findet sich hier. Darauf aufsetzend bieten wir auch einen Parameter für Auto-Suggest, dessen Rückgabefelder bei Bedarf angepasst werden können.

Für eine detaillierte API-Beschreibung verweisen wir auf die in Entstehung befindliche Dokumentation unter https://lobid.org/gnd/api. Im Folgenden seien nur ein paar Beispiel-Abfragen genannt, wobei durch Ergänzung von format=json auch im Browser JSON-LD angezeigt werden kann:

Rückmeldungen erwünscht

lobid-gnd möchte die GND als Linked Open Usable Data anbieten. Die Daten sollen einfach zu nutzen sein, für Anwendungsentwickler/innen über die API und für Endnutzer/innen über eine intuitive Oberfläche. Wir freuen uns über jegliche Rückmeldungen, seien es Verbesserungsvorschläge, Bug-Meldungen, Lobhudeleien oder Verrisse. Bitte teilen Sie uns über Anmerkungen zu diesem Beitrag mit hypothes.is, per E-Mail oder Twitter mit, wie sie die Daten gerne nutzen würden, welche Funktionen Ihnen fehlen oder wo Sie einen Bug entdeckt haben.


1 In der Version 1.x wurden GND-Entitäten noch über den /subject-Endpoint angeboten und es gab einen Endpoint nur für die GND-Personen (/person). Jetzt gibt es Zugriff auf alle GND-Entitäten über https://lobid.org/gnd.

2 Siehe auch die Dokumentation der Elasticsearch Query String Syntax.

3 Für Details siehe etwa die Tickets #1, #2, #3, #24, #69, #101. Zum Teil waren die Anpassungen durch Inkonsistenzen in den Ausgangsdaten nötig, was wir zum Anlass genommen haben, Verbesserungen vorzuschlagen (u.a. auf der GND-Ontology-Mailingliste).

4 Dies spielt etwa für die Indexierung in Elasticsearch eine Rolle, da hier ein bestimmtes Feld immer den gleichen Datentypen (z.B. Array) haben muss. Auch bei der Nutzung der API erleichtert dies die Verarbeitung, da für ein bestimmtes Feld immer von einem identischen Typ ausgegangen werden kann.

5 Für Details zur Umsetzung siehe Ticket #69.

6 Wobei zu beachten ist, dass die Attributions- und Lizenzinformationen zu den Bildern nicht mitgeliefert werden, sondern von der Wikimedia Commons API geladen werden müssen. Zur Umsetzung siehe z.B. diesen Kommentar und unsere aktuelle Implementierung.

Comments? Feedback? Just add an annotation with hypothes.is.