您可以这样做,但首先应注意以下几点:
- 两个类可能有很多共同的超类,不一定只有一个。这意味着可能不存在唯一的最专业的公共超类。
- 如果某个类 C 是 A 和 B 的超类,则 C 的每个超类都是alsoA 和 B 的超类。
-
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 的另一个子类的长度,您应该使用哪一个?
- 数据中可能没有任何公共超类。这也是完全合法的情况。现在,in 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
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
}
}
该查询仍然找到路径长度all常见的超类,而不仅仅是最具体的超类,并且它仍然没有添加来自?a
to ?super
和长度从?b
to ?super
以获得完整的路径长度。但这只是一点算术。您可以按长度对这些结果进行排序,然后限制为仅一个结果,以便获得最短的结果。正如我所指出的,可能不存在唯一的最具体的常见子类,但长度最短的结果将是one最具体的常见子类。
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
a b super length
Person SportsTeam Agent 3