SPARQL中的构造循环

SPARQL中的构造循环,sparql,ontology,protege,Sparql,Ontology,Protege,下面是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

下面是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")
}
前缀owl:
前缀rdf:
前缀rdfs:
前缀skos:
前缀msc:
构造{s skos:msc:00-XX.}
哪里
{
skos:概念;skos:符号?符号。
过滤器正则表达式(?表示法,“00-\d\d”)
}

搜索所有符号00-01、00-02等,并构造与顶级类00-XX的关系。然而,这只是63个顶级类中的第一个,所以我想自动“循环”所有顶级类。最重要的是,我想将其应用于其他模式。有没有办法用SPARQL实现这一点?如果没有,您会推荐什么呢?

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

数据来自一个表,与使用上面提出的SPARQL查询并将其调整为其他表示法模式相比,OpenRefine在创建skos:更广泛的语句方面要快得多

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

value.replace(/-\d\d/, "-XX").replace(/\d\d>/, "xx>")
这两个替换项在一个步骤中为我们提供了原始符号的上级概念的符号。第二次替换已适应问题中提到的其他模式(例如00A01)。
使用新列中的原始符号和值,我们可以通过将文本和两列中的值连接起来,轻松创建skos:更宽的三元组。然后可以从OpenRefine导出这些内容,并将其复制粘贴到我们的SKOS词汇表中。

以下是基于问题中的查询的SPARQL答案。需要使用过滤器和正则表达式(正如上面Yahalnaut对UninforomedUser的回复中所建议的那样)。创建skos:基于两个概念符号的更广泛关系要求它们在
-
之前具有相同的数字序列。比较只应在符号的第一部分之间进行,因此每个
00-
应匹配另一个
00-
,而不是
01-
。如前所述,下面的解决方案仅将词汇表的顶级概念视为SKO的潜在对象:更广泛。这些概念也不应该与其自身相关,因此最后一个过滤器。这也应该适用于其他模式。根据可用于查询的概念数量和内存,这可能会持续一段时间,甚至在完成之前停止。不过,它消除了很多努力

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)
}
前缀owl:
前缀rdf:
前缀rdfs:
前缀skos:
前缀msc:
构造{s skos:y.}
何处{
skos:概念;skos:符号?符号。
y skos:msc:的顶级概念;skos:符号?非2。
绑定(将(?not2,“-XX,”)替换为?1)
绑定(将(?符号“-\d\d”和“”替换为?2)
过滤器(?1=?2)
过滤器(?not2!=?符号)
}

只需在WHERE子句中选择所有顶级类即可。我的意思是,它基本上是笛卡尔积。只需使用与
?s
不同的变量获取顶级类,并使用它而不是硬编码类。DoneDo你是说像这样的问题吗<代码>前缀owl:前缀rdf:前缀rdfs:前缀skos:前缀msc:#第1级zu第2级-变量一个构造{s skos:更宽的y.}#选择*其中{s skos:概念;skos:符号?符号。?y skos:msc的topConceptOf:;skos:符号?not2.过滤器正则表达式(?notation,“00-\d\d”)过滤器正则表达式(?not2,“00-XX”)}但这并没有得到想要的结果。我不知道您的数据,但您认为
?y skos:topConceptOf msc:
应该做什么?我的意思是,
msc:
只是前缀,没有任何内容。这是您数据中的一个实体吗?为什么不通过将顶级类绑定到变量来获取所有顶级类?类似于
?y skos:topConceptOf?yy
-同样,我不知道您的数据,但不知怎么的,您应该能够通过图形模式识别顶级类,或者不识别?而且,说“没有得到想要的结果”也几乎是无用的。。。我们不知道您的数据,我们不知道查询返回什么,我们也不知道预期的结果-有意义,对吗?同样,在RDF数据集中,顶级类是如何建模的?是否有任何三元组已经表明一个类是顶级类?>什么是?y skos:topConceptOf msc:在你看来应该做什么?它提供所有与msc相关的资源:。理学硕士:是词汇吗?y是顶级类的变量,现在它像您建议的那样用于构造查询。