使用 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,您可以使用它来将任何语言标签转换为标准规范形式。