使用sparql清除rdf4j中的内部字符串缓存

使用sparql清除rdf4j中的内部字符串缓存,sparql,rdf4j,Sparql,Rdf4j,为了避免可能出现的“XY问题”,让我解释一下我的真正目标:我正在尝试使用sparql更改rdf4j回购中语言标记的大小写。但是,尽管rdf4j存储定义时编写的语言标记,但它知道的足够多,可以按照标准要求将它们视为不区分大小写的。因此,它将我尝试的编辑视为无操作: 设置: INSERT DATA { test:a skos:prefLabel "hello"@EN } DELETE { test:a skos:prefLabel "hello"@EN }

为了避免可能出现的“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 }
DELETE DATA { test:a skos:prefLabel "hello"@EN } 
INSERT DATA { test:a skos:prefLabel "hello"@en }
尝试:

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 }
DELETE DATA { test:a skos:prefLabel "hello"@EN } 
INSERT DATA { test:a skos:prefLabel "hello"@en }
结果:
这个查询没有任何作用。语言标记仍然拼写为
EN
。 有趣的是,如果我执行两个单独的查询,这也会失败:

查询1:

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 }
DELETE DATA { test:a skos:prefLabel "hello"@EN } 
INSERT DATA { test:a skos:prefLabel "hello"@en }
查询2:

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 }
DELETE DATA { test:a skos:prefLabel "hello"@EN } 
INSERT DATA { test:a skos:prefLabel "hello"@en }
显然,删除的字符串保留在内部缓存中并被重新恢复,因此我的INSERT查询将重新恢复
“hello”@EN
。重新启动将清除缓存,但这不是最好的UX

现在,对于一些旧版本的rdf4j,我可以使用神奇的命令
clear SILENT GRAPH
清除这个内部缓存。但这似乎不适用于rdf4j 2.3.3,这正是我们目前面临的问题。还有没有办法不重新启动就清除字符串缓存,或者以任何其他方式更改语言标记的大小写?


PS我在语言标签中找到了关于案例处理的信息;但这并没有让我更接近一个解决方案。

乍一看,这在我看来像是一个bug,是我们几年前为允许保留语言标记中的大小写而进行的修复的意外结果()

我不确定是否有任何仅SPARQL的解决方法,因此请随时记录错误报告/功能请求


话虽如此,RDF4J当然具有规范化语言标记的功能。特别是,RDF解析器可以配置为规范化语言标记(请参阅),此外还有一个实用方法
Literals.normalizeLanguageTag
,您可以使用它将任何语言标记转换为标准规范形式。

您使用了哪个版本的RDF4J
清除静默图
技巧?我不记得曾经有过这样的功能……它的工作版本应该是2.3.3——与现在无法工作的版本相同。我最好的猜测是,这实际上是一个早期版本。我需要调查一下区别是什么。谢谢!我会的。在存储之前规范化语言标记肯定是一条可行之路,但不幸的是,这对使用rdf4j存储的早期或当前软件版本没有帮助。所以我仍然在寻找解决方案。问题是,在引入案例保留之后,清除缓存在很长一段时间内都是有效的。一定是别的什么东西打破了改变。。。但是,您能否确定是否不能再从sparql中清除缓存,或者是否有其他东西妨碍了我的方法?问题是,我不记得清除缓存是一项功能。你能检查一下这个rdf4j的哪个版本适合你吗?希望这样我可以重建它发生了什么,谢谢!我将提交一个记录单。该命令在我们产品的早期版本中工作,该版本应该嵌入rdf4j 2.3.3——与现在无法工作的版本相同。我最好的猜测是,这实际上是几个未成年人之前。我会调查的,我会传下去的,谢谢。我确实注意到了当前的RDF4J版本,并对此感到相当惊讶(我不在开发团队中)