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

Java Jena Sparql只返回实例的直接超类,java,sparql,owl,pellet,apache-jena,Java,Sparql,Owl,Pellet,Apache Jena,我在Java中使用Jena和Pellet作为推理机。现在我需要查询特定URI的类,但问题是,我不知道它是什么样的实例,在什么样的类层次结构中,所以我不能使用过滤器选项。使用时: SELECT * WHERE {<" + uri + "> rdf:type ?x} 每个类都有多个实例。我不知道我在查询什么样的实例。但让我们假设,例如,我正在查询一个实例的URI,该实例是一个类型为Dog的实例。它还将返回动物和东西。但我只想让它把狗还给我。可能吗?使用LIMIT 1只返回直接超类。Je

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

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

每个类都有多个实例。我不知道我在查询什么样的实例。但让我们假设,例如,我正在查询一个实例的URI,该实例是一个类型为Dog的实例。它还将返回动物和东西。但我只想让它把狗还给我。可能吗?使用LIMIT 1只返回直接超类。

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 }
SELECT*{?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 .
      }
    }
  }
前缀rdf:
前缀rdfs:
前缀owl:
选择*{
rdf:type?directType。
筛选器不存在{
类型?类型。
?类型rdfs:子类?directType。
筛选器不存在{
?类型owl:等效类?directType。
}
}
}
如果没有其他类型的个体是该类型的子类,则类是个体的直接类型。但直接类型可能具有等效的类。为了处理这些情况,我们必须在查询中使用双重否定。这个查询效率很低,因为它首先检索个人的所有类型,然后过滤非直接的类型。但从好的方面来说,除了Jena之外,您还可以将它用于不提供专用直接类型谓词的系统

  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 .
      }
    }
  }