如何在DBPEDIA中使用SPARQL查询图书的出版日期
How to query for publication date of books using SPARQL in DBPEDIA
我正在尝试检索 DBpedia 中书籍的出版日期和 no.of 页数。我尝试了以下查询,但结果为空。我看到这些是 book(http://mappings.dbpedia.org/server/ontology/classes/Book) 下的属性,但无法检索它。
我想知道是代码有误还是dbpedia没有存储这些与图书相关的日期
SELECT ?book ?genre ?date ?numberOfPages
WHERE {
?book rdf:type dbpedia-owl:Book .
?book dbp:genre ?genre .
?book dbp:firstPublicationDate ?date .
OPTIONAL {?book dbp:numberOfPages ?numberOfPages .}
}
基于映射的属性正在使用命名空间 http://dbpedia.org/ontology/
,因此,前缀必须是 dbo
而不是 dbp
,它代表 http://dbpedia.org/property/
.
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
SELECT ?book ?genre ?date ?numberOfPages
WHERE {
?book a dbo:Book ;
dbp:genre ?genre ;
dbo:firstPublicationDate ?date .
OPTIONAL {?book dbp:numberOfPages ?numberOfPages .}
}
一些补充意见:
- 将前缀添加到 SPARQL 查询中,这样这里的其他人就可以毫无例外地 运行 它(将来也是如此)- 当前的 SPARQL 查询使用
dbpedia-owl
但这个不是预不再在 official DBpedia 上定义 - 它被称为 dbo
而不是
- 这让我想到了第二点 -> 如果您使用的是 public SPARQL 端点,请显示其 URL
您可以开始调试您自己的 SPARQL 查询,只需从它的一部分开始,然后添加更多的三元组模式,例如在您的情况下,您可以检查 属性 和
是否存在任何三元组
PREFIX dbp: <http://dbpedia.org/property/>
SELECT * WHERE {?book dbp:firstPublicationDate ?date } LIMIT 10
更新
正如 Ivo Velitchkov 在下面的回答中注意到的那样,属性 dbo:firstPublicationDate
仅用于漫画等,即定期出版的书面作品。因此,结果将为空。
dbp:firstPublicationDate
不起作用有两个原因:
首先,正如第一个答案所指出的,您使用了错误的前缀。
但是即使你改正了,你会发现还是没有结果。那么最好的办法就是用最少数量的模式进行测试,在这种情况下,对于有首次出版日期的书籍,只有两个三重模式。如果您仍然没有得到结果,您应该测试 <http://dbpedia.org/ontology/firstPublicationDate>
实际如何与这样的查询一起使用:
SELECT ?class (COUNT (DISTINCT ?s) AS ?instances)
WHERE {
?s <http://dbpedia.org/ontology/firstPublicationDate> ?date ;
a ?class
}
GROUP BY ?class
ORDER BY DESC(?instances)
LIMIT 1000
我正在尝试检索 DBpedia 中书籍的出版日期和 no.of 页数。我尝试了以下查询,但结果为空。我看到这些是 book(http://mappings.dbpedia.org/server/ontology/classes/Book) 下的属性,但无法检索它。
我想知道是代码有误还是dbpedia没有存储这些与图书相关的日期
SELECT ?book ?genre ?date ?numberOfPages
WHERE {
?book rdf:type dbpedia-owl:Book .
?book dbp:genre ?genre .
?book dbp:firstPublicationDate ?date .
OPTIONAL {?book dbp:numberOfPages ?numberOfPages .}
}
基于映射的属性正在使用命名空间 http://dbpedia.org/ontology/
,因此,前缀必须是 dbo
而不是 dbp
,它代表 http://dbpedia.org/property/
.
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
SELECT ?book ?genre ?date ?numberOfPages
WHERE {
?book a dbo:Book ;
dbp:genre ?genre ;
dbo:firstPublicationDate ?date .
OPTIONAL {?book dbp:numberOfPages ?numberOfPages .}
}
一些补充意见:
- 将前缀添加到 SPARQL 查询中,这样这里的其他人就可以毫无例外地 运行 它(将来也是如此)- 当前的 SPARQL 查询使用
dbpedia-owl
但这个不是预不再在 official DBpedia 上定义 - 它被称为dbo
而不是 - 这让我想到了第二点 -> 如果您使用的是 public SPARQL 端点,请显示其 URL
您可以开始调试您自己的 SPARQL 查询,只需从它的一部分开始,然后添加更多的三元组模式,例如在您的情况下,您可以检查 属性 和
是否存在任何三元组PREFIX dbp: <http://dbpedia.org/property/> SELECT * WHERE {?book dbp:firstPublicationDate ?date } LIMIT 10
更新
正如 Ivo Velitchkov 在下面的回答中注意到的那样,属性 dbo:firstPublicationDate
仅用于漫画等,即定期出版的书面作品。因此,结果将为空。
dbp:firstPublicationDate
不起作用有两个原因:
首先,正如第一个答案所指出的,您使用了错误的前缀。
但是即使你改正了,你会发现还是没有结果。那么最好的办法就是用最少数量的模式进行测试,在这种情况下,对于有首次出版日期的书籍,只有两个三重模式。如果您仍然没有得到结果,您应该测试 <http://dbpedia.org/ontology/firstPublicationDate>
实际如何与这样的查询一起使用:
SELECT ?class (COUNT (DISTINCT ?s) AS ?instances)
WHERE {
?s <http://dbpedia.org/ontology/firstPublicationDate> ?date ;
a ?class
}
GROUP BY ?class
ORDER BY DESC(?instances)
LIMIT 1000