如何为具有SPARQL的个人显示特定类?

时间:2014-09-11 16:53:35

标签: rdf sparql owl

我使用Protege来创建一个小的本体。

我从类A,类B和类C开始。类C包含子类x,y和z。填充此本体的个体属于两类:第一类是A或B,第二类是C的子类之一。

我想检索所有具有属性H的个体,它们也是x或y类的一部分,但不是z的一部分。我已经能够使用以下查询执行此操作:

SELECT ?individual
    WHERE {?individual ont:hasH ?individual.
        FILTER(NOT EXISTS { ?individual rdf:type ont:z } )}

(ont是我的本体的前缀)

此查询可以满足我的需求。但对于这些人,我还想知道他们是否属于x或y类。我已经尝试将我的查询更改为以下内容,但无济于事:

SELECT ?individual ?class
    WHERE {?individual ont:hasH ?individual.
        FILTER(NOT EXISTS { ?individual rdf:type ont:z } ) ?class rdf:type ont:C}

由于x和y属于C类,我需要知道所选个体的C类是什么。我怎么能这样做?

(请记住,我是SPARQL的新手。)

1 个答案:

答案 0 :(得分:2)

你说的一些事情让这个问题有点混乱:

  

我从类A,类B和类C开始。类C包含   子类x,y和z。

     

...

     

由于x和y属于C类,

我们通常不会说类包含子类;我们只是说一个类子类,或者一个类是另一个类的子类。当A是B的子类时,那么只要某个i是A(即,我们有三个[i rdf:A型]),那么我也是一个B(即,我们有三个[i rdf:B型] ])。

无论如何,您可以执行以下操作,找出具有ont:hasH属性但不是ont:z实例的每个人,无论是ont:x还是ont:y:

SELECT ?individual ?class WHERE {
  #-- The first part, which you already provided, ensures that 
  #-- ?individual has a value for ont:hasH, and does not have 
  #-- type ont:z .
  ?individual ont:hasH ?individual.
  FILTER( NOT EXISTS { ?individual rdf:type ont:z } )

  #-- Since each of these individuals also has type ont:x or
  #-- ont:y, you can bind a variable to ont:x and ont:y and 
  #-- match against it, too.  For each result, ?xy will be 
  #-- bound to either ont:X or ont:y, depending on what type 
  #-- ?individual has.
  values ?xy { ont:x ont:y }
  ?individual rdf:type ?xy
}