2014-10-11 5 views
0

Итак, im делает простой запрос. Я хочу все uri/свойство/объект определенного dbpedia uri, например: http://dbpedia.org/resource/Roger_Federer. Проблема в том, что она возвращает только свойство этого, как мы видим на наборе результатов.Запрос Sparql не возвращает uri/объект

Класс:

public class SemanticCrawlerImpl implements SemanticCrawler { 
    public void search(Model graph, String resourceURI) { 
     graph.read(resourceURI); 

     // Create a new query 
     String queryString = 
      "SELECT ?url ?property ?object" + 
      "WHERE {" + 
      "  <"+resourceURI+"> ?property ?object ." + 
      "}"; 

     Query query = QueryFactory.create(queryString); 

     System.out.println("----------------------"); 

     System.out.println("Query Result Sheet"); 

     System.out.println("----------------------"); 

     // Execute the query and obtain results 
     QueryExecution qe = QueryExecutionFactory.create(query, graph); 
     com.hp.hpl.jena.query.ResultSet results = qe.execSelect(); 

     // Output query results  
     ResultSetFormatter.out(System.out, results, query); 

     qe.close(); 
    } 
} 

Resultset

| url | property             | objectWHERE | 
================================================================================= 
|  | <http://dbpedia.org/property/medaltemplatesTitle>   |    | 
|  | <http://dbpedia.org/ontology/thumbnail>     |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://dbpedia.org/property/name>      |    | 
|  | <http://dbpedia.org/property/daviscupresult>    |    | 
|  | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   |    | 
|  | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   |    | 
|  | <http://dbpedia.org/property/hopmancupresult>    |    | 
|  | <http://dbpedia.org/ontology/wikiPageExternalLink>  |    | 
|  | <http://purl.org/dc/terms/subject>      |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   |    | 
|  | <http://purl.org/dc/terms/subject>      |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   |    | 
|  | <http://dbpedia.org/ontology/height>      |    | 
|  | <http://purl.org/dc/terms/subject>      |    | 
|  | <http://www.w3.org/2002/07/owl#sameAs>     |    | 
|  | <http://dbpedia.org/ontology/birthYear>     |    | 
+0

Конкатенация строк '? Object '+" WHERE' дает вам 'select? ObjectWHERE', и вы не используете переменную'? ObjectWHERE'. Запрос 'where' в запросах не является обязательным (т. Е. Вы можете написать' select? A? B {...} ', что позволит избежать проблемы. Но вы действительно должны использовать строки новой строки в строке запроса так или иначе, более строгие сообщения об ошибках синтаксиса для номеров строк. Кроме того, конкатенация строк, такая как '<" + resourceURI + ">', подвержена ошибкам, вместо этого вы должны использовать параметр ParameterizedSparqlString. –

ответ

2

Существует опечатка в запросе, недостающего пространства. Обратите внимание, что вывод должен быть «объектом», а не «objectWHERE». Кроме того, нет необходимости в вашей переменной url, так как вы не используете ее в своем запросе. Заменить этот фрагмент в код, и он будет работать:

// Create a new query 
     String queryString = 
      "SELECT ?property ?object " + 
      "WHERE {" + 
      "  <"+resourceURI+"> ?property ?object ." + 
      "}"; 

     Query query = QueryFactory.create(queryString); 

Кроме того, я не понимаю, почему вы сначала прочитать ресурс локально, а затем выдает запрос SPARQL против локального графа. Почему бы не сделать это прямо против конечной точки dbpedia? Что-то вроде этого:

String resourceURI = "http://dbpedia.org/resource/Roger_Federer"; 
String queryString = 
      "SELECT ?property ?object " + 
      "WHERE {" + 
      "  <"+resourceURI+"> ?property ?object ." + 
      "}"; 
Query query = QueryFactory.create(queryString); 
//System.out.println(queryIn); 
QueryExecution qe = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query); 
ResultSet results = qe.execSelect(); 
ResultSetFormatter.out(System.out, results, query); 
qe.close(); 

Я думаю, что она чище.

+0

Awesome! Тогда как я могу запросить еще раз на заданном наборе результатов? как: сова: sameAs сова.:. sameAs

+0

Если вы хотите запросить переменную на множестве результатов, вы должны сделать что-то вроде 'While (results.hasNext()) { QuerySolution QS = RS .next(); Resource variable = qs.getResource ("? object"); } ' –

+0

Если вы хотите сделать запрос, подобный тому, который вы упомянули в своем комментарии, вам просто нужно изменить свой запрос sparql на нечто вроде 'select? SameAs где {{ owl: sameAs? SameAs.} UNION {? SameAs owl : sameAs

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