我有两个类,A和B,来自DBpedia。如何计算从每个类到公共超类C的距离(边数),以及如何找到这个常见的超类?
答案 0 :(得分: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的另一个子类的长度,你应该使用哪一个呢?
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
}
}
该查询仍然会找到所有公共超类的路径长度,而不仅仅是大多数特定超类,并且仍然没有将?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
a b super length
Person SportsTeam Agent 3