如何解决在 SPARQL
以下 SPARQL 查询
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-Syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix msc: <http://msc.org/resources/MSC/msc2020/>
construct {?s skos:broader msc:00-XX . }
where
{
?s a skos:Concept ; skos:notation ?notation.
filter regex (?notation,"00-\d\d")
}
搜索所有符号 00-01、00-02 等,并构建与顶级类 00-XX 的关系。但是,这只是 63 个顶级类中的第一个,所以我想自动“循环”所有顶级类。最重要的是,我想将此适应其他模式。有没有办法用 SPARQL 做到这一点?如果没有,您会推荐什么?
解决方法
与此同时,我们找到了一个没有 SPARQL 的解决方案。 SPARQL CONSTRUCT 查询应该在 skos:Concept 与诸如“00-01”之类的符号(以及所有其他带有 00-\d\d 符号的概念)及其适当的从属概念之间创建一个 skos:broader 关系,对于 00 -01 是 skos:Concept,符号为 00-XX。
数据源自表,Open Refine 创建 skos:broader 语句比使用上面建议的 SPARQL 查询并将其调整为其他符号模式要快得多。
我们在带有符号的单元格上使用 GREL 的 value.replace 来创建一个新列:
value.replace(/-\d\d/,"-XX").replace(/\d\d>/,"xx>")
这两个替换让我们一步得到原始符号的上级概念的符号。第二个替换已经适应了问题中提到的其他模式(例如 00A01)。 使用原始符号和新列中的值,我们可以通过连接文本和两列中的值轻松创建 skos:broader 三元组。然后可以从 OpenRefine 导出这些内容,然后将其复制粘贴到我们的 SKOS 词汇表中。
,这是基于问题中的查询的 SPARQL 答案。需要使用过滤器和正则表达式(正如 Yahalnaut 在上面对 UninforomedUser 的回复中所建议的那样)。基于两个概念的符号创建 skos:broader 关系要求它们在 -
之前具有相同的数字序列。比较应该只在符号的第一部分之间进行,因此每个 00-
应该匹配另一个 00-
而不是 01-
。正如所问的,下面的解决方案仅将词汇表的 topConcepts 视为 skos:broader 的潜在对象。这些概念也不应该与它们本身相关,因此是最后一个过滤器。这也应该适用于其他模式。根据概念的数量和可用于查询的内存,这可能会持续一段时间甚至在完成之前停止。不过它省去了很多努力。
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix msc: <http://msc.org/resources/MSC/msc2020/>
construct {?s skos:broader ?y . }
where {
?s a skos:Concept ; skos:notation ?notation.
?y skos:topConceptOf msc: ; skos:notation ?not2.
bind (REPLACE (?not2,"-XX","") as ?1)
bind (REPLACE (?notation,"-\d\d","" ) as ?2 )
filter (?1 = ?2)
filter (?not2 != ?notation)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。