在 SPARQL 中构建循环

Construct loop in 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 等,并构造与顶级 class00-XX 的关系。但是,这只是总共 63 个顶级 classes 中的第一个,所以我想自动“循环”所有顶级 classes。最重要的是,我想让它适应其他模式。有没有办法用 SPARQL 做到这一点?如果没有,您会推荐什么?

与此同时,我们找到了一个没有 SPARQL 的解决方案。 SPARQL CONSTRUCT 查询应该在带有“00-01”等符号的 skos:Concept(以及所有其他带有 00-\d\d 符号的概念)与其适当的从属概念之间创建 skos:broader 关系,其中 00-01 是带有符号 00-XX 的 skos:Concept。

数据源自 table,Open Refine 创建 skos:broader 语句比使用上面提出的 SPARQL 查询并将其调整为其他符号模式要快得多。

我们在带有符号的单元格上使用 GREL 的 value.replace 来创建新列:

value.replace(/-\d\d/, "-XX").replace(/\d\d>/, "xx>")

这两个替换一步就给了我们原始符号的上级概念的符号。第二个替换已经适应问题中提到的其他模式(例如 00A01)。 使用原始符号和新列中的值,我们可以通过连接文本和来自两列的值轻松创建 skos:broader 三元组。这些可以从 OpenRefine 中导出,然后复制粘贴到我们的 SKOS 词汇表中。

这是一个基于问题查询的 SPARQL 答案。需要使用过滤器和正则表达式(正如 Yahalnaut 在评论中建议的那样,作为对上面 UninformedUser 的回复)。基于两个概念的符号创建 skos:broader 关系要求它们在 - 之前具有相同的数字序列。比较应该只在符号的第一部分之间进行,因此每个 00- 应该匹配另一个 00- 而不是 01-。正如所问,下面的解决方案仅将 Vocabulary 的 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)
}