Как написать запрос 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 секунды). К сожалению, для некоторых условий мне нужно выполнить этот запрос без учета регистра. Например, поскольку в онтологии есть метка "Tylenol", а не "tylenol", следующий запрос оказывается пустым:

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

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


person lmsurprenant    schedule 18.05.2012    source источник
comment
Вы не говорите, какое программное обеспечение вы используете. Многие хранилища RDF имеют параметры индексации текста, которые более эффективны для текстового поиска, чем regex().   -  person Steve Harris    schedule 19.05.2012
comment
@SteveHarris Я обновил вопрос, включив в него технологии, которые использую. Первоначально я надеялся, что мне просто не хватает какой-то функции SPARQL, но теперь я думаю, что мне нужно будет изучить параметры индексации текста, как вы предлагаете, так что спасибо за совет.   -  person lmsurprenant    schedule 21.05.2012


Ответы (2)


Причина, по которой запрос с запросом FILTER выполняется медленнее, заключается в том, что ?term не связан, для этого требуется сканирование индекса PSO или POS, чтобы найти все операторы с предикатом rdfs:label и отфильтровать их по регулярному выражению. Когда он был привязан к конкретному ресурсу (в вашем первом примере), он мог бы использовать индекс OPS или POS для сканирования только операторов с предикатом rdfs:label и указанным ресурсом объекта, который имел бы гораздо меньшую кардинальность.

Распространенным решением проблемы поиска текста такого типа является использование внешнего текстового индекса. В этом случае Jena предоставляет свободный текстовый указатель под названием LARQ, в котором используется Lucene для выполнения поиска и объединения результатов с остальной частью запроса.

person sallen    schedule 31.05.2012
comment
Этот ответ верен, но он не дает самого простого ответа на вопрос ОП. Есть ли способ более эффективно написать запрос без учета регистра? ответ msalvadores показывает, что есть более эффективный способ, чем regex. - person Joshua Taylor; 07.12.2013

Из всех возможных строковых операторов, которые вы можете использовать в SPARQL, regex, вероятно, самый дорогой. Ваш запрос может выполняться быстрее, если вы избегаете regex и вместо этого используете UCASE или LCASE на обеих сторонах теста. Что-то типа:

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 (lcase(str(?term)) = "tylenol")
}

Это может быть быстрее, но в целом не ожидайте высокой производительности для текстового поиска с любым тройным хранилищем. Тройные хранилища очень хороши для сопоставления графов и не так хороши для сопоставления строк.

person Manuel Salvadores    schedule 19.05.2012
comment
Возможно, это было немного быстрее, но все равно было на несколько порядков медленнее, чем версия без фильтра. Спасибо за вдумчивый ответ, но мне, возможно, придется изучить параметры индексации строк. - person lmsurprenant; 21.05.2012
comment
Когда я увидел этот вопрос, это именно тот ответ, который я искал. Нормализация строк (путем понижения регистра) и проверка должны выполняться значительно быстрее, чем запрос с регулярным выражением. +1. - person Joshua Taylor; 07.12.2013