在类层次结构中查找公共超类和路径长度

时间:2013-10-30 11:02:03

标签: rdf sparql owl dbpedia

我有两个类,A和B,来自DBpedia。如何计算从每个类到公共超类C的距离(边数),以及如何找到这个常见的超类?

1 个答案:

答案 0 :(得分:3)

你可以这样做,但首先要注意几件事:

  1. 两个类可能有很多共同的超类,不一定只有一个。这意味着可能没有唯一最专业的公共超类。
  2. 如果某个C类是A和B的超类,那么C的每个超类是A和B的超类。
  3. D类可能是多个路径的C的超类,如果您尝试计算长度,可能会造成一些困难。例如,

    Computer Hardware
      Monitors
        Flatscreen Monitors
          Dell Flatscreen Monitors  *
      Dell Hardware
        Dell Flatscreen Monitors    *
    

    在此层次结构中,Dell Flatscreen Monitors是计算机硬件的子类,路径长度为2(DFM→DH→CH),路径长度为3(DFM→FM→M→CH)。那很好,但是如果你计算从DFM到CH的另一个子类的长度,你应该使用哪一个呢?

  4. 数据中可能没有任何常见的超类。这也是一个完全合法的情况。现在,在OWL 中,每个类都是一个子类owl:Thing,但一般不适用于RDF,你可能甚至不会从DBpedia获得结果,因为没有OWL推理员。
  5. 假设您可以找出解决这些问题所需的详细信息,这并不难。在我看来,最简单的方法是逐步构建此查询。首先,使用这样的查询,您可以获取类的超类,以及每个超类的路径长度。这确实假定存在从子类到超类的唯一路径。如果有多条路径,我认为报告的长度将是不同路径的总和。我不确定你怎么能解决这个问题。

    select ?sub ?super (count(?mid) as ?length) where {
      values ?sub { dbpedia-owl:Person } 
      ?sub rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?sub ?super
    

    SPARQL results

    sub                                super                               length
    http://dbpedia.org/ontology/Person http://dbpedia.org/ontology/Agent   1
    http://dbpedia.org/ontology/Person http://www.w3.org/2002/07/owl#Thing 2
    

    现在的诀窍是对这两个子类使用这种方法,然后使用这样的查询基于它们共有的超类加入结果:

    select * 
    {
      values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }
    
      { select ?a ?super (count(?mid) as ?aLength) { 
          ?a rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?a ?super
      }
      { select ?b ?super (count(?mid) as ?bLength) { 
          ?b rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?b ?super
      }
    }
    

    SPARQL results

    该查询仍然会找到所有公共超类的路径长度,而不仅仅是大多数特定超类,并且仍然没有将?a的长度添加到?super以及从?b?super的长度以获得完整路径长度。这只是一点算术。您可以按长度订购这些结果,然后限制为只有一个结果,这样您就可以得到最短的结果。正如我所指出的,可能没有唯一的最具体的公共子类,但是具有最短长度的结果将是一个的最具体的公共子类。

    select ?a ?b ?super (?aLength + ?bLength as ?length)
    {
      values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }
    
      { select ?a ?super (count(?mid) as ?aLength) { 
          ?a rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?a ?super
      }
      { select ?b ?super (count(?mid) as ?bLength) { 
          ?b rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?b ?super
      }
    }
    order by ?length
    limit 1
    

    SPARQL results

    a      b          super length
    Person SportsTeam Agent 3