计算OWL本体中子类的深度

时间:2014-09-30 07:49:25

标签: rdf sparql owl

我正在寻找一个可以返回OWL层次结构中指定子类位置的SPARQL查询。我研究过几个例子,但我能达到的最好结果是计算指定超类与其子类(thanks to Joshua Taylor)之间的相对路径。而不是我需要计算给定子类的“绝对”深度。

我的本​​体包含几个顶级类,每个类都跟着一个单独的子类树。这是我的OWL的一部分(使用rdfcat实用程序转换为TTL):

@prefix :      <http://www.semanticweb.org/administrator/ontologies/2014/7/untitled-ontology-9#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

:depression  a              owl:Class ;
    rdfs:subClassOf  :pit .

:pit    a                owl:Class ;
    rdfs:subClassOf  :on_the_road .

:on_the_road  a            owl:Class ;
    rdfs:subClassOf  :traffic_accident .

:traffic_accident  a  owl:Class .

在这种情况下,对于给定的depression课程,我希望 3 pit - &gt; 2 on_the_road - &gt; 1 traffc_accident(顶级课程) - &gt; 0.

1 个答案:

答案 0 :(得分:4)

这里使用相同的方法来查找层次结构中类的深度(当然,假设每个类都有一个到根的唯一路径)。诀窍只是你首先需要找到层次结构的根源。您可以使用以下查询执行此操作以获得以下结果。

prefix : <http://www.semanticweb.org/administrator/ontologies/2014/7/untitled-ontology-9#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?class (count(?mid)-1 as ?depth) {
  #-- Select root classes (classes that have no
  #-- superclasses other than themselves).
  {
    select ?root {
      ?root a owl:Class
      filter not exists {
        ?root rdfs:subClassOf ?superroot 
        filter ( ?root != ?superroot )
      }
    }
  }

  ?class rdfs:subClassOf* ?mid .
  ?mid rdfs:subClassOf* ?root .
}
group by ?class
order by ?depth
-----------------------------
| class             | depth |
=============================
| :traffic_accident | 0     |
| :on_the_road      | 1     |
| :pit              | 2     |
| :depression       | 3     |
-----------------------------

请注意,如果您有理由,事情可能会有点复杂。如果你有一个推理器,那么<​​em>每个类,包括你的根,都是owl的子类:Thing,所以实际上只有一个根,所有的深度都将被关闭一个(来自你在问题中提到的)。您可以通过调整查询中找到?root。

值的过滤器来避免这种情况