查找资源的常见类别或超类别

时间:2013-12-24 14:41:07

标签: rdf sparql semantic-web dbpedia linked-data

我想知道我们是否可以知道DBpedia中两个资源是否具有相同类别或某些子类别(即属于某些常见超类别的类别)?我在DBpedia端点尝试了这个查询但是错了:

select distinct ?s ?s2 where {
?s skos:subject <http :// dbpedia.org/resource/ Category ?c.
?s2 skos:subject <http :// dbpedia.org/resource/ Category ?c2.
?c=?c2.
}

1 个答案:

答案 0 :(得分:1)

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 .

,例如,这是一个查找Mount Monadnock和Spofford Lake的常见类别的查询。只有一个结果,新罕布什尔州柴郡的Landforms,因为它们只有一个共同的类别。

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链接开头并且后跟零或更多{{1}的路径与该类别相关联}链接。因此,您可以使用像

这样的查询
skos:broader

不幸的是,您会发现DBpedia端点遇到了该查询的内存使用问题,因此您无法像这样运行它。但是,DBpedia SPARQL端点支持实际上未将其纳入标准的属性路径功能;您可以写select * where { ?category ^(dcterms:subject/skos:broader*) dbpedia:Mount_Monadnock, dbpedia:Spofford_Lake . } 来表示长度至少为p{n,m}且最多为n的链。这意味着你可以放置一些范围,这将获得与m

相同的结果
*

SPARQL results

这也适用于汤姆克鲁斯和麦当娜,但由于内存问题,你需要稍微缩小路径长度。例如,以下查询返回74个结果。

select distinct ?category where {
  ?category ^(dcterms:subject/(skos:broader{0,3})) dbpedia:Mount_Monadnock, dbpedia:Spofford_Lake .
}

SPARQL results

值得注意的是,维基百科类别不是类型。因此,虽然这两种资源都被正确地视为地形,但 都不是地理位置,或者正如您将在后面的查询中看到的那样,新罕布什尔州。维基百科类别更多地是关于主题而不是类型层次结构。

相关阅读

您可能会发现一个相关的(但不是很重复的问题):Using SPARQL to locate a subject with multiple occurrences of same property