如何解决使用 sparql 清除 rdf4j 中的内部字符串缓存
为了避免可能出现的“XY 问题”,让我解释一下我的真正目标:我正在尝试使用 sparql 更改 rdf4j 存储库中语言标签的大小写。但是,尽管 rdf4j 将语言标签存储为定义时编写的语言标签,但它知道足以将它们视为标准规定的不区分大小写。所以它将我尝试的编辑视为无操作:
设置:
INSERT DATA { test:a skos:prefLabel "hello"@EN }
尝试:
DELETE { test:a skos:prefLabel "hello"@EN }
INSERT { test:a skos:prefLabel "hello"@en }
WHERE
{ test:a skos:prefLabel "hello"@EN }
结果:
这个查询什么都不做。语言标签仍拼写为 EN
。
有趣的是,如果我执行两个单独的查询,这也会失败:
查询 1:
DELETE DATA { test:a skos:prefLabel "hello"@EN }
查询 2:
INSERT DATA { test:a skos:prefLabel "hello"@en }
显然,已删除的字符串保留在内部缓存中并被重新激活,因此我的 INSERT 查询重新激活 "hello"@EN
。重启会清除缓存,但这不是最好的用户体验...
现在,使用一些旧版本的 rdf4j,我可以使用魔法命令 CLEAR SILENT GRAPH <urn:uri:cache>
清除这个内部缓存。但这似乎不适用于 rdf4j 2.3.3,这是我们目前所坚持的。还有没有办法在不重启的情况下清除字符串缓存,或者以任何其他方式更改语言标签的大小写?
PS 我发现 this interesting thread 关于语言标签中大小写的处理;但它并没有让我更接近解决方案。
解决方法
乍一看,这对我来说似乎是一个错误,这是我们几年前为允许在语言标签 (https://openrdf.atlassian.net/browse/SES-1659) 中保留大小写而进行的修复的意外结果。
我不确定是否有任何仅适用于 SPARQL 的解决方法,因此请随时在 https://github.com/eclipse/rdf4j/issues 上记录错误报告/功能请求。
话虽如此,RDF4J 确实具有规范化语言标签的功能。特别是,RDF 解析器可以配置为规范化语言标签(参见 Rio configuration documentation),此外还有一个实用方法 Literals.normalizeLanguageTag
,您可以使用它来将任何语言标签转换为标准规范形式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。