SPARQL запрос конкретной информации - PullRequest
0 голосов
/ 05 июля 2018

Я изо всех сил пытаюсь создать несколько запросов 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 голосов
/ 05 июля 2018

Как уже отмечалось, не каждая книга имеет все свойства, а некоторые из ваших свойств могут вообще не существовать. Например, я изменил dbp:genre на dbo:literaryGenre, основываясь на описании Гарри Поттер и Кубок Огня . См. форму запроса и результаты .

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')) }
}
...