1

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

4

1 回答 1

4

您可以这样做,但首先应注意以下几点:

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

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

    在此层次结构中,戴尔平板显示器是计算机硬件的子类,路径长度为 2(DFM → DH → CH)和路径长度为 3(DFM → FM → M →CH)。这很好,但是如果你要计算从 DFM 到另一个 CH 子类的长度,你应该使用哪一个?

  4. 数据中可能没有任何常见的超类。这也是一个完全合法的情况。现在,在 OWL 中,每个类都是一个子类owl:Thing,但这通常不适用于 RDF,而且您甚至可能不会从 DBpedia 获得该结果,因为没有附加 OWL 推理器。

假设您可以计算出解决这些问题所需的详细信息,这并不难。在我看来,一步一步构建这个查询是最简单的。首先,使用这样的查询,您可以获得一个类的超类,以及每个超类的路径长度。这确实假定从子类到超类的唯一路径。如果有多个路径,我认为报告的长度将是不同路径的总和。我不知道你怎么能解决这个问题。

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

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

该查询仍然找到所有常见超类的路径长度,而不仅仅是最具体的超类,并且它仍然没有添加从到的长度和从?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 结果

a      b          super length
Person SportsTeam Agent 3
于 2013-10-30T12:02:33.393 回答