Jena Sparql只返回实例的直接超类

时间:2015-03-19 20:54:46

标签: java sparql owl pellet apache-jena

我正在使用Java中的Jena和Pellet作为推理者。现在我需要查询特定URI的类,但问题是我之前不知道它是什么类型的实例,在什么类的层次结构中,所以我不能使用过滤器选项。使用时:

SELECT * WHERE {<" + uri + "> rdf:type ?x}

它返回所有超类。我对此特定示例的层次结构如下所示:

-Thing
 -Person
  -Adult
 -Animal
  -Dog

每个班级都有多个实例。我不知道我事先要查询的是什么样的实例。但是,比方说,我正在查询一个类型为Dog的实例的URI。它也将归还Animal and Thing。但我只想让它归还狗。那可能吗?使用LIMIT 1只返回直接超类。

1 个答案:

答案 0 :(得分:2)

有一种简单的方法可以使用Jena提供一个特殊谓词来查询直接类型,因此在您的代码中,您可以按如下方式生成查询:

  "SELECT * { <" + ind + "> <" + ReasonerVocabulary.directRDFType + "> ?type }"

或直接在查询中直接使用此谓词的URI:

  SELECT * { <ind> <urn:x-hp-direct-predicate:http_//www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type }

也可以编写一个相当低效但可移植的SPARQL查询来查询直接类型:

  PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
  PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
  PREFIX owl: <http://www.w3.org/2002/07/owl#> 
  SELECT * { 
    <ind> rdf:type ?directType .
    FILTER NOT EXISTS {
      <ind> rdf:type ?type .
      ?type rdfs:subClassOf ?directType .
      FILTER NOT EXISTS {
         ?type owl:equivalentClass ?directType .
      }
    }
  }

如果没有其他类型的个体属于此类型的子类,则类是个体的直接类型。但是直接类型可能具有相同的类。要处理这些情况,我们必须在查询中使用双重否定。此查询效率低下,因为它首先检索个人的所有类型并过滤不直接的类型。但从好的方面来说,你可以将它用于Jena以外的系统,它不提供专用的直接类型谓词。