Sparql 检索每个OWL的unionOf和intersectionOf集合

Sparql 检索每个OWL的unionOf和intersectionOf集合,sparql,jena,owl,Sparql,Jena,Owl,我试图在一个OWL文件中提取intersectionOf和unionOf,其中intersectionOf和unionOf包含类的集合,someValuesFrom或onProperty。我创建了一个SPARQL查询,它为的交集提取“集合”,但问题是一些检索到的数据与类无关 例如,我有一个名为man的类。这个类有一个等价类,它是由三个类组成的的交集,即成人,人,和男性。我的SPARQL查询返回了一些不正确的结果:它返回的类成人,人和男性与类男性等价(即,此部分是正确的),但它们也是与我的OWL文

我试图在一个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           |            |
------------------------------------