0

我正在尝试用 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
4

1 回答 1

1

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

  1. 其他8本书的数据
  2. 两本书的数据
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 } }
  }
于 2017-03-12T09:27:24.217 回答