Wie schreibe ich eine SPARQL-Abfrage, die effizient mit String-Literalen übereinstimmt und dabei die Groß- und Kleinschreibung ignoriert?
Ich benutze Jena ARQ, um eine SPARQL-Abfrage gegen eine große Ontologie zu schreiben, die aus Jena TDB gelesen wird, um die Typen zu finden, die mit Konzepten auf der Basis von rdfs-Label verknüpft sind:
SELECT DISTINCT ?type WHERE {
?x <http://www.w3.org/2000/01/rdf-schema#label> "aspirin" .
?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}
Dies funktioniert ziemlich gut und ist eigentlich ziemlich schnell (<1 Sekunde). Leider muss ich diese Abfrage bei einigen Begriffen ohne Berücksichtigung der Groß- und Kleinschreibung durchführen. Zum Beispiel, weil das Etikett"Tylenol"
ist in der Ontologie, aber nicht"tylenol"
wird die folgende Abfrage leer angezeigt:
SELECT DISTINCT ?type WHERE {
?x <http://www.w3.org/2000/01/rdf-schema#label> "tylenol" .
?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}
Ich kann eine Version dieser Abfrage ohne Berücksichtigung der Groß- und Kleinschreibung schreiben, indem ich die FILTER-Syntax wie folgt verwende:
SELECT DISTINCT ?type WHERE {
?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
FILTER ( regex (str(?term), "tylenol", "i") )
}
Aber jetzt dauert die Abfrage mehr als eine Minute! Gibt es eine Möglichkeit, die Abfrage ohne Berücksichtigung der Groß- und Kleinschreibung effizienter zu schreiben?