Как сделать сопоставление, используя FILTER и регулярное выражение в sparql?

Я хотел бы сопоставить входные данные, заданные пользователем (String), со значением (String) определенного узла, существующего в файле rdf.

Я применил следующий точный режим для сопоставления (input=NodeValue):

 ...
 FILTER regex (?NodeValue,"userinput$","i").

для этого типа соответствия (input

...       
 FILTER regex (?NodeValue,".*userinput.*","i").

Итак, мой вопрос заключается в том, как установить мое регулярное выражение, чтобы получить тип соответствия, когда (input > NodeValue) я имею в виду запрос, который возвращает список? NodeValue, включенный данным пользовательским вводом.

Например. если пользователь вводит patagoniaisbeautiful это возвращается patagonia,

Заранее спасибо.

1 ответ

Решение

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

FILTER(REGEX("patagoniaisbeautiful", STR(?NodeValue), "i"))

Это удастся, если ?NodeValue это "Патагония". Конечно, это также будет соответствовать, если ?NodeValue это "р", "а", "т" и т. д.

Фактически, учитывая, что вас интересует только простое сопоставление подстрок, вы можете упростить это, используя CONTAINS функция вместо (вычислительно дорого) REGEX операция. Вот так:

FILTER(CONTAINS("patagoniaisbeautiful", LCASE(STR(?NodeValue))))

В качестве отступления: вы привели пример выполнения регулярного выражения, где пользовательский ввод является подстрокой значения базы данных: ".*userinput.*", Ведущий и закрывающий .* здесь нет необходимости. Совпадение с регулярным выражением SPARQL по определению является совпадением подстроки.

Другие вопросы по тегам