首页 > 解决方案 > SPARQL 中用于操作 IRI 的函数?

问题描述

我想编写一些可重用的 SPARQL 查询来执行诸如获取 IRI、获取名称部分(通常在 # 符号之后)、修改它(例如,用空格替换下划线)并将其放在 rdfs:label 属性中。如果您使用用户定义的 IRI,这对于不填写 rdfs:label 的 Protege 很有用。或者使用用户定义的名称获取 IRI,执行相同操作,然后将用户定义的 IRI 替换为 UUID。我在 SPARQL 规范中查看了用于操作 IRI 的函数,它们要么不存在,要么我遗漏了一些明显的东西。我发布这个以确保它不是后者。我知道用 SUBSTR 之类的东西做同样的事情很容易,但我很惊讶没有

标签: sparqliri

解决方案


万一其他人想这样做,我想通了。这个站点上有一些答案,但它们都是针对 SQL 或 SPARQL 以外的其他语言的。以下是针对类的,应该很明显如何将其适应于其他实体。注意:这适用于 Protege 的 Snap SPARQL 插件(这就是我使用 CONSTRUCT 而不是 INSERT 的原因),但是,在他们的 SUBSTR 实现中存在一个错误,因此它使用基于 0 的索引,而不是规范中所说的基于 1 的索引。因此,如果您在 Snap SPARQL 中使用它,请将 1 更改为 2。

CONSTRUCT {?c rdfs:label ?lblname.}
WHERE {?c rdfs:subClassOf owl:Thing.
        BIND(STRAFTER(STR(?c), '#') as ?name)
        BIND(REPLACE(?name,"([A-Z])", " $1" ) as ?namewbs)
        BIND (IF (STRSTARTS(?namewbs," "),SUBSTR(?namewbs,1),?namewbs) AS ?lblname)
        FILTER(?c != owl:Thing || ?c != owl:Nothing)}   

推荐阅读