如何在 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 正则表达式匹配是子字符串匹配。
我想将用户给出的输入 (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 正则表达式匹配是子字符串匹配。