Sparql 检索每个OWL的unionOf和intersectionOf集合
我试图在一个OWL文件中提取Sparql 检索每个OWL的unionOf和intersectionOf集合,sparql,jena,owl,Sparql,Jena,Owl,我试图在一个OWL文件中提取intersectionOf和unionOf,其中intersectionOf和unionOf包含类的集合,someValuesFrom或onProperty。我创建了一个SPARQL查询,它为的交集提取“集合”,但问题是一些检索到的数据与类无关 例如,我有一个名为man的类。这个类有一个等价类,它是由三个类组成的的交集,即成人,人,和男性。我的SPARQL查询返回了一些不正确的结果:它返回的类成人,人和男性与类男性等价(即,此部分是正确的),但它们也是与我的OWL文
intersectionOf
和unionOf
,其中intersectionOf
和unionOf
包含类的集合,someValuesFrom
或onProperty
。我创建了一个SPARQL查询,它为的交集提取“集合”,但问题是一些检索到的数据与类无关
例如,我有一个名为man
的类。这个类有一个等价类,它是由三个类组成的的交集,即成人
,人
,和男性
。我的SPARQL查询返回了一些不正确的结果:它返回的类成人
,人
和男性
与类男性
等价(即,此部分是正确的),但它们也是与我的OWL文件中的所有其他类(如拖运工人
)等效的类,这是不正确的。以下是我的SPARQL查询:
PREFIX abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
PREFIX ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX mno: <http://www.w3.org/2001/XMLSchema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>
SELECT Distinct ?class ?equivalentClass
WHERE{ ?class a owl:Class .
FILTER( STRSTARTS(STR(?class),"http://www.w3.org/2002/07/owl#") || STRSTARTS(STR(?class),"http://owl.cs.manchester.ac.uk/2009/07/sssw/people#")
)
?x a owl:Class ; owl:intersectionOf ?list .
?list rdf:rest*/rdf:first ?equivalentClass .
} GROUP BY ?class ?equivalentClass ORDER BY ?no
预期输出如下所示:
-----------------------------------------
| class | equivalentClass |
=========================================
| abc:adult | abc:adult |
| abc:adult | abc:male |
| abc:adult | abc:person |
| abc:haulage_company | |
| abc:haulage_company | |
| abc:haulage_company | |
| abc:haulage_worker | |
| abc:haulage_worker | |
| abc:haulage_worker | |
| abc:male | abc:adult |
| abc:male | abc:male |
| abc:male | abc:person |
| abc:man | abc:adult |
| abc:man | abc:male |
| abc:man | abc:person |
| abc:person | abc:adult |
| abc:person | abc:male |
| abc:person | abc:person |
| owl:Thing | |
| owl:Thing | |
| owl:Thing | |
-----------------------------------------
$ sparql --data data.rdf --query query.rq
------------------------
| class | otherClass |
========================
| abc:man | abc:adult |
| abc:man | abc:male |
| abc:man | abc:person |
------------------------
为了使我的输出与上一个表一样,我应该在SPARQL查询中更改哪些内容?稍微清理一下您的查询,我们有:
prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix mno: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix list: <http://jena.hpl.hp.com/ARQ/list#>
select distinct ?class ?equivalentClass where {
?class a owl:Class .
filter( strstarts(str(?class),str(owl:)) || # since "owl:" is an IRI, you can
strstarts(str(?class),str(abc:)) ) # use str(owl:) and str(:abc)
?x a owl:Class ;
owl:intersectionOf ?list .
?list rdf:rest*/rdf:first ?equivalentClass .
}
group by ?class ?equivalentClass
order by ?class # ?class, not ?no
您正在寻找的东西是owl:Class
es,通过owl:equivalentClass
与另一个owl:Class
相关,它有一个owl:intersectionOf
的列表值。这在SPARQL中并不难,查询实际上具有与此文本相同的结构:
prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix mno: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix list: <http://jena.hpl.hp.com/ARQ/list#>
select distinct ?class ?otherClass where {
?class a owl:Class ;
owl:equivalentClass [ a owl:Class ;
owl:intersectionOf [ rdf:rest*/rdf:first ?otherClass ] ] .
filter( strstarts(str(?class),str(owl:)) ||
strstarts(str(?class),str(abc:)) )
}
group by ?class ?otherClass
order by ?class
此查询仅检索相当于某些交集的类。您预期的结果显示其IRIs以abc:
或owl:
开头的所有类,这意味着额外的结构实际上是可选的,因此我们通过将可选部分包装在optional{…}中来相应地调整查询
,我们得到了我们想要的结果:
prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix mno: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix list: <http://jena.hpl.hp.com/ARQ/list#>
select distinct ?class ?otherClass where {
?class a owl:Class .
optional {
?class owl:equivalentClass [ a owl:Class ;
owl:intersectionOf [ rdf:rest*/rdf:first ?otherClass ] ] .
}
filter( strstarts(str(?class),str(owl:)) ||
strstarts(str(?class),str(abc:)) )
}
group by ?class ?otherClass
order by ?class
这真的应该作为旧问题的更新版本发布,但这确实是一个非常好的改进。感谢您花时间清理这一问题。(我投票将旧问题作为本问题的副本关闭,因为我们不需要两个问题都在附近。)亲爱的Joshua Taylor,它现在运行良好:)非常感谢您的帮助,我真的很感激。@AbdullahAlmuhaimeed我很高兴听到您的帮助!在堆栈溢出时,当一个答案对您有效时,您应该让其他人知道它解决了您的问题,并减少没有被接受答案的问题的数量。这也给了你和答案er一点声誉。约书亚·泰勒院长,很抱歉,我是Stack Overfollow网站的新手,我不知道我应该接受这个答案,当它与我一起工作时,我想我只需要在评论中回复就够了,对不起:)@AbdullahAlmuhaimeed没有什么可遗憾的!毕竟,每个人都是新来的!我很高兴这能帮助你。祝你快乐!非常感谢你的好意约书亚·泰勒:)。现在,我正致力于提取部分的unionOf,我尝试按照您的建议进行操作,它还不起作用,但我一直在尝试,我希望它能对我起作用:)
$ sparql --data data.rdf --query query.rq
------------------------
| class | otherClass |
========================
| abc:man | abc:adult |
| abc:man | abc:male |
| abc:man | abc:person |
------------------------
prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix mno: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix list: <http://jena.hpl.hp.com/ARQ/list#>
select distinct ?class ?otherClass where {
?class a owl:Class .
optional {
?class owl:equivalentClass [ a owl:Class ;
owl:intersectionOf [ rdf:rest*/rdf:first ?otherClass ] ] .
}
filter( strstarts(str(?class),str(owl:)) ||
strstarts(str(?class),str(abc:)) )
}
group by ?class ?otherClass
order by ?class
$ sparql --data data.rdf --query query.rq
------------------------------------
| class | otherClass |
====================================
| abc:adult | |
| abc:haulage_company | |
| abc:haulage_worker | |
| abc:male | |
| abc:man | abc:adult |
| abc:man | abc:male |
| abc:man | abc:person |
| abc:person | |
| owl:Thing | |
------------------------------------