如何在 sparql 中使用 FILTER 和 regex 进行匹配?

How to make the matching using FILTER and regex in sparql?

我想将用户给出的输入 (String) 与 rdf 文件中存在的特定节点的值 (String) 进行匹配。

我应用了以下精确匹配模式(input=NodeValue):

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

对于这种类型的匹配(输入 < NodeValue )我使用了以下内容:

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

所以,我的问题是如何设置我的正则表达式以便在 (input > NodeValue) 时获得匹配类型我的意思是查询是 returns 由给定用户输入包含的 ?nodeValue 列表.

例如。如果用户输入 patagoniaisbeautiful 它 returns patagonia

提前致谢。

要实现数据库值是用户输入的子字符串的匹配,您需要翻转正则表达式函数的参数。这样,数据库中的实际值被用作正则表达式,用户输入作为匹配它的字符串:

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

如果 ?NodeValue 是 "patagonia",这将成功。当然,如果 ?NodeValue 是 "p"、"a"、"t" 等,它也会匹配

事实上,鉴于您在这里只对简单的子字符串匹配感兴趣,您可以使用 CONTAINS 函数来简化它,而不是(计算量大的)REGEX 操作。像这样:

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

顺便说一句:您举了一个执行正则表达式的示例,其中用户输入是数据库值的子字符串:".*userinput.*"。这里的开头和结尾 .* 是不必要的。根据定义,SPARQL 正则表达式匹配是子字符串匹配。