0

我正在尝试检索 DBpedia 中书籍的出版日期和页数。我尝试了以下查询,它给出了空结果。我看到这些是书(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 .}
     }
4

2 回答 2

0

基于映射的属性使用命名空间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但这个不再在官方 DBpedia 上预定义-被调用dbo
  • 这让我想到了第二点 -> 如果您使用的是公共 SPARQL 端点,请显示其 URL
  • 您可以开始调试您自己的 SPARQL 查询,只需从其中的一部分开始,然后添加更多的三元组模式,例如,在您的情况下,您可以检查是否有任何三元组的属性

    PREFIX dbp: <http://dbpedia.org/property/>
    
    SELECT * WHERE {?book dbp:firstPublicationDate ?date } LIMIT 10
    

更新

正如 Ivo Velitchkov 在下面的回答中注意到的那样,该属性dbo:firstPublicationDate仅用于漫画等,即定期出版的书面作品。因此,结果将为空。

于 2017-03-12T02:11:06.277 回答
0

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
于 2017-03-12T08:57:44.433 回答