【问题标题】:Calculate the depth of subclass in the OWL ontology计算OWL本体中子类的深度
【发布时间】:2014-09-30 07:49:24
【问题描述】:

我正在寻找可以返回指定子类在 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 类,我希望得到 3pit -> 2on_the_road -> 1,traffc_accident(顶级类)-> 0。

【问题讨论】:

    标签: rdf sparql owl


    【解决方案1】:

    同样的方法在这里也适用于查找层次结构中的类的深度(当然,假设每个类都有一个到根的唯一路径)。诀窍在于您首先需要找到层次结构的根。您可以使用以下查询来获得以下结果。

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

    请注意,如果您有推理机,事情可能会更复杂一些。如果你有一个推理器,那么 每个 类,包括你的根,都是 owl:Thing 的子类,所以实际上只有一个根,所有深度都会相差一个(根据您在问题中提到的内容)。您可以通过调整查找 ?root 值的查询中的过滤器来避免这种情况。

    【讨论】:

    • 这可能不是真的;只需要一些时间来习惯将事物的“直观”描述(层次结构的根)映射到 SPARQL 描述(没有传出 rdfs:subClassOf 边的节点(除了自身))。随着时间的推移,它会变得更容易。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多