Text-Retrievalkomponente

Der GND-Komplettbestand auf dem RDF-Server enthält einen Lucene-Suchindex für das Text-Retrieval. Hiermit lassen sich "klassische" Freitext-Suchausdrücke in SPARQL-Anfragen einbetten. Die Text-Komponente erweitert SPARQL um folgende Möglichkeiten:

  • schnellere Abfragen über RDF-Literale im Vergleich zu SPARQL-Filterfunktionen
  • zusammengesetze, auch mit Klammern geschachtelte Suchausdrücke mit Mengenoperatoren
  • einfachere Maskierung von Suchtermen im Vergleich zu regulären Ausdrücken (REGEX) in SPARQL
  • zusammenfassende Suche über viele RDF-Properties in einem einzigen Suchausdruck
  • unscharfe Suche mit Einschluss fehlender, vertauschter oder eingefügter Zeichen.

Im derzeitigen Lucene-Suchindex sind 19 GNDO-Properties zu einem Textfeld "label" zusammengefasst. Dies sind alle Properties mit den Vorzugs-, Alternativ- und abgekürzten Benennungen sämtlicher GNDO-Klassen. Soll die Suche auf bestimmte GNDO-Klassen beschränkt werden, dann geschieht dies durch Verknüpfung mit gewöhnlichen Tripel-Mustern in SPARQL.

Einige der Möglichkeiten illustriert die folgende Abfrage. Gesucht seien die Namen sämtlicher der GND bekannten Könige und Königinnen von Polen.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX gnd: <http://d-nb.info/gnd/>
PREFIX gndo: <http://d-nb.info/standards/elementset/gnd#>
PREFIX text: <http://jena.apache.org/text#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

# getestet: 19-Jan-2019
SELECT DISTINCT ?gndid ?name WHERE 
{
  ?gndid text:query "(polen OR polska) AND (könig* OR król*)" ;
     a gndo:DifferentiatedPerson ;
     gndo:preferredNameForThePerson ?name
}

Zunächst suchen wir mit dem speziellen Prädikat text:query nach Bezeichnungen, die die Wörter "Polen" oder "Polska" in Verbindung mit "König" bzw. "Königin" oder "Król" bzw. "Królowa" enthalten. Dieses Ergebnis beschränken wir auf die GNDO-Klasse DifferentiatedPerson und erfragen den jeweiligen Vorzugsnamen.

Unscharfe Suche

Gesucht sei eine Firma namens Haberkamp oder so ähnlich. Wir nutzen hier eine besondere Syntaxform, um neben dem Aussagesubjekt (dem GND-Identifikator) auch eine Rangangabe (score) und anstelle der Vorzugsbenennung die im Index gefundene Benennung (literal) auszugeben. Der aktuell eingestellte Match-Algorithmus ermittelt die Damerau-Levenshtein-Distanz mit maximal zwei Vertauschungen. Da hierbei auch der Längenunterschied von Suchausdruck und Literal in die Berechnung eingeht, erhält der höchste match score nicht zwingend eine exakte Übereinstimmung mit dem Suchausdruck.

Die unscharfe Suche wird durch Anfügen einer Tilde (~) an das gesuchte Wort ausgelöst:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX gnd: <http://d-nb.info/gnd/>
PREFIX gndo: <http://d-nb.info/standards/elementset/gnd#>
PREFIX text: <http://jena.apache.org/text#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

# getestet: 19-Jan-2019 
SELECT DISTINCT ?gndid ?score ?literal WHERE 
{
  (?gndid ?score ?literal) text:query "haberkamp~" .
  ?gndid a gndo:CorporateBody 
}

Beschränkungen

Gegenwärtig (siehe Änderungsdatum dieser Seite) wird für den Text-Suchindex lediglich eine einfache Token-Zerlegung und der einfache Parser für Suchanfragen (Lucene queryparser.classic) verwendet. In dieser Konfiguration gibt es

  • keine Möglichkeit zur Phrasen-Suche (Wortfolgen)
  • eine voreingestellte Oder-Verknüpfung, wenn der Suchausdruck aus mehreren Wörtern ohne Verknüpfungsoperatoren besteht
  • keine automatische Umwandlung in die vom Suchindex verwendete Kleinschreibung.