Как написать запрос SPARQL, который эффективно сопоставляет строковые литералы, игнорируя регистр

Я использую Jena ARQ для написания запроса SPARQL к большой онтологии, считываемой из Jena TDB, чтобы найти типы, связанные с концепциями на основе метки rdfs:

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 .
}

Это работает довольно хорошо и на самом деле довольно быстро (<1 секунды). К сожалению, для некоторых условий мне нужно выполнить этот запрос без учета регистра. Например, поскольку метка «Тайленол»есть в онтологии, но отсутствует «тиленол», следующий запрос оказывается пустым:

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 .
}

Я могу написать версию без учета регистра. этого запроса с использованием синтаксиса FILTER следующим образом:

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") )
}

Но теперь выполнение запроса занимает больше минуты! Есть ли способ написать запрос без учета регистра более эффективным образом?

14
задан Joshua Taylor 7 December 2013 в 18:09
поделиться