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 结果
现在,类别与 DBpedia 中的超类别相关,如您在http://dbpedia.org/page/Category:Landforms_of_Cheshire_County,_New_Hampshireskos:broader
中所见,其中有指向
现在,这意味着如果两个事物有一些共同的类别(或超类别),则每个事物都将通过以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 结果
这也适用于汤姆克鲁斯和麦当娜,但由于内存问题,您需要稍微缩减路径长度。例如,以下查询返回 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 结果
不过,值得注意的是,维基百科类别不是类型。因此,虽然这两种资源都被正确地视为地形,但地理或新罕布什尔州都不是,正如您将在后面的查询中看到的那样。维基百科类别更多的是关于主题而不是类型层次结构。
相关阅读
有一个相关的(但不完全重复的问题)您可能会发现它也很有帮助:使用 SPARQL 定位具有多次出现相同属性的主题。