【发布时间】:2012-07-02 10:53:19
【问题描述】:
我已经忘记了关于 DBpedia 和 SPARQL 的所有新知识,并且当我用 Google 搜索这些示例时,我发现所有示例都太复杂且难以理解。
我希望做的是传入两个或三个维基百科页面并取回所有页面所属的维基百科类别集。
这似乎在SPARQL 中应该非常简单,所以我希望有一个非常简单的示例来帮助我入门。
【问题讨论】:
我已经忘记了关于 DBpedia 和 SPARQL 的所有新知识,并且当我用 Google 搜索这些示例时,我发现所有示例都太复杂且难以理解。
我希望做的是传入两个或三个维基百科页面并取回所有页面所属的维基百科类别集。
这似乎在SPARQL 中应该非常简单,所以我希望有一个非常简单的示例来帮助我入门。
【问题讨论】:
这实际上是您之前关于getting all pages belonging to two categories 的问题的变体。唯一的区别是这一次,您需要两个/三个 subjects 而不是 objects,因此您不能使用逗号分隔的值枚举,而是必须写出您要匹配的三元组模式。
例如,要返回西班牙和葡萄牙都属于的所有类别,您可以简单地执行如下查询:
SELECT ?cat
WHERE {
<http://dbpedia.org/resource/Spain> dcterms:subject ?cat .
<http://dbpedia.org/resource/Portugal> dcterms:subject ?cat .
}
此查询的作用是为主题“西班牙”和“葡萄牙”的dcterms:subject 关系选择具有相同?cat 值的所有三元组模式。换句话说,它准确地检索两种资源都属于的那些类别。
诀窍是从图形的角度来思考,或者用连接的主题和对象来思考三元组。这是一种精神上的转变,但一旦你有了这个转变,查询编写就会变得容易得多。
【讨论】:
wikipedia 和 dbpedia URI 之间的映射如下:
对于
http://en.wikipedia.org/wiki/Spain
DBPedia uri 是:
http://dbpedia.org/resource/Spain
所以要找出上面的类别
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?categoryUri ?categoryName
WHERE {
<http://dbpedia.org/resource/Spain> dcterms:subject ?categoryUri.
?categoryUri rdfs:label ?categoryName.
FILTER (lang(?categoryName) = "en")
}
【讨论】:
<http://dbpedia.org/resource/Spain> dcterms:subject ?categoryUri. 行与其他东西代替Spain 复制了我想要的,尽管我并不真正理解语法以及它为什么起作用(-: