Как сделать сопоставление, используя FILTER и регулярное выражение в sparql?
Я хотел бы сопоставить входные данные, заданные пользователем (String), со значением (String) определенного узла, существующего в файле rdf.
Я применил следующий точный режим для сопоставления (input=NodeValue):
...
FILTER regex (?NodeValue,"userinput$","i").
для этого типа соответствия (input Итак, мой вопрос заключается в том, как установить мое регулярное выражение, чтобы получить тип соответствия, когда (input > NodeValue) я имею в виду запрос, который возвращает список? NodeValue, включенный данным пользовательским вводом. Например. если пользователь вводит Заранее спасибо....
FILTER regex (?NodeValue,".*userinput.*","i").
patagoniaisbeautiful
это возвращается patagonia
,
1 ответ
Чтобы достичь совпадения, в котором значение базы данных является подстрокой вашего пользовательского ввода, вам нужно перевернуть аргументы для функции регулярного выражения. Таким образом, фактическое значение в базе данных используется как регулярное выражение, а пользовательский ввод - как строка, соответствующая этому:
FILTER(REGEX("patagoniaisbeautiful", STR(?NodeValue), "i"))
Это удастся, если ?NodeValue
это "Патагония". Конечно, это также будет соответствовать, если ?NodeValue
это "р", "а", "т" и т. д.
Фактически, учитывая, что вас интересует только простое сопоставление подстрок, вы можете упростить это, используя CONTAINS
функция вместо (вычислительно дорого) REGEX
операция. Вот так:
FILTER(CONTAINS("patagoniaisbeautiful", LCASE(STR(?NodeValue))))
В качестве отступления: вы привели пример выполнения регулярного выражения, где пользовательский ввод является подстрокой значения базы данных: ".*userinput.*"
, Ведущий и закрывающий .*
здесь нет необходимости. Совпадение с регулярным выражением SPARQL по определению является совпадением подстроки.