DBpedia 不使用skos:subject 表示资源,而是使用dcterms:subject 将资源与其维基百科类别相关联。您可以通过浏览资源页面找出可用的数据。例如,您可以查看http://dbpedia.org/resource/Mount_Monadnock。如果要查找两种资源共有的类别,只需使用相同的变量即可。例如,
?subject1 dcterms:subject ?category .
?subject2 dcterms:subject ?category .
您可以使用^property 符号和对象列表更简洁地编写它。写o ^p s 和写s p o 是一样的。对象列表允许您编写 s p o1, o2 而不是 s p o1. s p o2.。把这些放在一起,我们可以写:
?category ^dcterms:subject ?subject1, ?subject2 .
例如,这是一个查找莫纳德诺克山和斯波福德湖常见类别的查询。只有一个结果,新罕布什尔州柴郡县的地貌,因为它们只有一个共同点。
select * where {
?category ^dcterms:subject dbpedia:Mount_Monadnock, dbpedia:Spofford_Lake .
}
SPARQL results
现在,类别通过skos:broader 与 DBpedia 中的超类别相关,您可以在 http://dbpedia.org/page/Category:Landforms_of_Cheshire_County,_New_Hampshire 中看到,其中有指向
现在,这意味着如果两个事物有一些共同的类别(或超类别),则每个事物都将通过以 dcterms:subject 链接开头并后跟零个或多个 skos:broader 链接的路径相关联。因此,您可以使用类似
的查询
select * where {
?category ^(dcterms:subject/skos:broader*) dbpedia:Mount_Monadnock, dbpedia:Spofford_Lake .
}
不幸的是,您会发现 DBpedia 端点在该查询中遇到了内存使用问题,因此您不能完全那样运行它。然而,DBpedia SPARQL 端点支持一个实际上并没有成为标准的属性路径特性;你可以写p{n,m}来表示一个长度至少为n和最多m的链。这意味着您可以设置一些范围,以获得与* 相同的结果:
select distinct ?category where {
?category ^(dcterms:subject/(skos:broader{0,3})) dbpedia:Mount_Monadnock, dbpedia:Spofford_Lake .
}
SPARQL results
这也适用于汤姆克鲁斯和麦当娜,但由于内存问题,您需要稍微缩减路径长度。例如,以下查询返回 74 个结果。
select distinct ?category where {
?category
^(dcterms:subject/(skos:broader{0,2}))
<http://dbpedia.org/resource/Tom_Cruise>,
<http://dbpedia.org/resource/Madonna_(entertainer)> .
}
SPARQL results
值得注意的是,维基百科的类别不是类型。因此,虽然这两种资源都被正确地视为地貌,但 都不是地理,或者,正如您将在后面的查询中看到的那样,新罕布什尔州。维基百科类别更多地是关于主题而不是类型层次结构。
相关阅读
还有一个相关的(但不完全是重复的问题),您可能会觉得有帮助:Using SPARQL to locate a subject with multiple occurrences of same property。