我在创建一些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件事:
我已经为此苦苦挣扎太久了,我根本无法定义这3个查询。我正在尝试实现一个函数,该函数将使用用户表单传递的参数来执行SPARQL语句。我在这里和网络上都找到了一些示例,但是我无法构建这3个特定查询。
答案 0 :(得分:2)
如前所述,并非每本书都具有所有属性,并且您的某些属性可能根本不存在。例如,根据Harry Potter and the Goblet of Fire的描述,我将dbp:genre
更改为dbo:literaryGenre
。参见query form和results。
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')) }
}