1

我想知道我们是否可以知道 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.
}
4

1 回答 1

2

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 定位具有多次出现相同属性的主题

于 2013-12-24T14:58:31.070 回答