Запрос Sparql не возвращает uri/объект

Итак, я делаю простой запрос. Мне нужны все uri/property/object определенного uri dbpedia, например: http://dbpedia.org/resource/Roger_Federer . Проблема в том, что он возвращает только его свойство, как мы видим в наборе результатов.

Класс:

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();
    }
}

Набор результатов

| 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>                   |             |

person Oswaldo Ferreira    schedule 11.10.2014    source источник
comment
Конкатенация строк ?object" + "WHERE дает вам select ?objectWHERE, и вы не используете переменную ?objectWHERE. where в запросах является необязательным (т. е. вы можете написать select ?a ?b { ... }, что позволит избежать проблемы. Но вы все равно должны использовать новые строки в строке запроса, чтобы вы получали более точные сообщения об ошибках синтаксиса для номеров строк. Кроме того, конкатенация строк, например <"+resourceURI+"> подвержен ошибкам; вместо этого следует использовать ParameterizedSparqlString.   -  person Joshua Taylor    schedule 13.10.2014


Ответы (1)


В вашем запросе опечатка, пропущен пробел. Обратите внимание, что вывод должен быть «object», а не «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();

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

person Daniel Garijo    schedule 11.10.2014
comment
Потрясающий! Тогда как я могу снова запросить данный набор результатов? Например, сделать запрос типа: ‹URI› owl:sameAs ‹Object› . ‹Тема› owl:sameAs ‹URI› . - person Oswaldo Ferreira; 12.10.2014
comment
Если вы хотите запросить переменную в наборе результатов, вам нужно сделать что-то вроде while (results.hasNext()){ QuerySolution qs = rs.next(); Resource variable = qs.getResource("?object"); } - person Daniel Garijo; 12.10.2014
comment
Если вы хотите сделать запрос, подобный тому, который вы упомянули в своем комментарии, вам просто нужно изменить свой запрос sparql на что-то вроде select ?sameAs where{{<yourResourceURIgoeshere> owl:sameAs ?sameAs.} UNION{?sameAs owl:sameAs <yourResourceURIgoeshere>}} (если я правильно понял ваш вопрос) - person Daniel Garijo; 12.10.2014
comment
Этот ответ появился раньше, и вопрос является дубликатом. - person Joshua Taylor; 13.10.2014