SPARQL查询使用REGEX实现首字母大写转换时UCASE失效问题
根因说明
SPARQL 规范规定函数参数必须在函数执行前完成求值,这是你当前写法失效的核心原因:
- 你传入
replace的第三个参数ucase("$1")会先被独立求值:字面量"$1"转为大写后仍然是"$1",实际传入replace的替换字符串就是普通的"$1" - 这就导致
replace执行时只会把匹配到的首字母替换为本身,看不到任何大写效果 - 当你替换为
ucase("aaa")时,参数先求值得到"AAA"再传入replace,所有匹配到的首字母都会被替换为AAA,和你观察到的现象完全一致。
修复方案
方案1:调用内置转换函数(首选)
绝大多数SPARQL端点(包括Agrovoc使用的Virtuoso引擎)都内置了开箱即用的标题大小写转换函数strtitle(),直接调用即可实现需求,无需自定义正则:
BIND (strtitle(?label) as ?title_case)
该方案效率最高,兼容性最好,能自动处理各种常见分隔符的单词大写转换。
方案2:手动实现转换(无内置函数时使用)
如果你使用的SPARQL环境没有提供内置的标题转换函数,可以通过分步处理的方式避开参数预求值的问题:
# 第一步:先将整个字符串转为小写 BIND (lcase(?label) as ?lower_str) # 第二步:转换字符串首字母为大写 BIND ( concat( ucase(substr(?lower_str, 1, 1)), substr(?lower_str, 2) ) as ?first_cap ) # 第三步:转换所有空格后紧跟的字母为大写 BIND ( replace(?first_cap, "\\s([a-z])", " \\U$1") as ?title_case )
注:第三步的\\U转义符需要SPARQL引擎支持Perl兼容正则,绝大多数主流引擎都支持该语法。
内容的提问来源于stack exchange,提问作者Menelao
相关产品推荐
相关产品推荐

