2016-04-11 2 views
2

Основываясь на использовании SPARQL и DBPedia, я хочу получить информацию обо всех церквях, расположенных в Париже. Если я запустил код ниже, он возвращает null. Я не могу понять, что не так, потому что нет сообщения об ошибке.Запрос SPARQL возвращает null

package com.tests.example; 

import org.apache.jena.query.Query; 
import org.apache.jena.query.QueryExecution; 
import org.apache.jena.query.QueryExecutionFactory; 
import org.apache.jena.query.QueryFactory; 
import org.apache.jena.query.QuerySolution; 
import org.apache.jena.query.ResultSet; 
import org.apache.jena.rdf.model.RDFNode; 

public class JenaTestDBPedia { 

    public static void main(String[] args) { 

     String queryString= 
       "PREFIX p: <http://dbpedia.org/property/>" + 
       "PREFIX dbpedia: <http://dbpedia.org/resource/>" + 
       "PREFIX category: <http://dbpedia.org/resource/Category:>" + 
       "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" + 
       "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>" + 
       "PREFIX geo: <http://www.georss.org/georss/>" + 
       "SELECT DISTINCT ?m ?n ?p ?d" + 
       "WHERE {" + 
       " ?m rdfs:label ?n." + 
       " ?m skos:subject ?c." + 
       " ?c skos:broader category:Churches_in_Paris." + 
       " ?m p:abstract ?d." + 
       " ?m geo:point ?p" + 
       " }"; 

     Query query = QueryFactory.create(queryString); 

     QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query); 

     try { 
      ResultSet results = qexec.execSelect(); 
      while(results.hasNext()) { 
       QuerySolution qs = results.next(); 
       RDFNode type = qs.get("label"); 
       System.out.println(type.toString()); 
      } 
     } 
     finally { 
      qexec.close(); 
     } 

    } 

} 

Update: Исправленный запрос (хотя это не работает):

"SELECT DISTINCT ?m ?n ?p ?d \n" + 
       "WHERE { \n" + 
       " ?m rdfs:label ?n." + 
       " ?m skos:subject ?c." + 
       " ?c skos:broader category:Churches_in_Paris." + 
       " ?m p:abstract ?d." + 
       " ?m geo:point ?p" + 
       " }"; 
+0

Где у вас есть переменная 'label' в вашем запросе? Нигде, точно. Он называется 'n' в вашем запросе. – AKSW

ответ

1

Я собираюсь сосредоточиться на запросе, а не остальной код:

  • нет skos:subject, вам нужно dct:subject
  • вместо p:abstract, вам нужно dbo:abstract

Скорректированный запрос:

PREFIX category: <http://dbpedia.org/resource/Category:> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX geo: <http://www.georss.org/georss/> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbo: <http://dbpedia.org/ontology/> 

SELECT DISTINCT ?m ?n ?p ?d WHERE { 
?m rdfs:label ?n. 
?m dct:subject ?c. 
?c skos:broader category:Churches_in_Paris. 
?m dbo:abstract ?d. 
?m geo:point ?p 
} 

Некоторые другие пункты:

  • рассмотреть фильтрации тезисов и этикетки на только те, на языке, это интересно для вас (возможно, на английском языке)
  • рассмотрит вопрос о том geo:pointOPTIONAL как не все результаты имеют его
  • рассмотреть суб-суб -Категории родительской категории, а не только подкатегории
  • рассмотреть возможность использования имен переменных, которые являются более описательными, чем просто один, казалось бы, случайные буквы
+0

ОК, теперь он работает. Спасибо. как вы выяснили, что вместо 'skos: subject' должно быть' dbct: subject'? – HappyDuck

+0

@HappyDuck Посмотрите на http: // dbpedia.org/page/Категория: Eastern_Orthodox_Churches_in_Paris (в частности, это «dct: subject» of the row). – svick

+0

Хорошо, я вижу. Просто любопытно: я проверил выходы, и запрос, похоже, не возвратил церкви, например. rdfs: label - ''. Вы знаете причину? Если да, сообщите мне. Я осмотрю его и создаю новый поток, если у меня возникнут другие сомнения. – HappyDuck

0
qs.get("label"); 

Вы не выбрали переменную с именем метки. Для значения rdfs: label вы использовали свойство ?n. Вам нужно будет использовать qs.get("n").

Также обратите внимание, что в вашей конкатенации строк есть некоторые непреднамеренные эффекты, такие как «select ...? DWHERE {...», и ваш запрос не использовал переменную с именем dWHERE.

+0

Спасибо. Означает ли это, что я должен запустить 'qs.get ("? N ")'? – HappyDuck

+0

Нет, 'qs.get (" n ")', как я уже сказал в своем ответе. –

+0

См. Мой обновленный запрос. Я также изменил на 'qs.get (" n ")', но все же нет вывода – HappyDuck

Смежные вопросы