如何在使用LIMIT时查询DBPEDIA SPARQL以包含所需的值

时间:2017-03-12 03:31:42

标签: sparql ontology dbpedia sparqlwrapper

我试图用10本随机书籍填充我的本地本体。我想在列表中包含2本已知的书籍用于测试目的。在10个中我想指定2本书的名称,剩下的8本书可以是随机的。

我不知道如何将FILTER和LIMIT结合在一起。

我想查询中的2本书以及8本随机书籍。

FILTER (str(?name) IN ("Panther in the Basement", "Endless Night"))

我的代码

SELECT  ?book ?date
WHERE {
?book rdf:type dbo:Book .
?book foaf:name ?name .
     ?book dbp:releaseDate ?date .

}
limit 10

1 个答案:

答案 0 :(得分:1)

不清楚为什么要这样做,但可以通过更复杂的查询来完成,UNION

  1. 其他8本书的数据
  2. 两本书的数据
  3. SELECT DISTINCT  ?book ?date
    WHERE
      {   { SELECT DISTINCT  ?book ?date
            WHERE
              { ?book  rdf:type         dbo:Book ;
                       foaf:name        ?name ;
                       dbp:releaseDate  ?date
                FILTER ( ?book NOT IN (dbr:Panther_in_the_Basement, dbr:Endless_Night) )
              }
            LIMIT   8
          }
        UNION
          { VALUES ?book { dbr:Panther_in_the_Basement dbr:Endless_Night }
            ?book  rdf:type         dbo:Book ;
                   foaf:name        ?name ;
                   dbp:releaseDate  ?date
          }
      }
    

    注意,由于DBpedia数据集不是那么干净,并且有一些书籍具有releaseDate的多个值,因此该查询可能会返回重复的书籍。要解决此问题,您必须使用GROUP BY + SAMPLE(或GROUP_CONCAT

    实际上,我认为此查询的更紧凑版本也应该有效,但它不会在DBpedia上返回任何结果:

    SELECT DISTINCT  ?book ?date
    WHERE
      { ?book  foaf:name        ?name ;
               dbp:releaseDate  ?date
          { { SELECT  ?book
              WHERE
                { ?book  rdf:type  dbo:Book }
              LIMIT   8
            }
          }
        UNION
          { VALUES ?book { dbr:Panther_in_the_Basement dbr:Endless_Night } }
      }