【发布时间】:2013-10-30 11:02:03
【问题描述】:
我有两个班级,A 和 B,来自 DBpedia。如何计算每个类到公共超类 C 的距离(边数),如何找到这个公共超类?
【问题讨论】:
我有两个班级,A 和 B,来自 DBpedia。如何计算每个类到公共超类 C 的距离(边数),如何找到这个公共超类?
【问题讨论】:
您可以这样做,但首先应注意以下几点:
A 类 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 子类的长度,您应该使用哪一个?
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 的长度和从 @987654335 的长度@ 到 ?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
【讨论】:
yago:PeopleFromSantiago 写成一个,dbpedia-owl:Writer 写成另一个。
rdfs:subClassOf 链接。确实,这是一件非常困难的事情,因为类定义可能非常微妙。