2017-12-20 7 views
1

Ich habe versucht (mit keinem Erfolg bisher), Werte mit einer "breiteren gleich" Bedingung zu filtern. Das heißt, diakritische Zeichen zu ignorieren.Wie Werte zu vergleichen, ignorieren Diakritika, mit SPARQL

select * where { 
    ?s per:surname1 ?t. 
    bind (fn:starts-with(str(?t),'Maria') as ?noAccent1) . 
    bind (fn:translate(str(?t),"áéíóú","aeiou") as ?noAccent2) . 
} limit 100 

Zu diesem Zeitpunkt habe ich mit XPath Funktionen versucht fn:contains, fn:compare, fn:translate, fn:starts-with, aber keiner von ihnen scheinen zu funktionieren.

Gibt es einen anderen Weg (außer Verkettung replace s), Kollation in diese Funktionen hinzuzufügen oder das gleiche Ziel zu erreichen?

Antwort

0

Die XPath-Funktionen, die Sie erwähnen, sind nicht Teil des SPARQL-Standards. Wie Sie herausgefunden haben, können Sie sich nicht darauf verlassen, dass sie standardmäßig unterstützt werden (obwohl einige Hersteller sie als Add-On anbieten). .

Allerdings ermöglicht GraphDB (die auf RDF4J basiert) Ihnen create your own custom functions in SPARQL. Es geht darum, eine Java-Klasse zu schreiben, die die org.eclipse.rdf4j.query.algebra.evaluation.function.Function-Schnittstelle implementiert, und sie in der RDF4J-Engine zu registrieren, indem sie sie als SPI-Implementierung (Java Service Provider Interface) packt.

0

SPARQL und REGEX unterstützen keine effizient transliterierenden Zeichenkarten. Wenn Sie eine effiziente Implementierung wünschen, benötigen Sie eine benutzerdefinierte RDF4J-Anwendung, wie von Jeen beschrieben.

Wenn Sie eine schnelle und schmutzige Lösung dieses Codebeispiel verwenden:

PREFIX fn: <http://www.w3.org/2005/xpath-functions#> 
PREFIX spif: <http://spinrdf.org/spif#> 
select * where { 
    BIND("Mariana" as ?t) . 
    BIND("Márénísótú" as ?t2) . 
    BIND (regex(str(?t),'^Maria') as ?noAccent1) . 
    BIND (spif:replaceAll(
      spif:replaceAll(
       spif:replaceAll(
        spif:replaceAll(
         spif:replaceAll(str(?t2),"á","a"), 
         "é","e") 
        ,"í","i"), 
       "ó","o"), 
      "ú","u") as ?noAccent2) . 
} 
+0

Danke, aber ich kann auf einer Kette ersetzt nicht verlassen, da es wird nicht nur Umlaute in der Zukunft sein. Ich suchte nach einer "saubereren" Lösung, die einen zusammengestellten Vergleich implizierte – jbob

Verwandte Themen