SPARQL查询特定信息

时间:2018-07-05 12:46:02

标签: sparql virtuoso

我在创建一些SPARQL查询方面很费力。我需要3件事,这就是我到目前为止所拥有的:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

select distinct ?title ?author ?country ?genre ?language
where {
  ?s rdf:type dbo:Book;
  dbp:title ?title;
  dbp:author ?author;
  dbp:country ?country;
  dbp:genre ?genre;
  dbp:language ?language.

}

此查询将为我带来所有书籍的列表。我真正需要的是能够向此代码添加一些过滤器的功能。我想过滤3件事:

  • 特定标题名称(例如,使用“哈利·波特”搜索标题)
  • 特定作者姓名(例如,以“ J. K. Rowling”搜索作者)
  • 特定类型(例如,通过“冒险”搜索类型)

我已经为此苦苦挣扎太久了,我根本无法定义这3个查询。我正在尝试实现一个函数,该函数将使用用户表单传递的参数来执行SPARQL语句。我在这里和网络上都找到了一些示例,但是我无法构建这3个特定查询。

1 个答案:

答案 0 :(得分:2)

如前所述,并非每本书都具有所有属性,并且您的某些属性可能根本不存在。例如,根据Harry Potter and the Goblet of Fire的描述,我将dbp:genre更改为dbo:literaryGenre。参见query formresults

SELECT *
WHERE
 { ?s rdf:type dbo:Book .
   ?s rdfs:label ?bookLabel . 
      FILTER(LANGMATCHES(LANG(?bookLabel), 'en')) 
   ?s dbo:author ?author . 
   ?author rdfs:label ?authorLabel . 
      FILTER(LANGMATCHES(LANG(?authorLabel), 'en')) 
   ?authorLabel bif:contains "Rowling" 
   OPTIONAL { ?s dbp:country ?country .
              ?country rdfs:label ?countryLabel .
                 FILTER(LANGMATCHES(LANG(?countryLabel), 'en')) }
   OPTIONAL { ?s dbo:literaryGenre ?genre .
              ?genre rdfs:label ?genreLabel .
                 FILTER(LANGMATCHES(LANG(?genreLabel), 'en')) }
   OPTIONAL { ?s dbp:language ?language .
              ?language rdfs:label ?languageLabel .
                 FILTER(LANGMATCHES(LANG(?languageLabel), 'en')) }
}