Запрос SPARQL к DBPedia с использованием Java

Я хотел бы запросить DBPedia с помощью Java. Ниже приведен мой код, и он не возвращает правильный результат. Я хочу получить абстрактную часть с [http://dbpedia.org/page/Ibuprofen и название ярлыка. но он возвращает только http://dbpedia.org/resource/Ibuprofen 11 раз. Если можно, подскажите, где ошибка? Это мой код:

import org.apache.jena.query.ParameterizedSparqlString;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.ResourceFactory;

public class JavaDBPediaExample {

    public static void main(String[] args) {
        ParameterizedSparqlString qs = new ParameterizedSparqlString(""
                + "prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>\n"
                + "PREFIX dbo:     <http://dbpedia.org/ontology/>"
                + "\n"
                + "select ?resource where {\n"
                + "  ?resource rdfs:label ?label.\n"
                + "  ?resource dbo:abstract ?abstract.\n"
                + "}");

        Literal ibuprofen = ResourceFactory.createLangLiteral("Ibuprofen", "en");
        qs.setParam("label", ibuprofen);

        QueryExecution exec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", qs.asQuery());

        ResultSet results = exec.execSelect();

        while (results.hasNext()) {

            System.out.println(results.next().get("resource"));
        }

        ResultSetFormatter.out(results);
    }
}

person developer    schedule 14.06.2016    source источник
comment
Если вы хотите получить реферат, то, конечно же, вам нужно выбрать переменную ?abstract в запросе. И вы должны вызвать get для этой переменной, т.е. get("abstract") или еще лучше getLiteral("abstract"). Похоже, вы откуда-то скопировали код? Я спрашиваю, потому что мне было интересно, что вы сами не видите проблемы.   -  person UninformedUser    schedule 14.06.2016
comment
Обратите внимание, что URI ресурса — http://dbpedia.org/resource/Ibuprofen с ресурсом, а не со страницей. В веб-браузере вы автоматически перенаправляетесь на версию страницы, но фактическим ресурсом является версия ресурса.   -  person Joshua Taylor    schedule 14.06.2016
comment
Да код был на самом деле из другого источника, только запрос был мой   -  person developer    schedule 15.06.2016


Ответы (1)


У вас есть несколько результатов, потому что в DBPedia есть несколько языковых вариантов. Решите, какой язык вы хотите, и соответствующим образом измените фильтр ниже. Вы также можете включить шаблон метки в запрос вместо того, чтобы делать это программно. Согласно комментарию ASKW, вы также не привязали абстрактную переменную к результату.

В основном ваш код должен выглядеть примерно так:

public static void main(String[] args) {
        ParameterizedSparqlString qs = new ParameterizedSparqlString(""
                + "prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>\n"
                + "PREFIX dbo:     <http://dbpedia.org/ontology/>"
                + "\n"
                + "select distinct ?resource ?abstract where {\n"
                + "  ?resource rdfs:label 'Ibuprofen'@en.\n"
                + "  ?resource dbo:abstract ?abstract.\n"
                + "  FILTER (lang(?abstract) = 'en')}");


        QueryExecution exec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", qs.asQuery());

        ResultSet results = exec.execSelect();

        while (results.hasNext()) {

            System.out.println(results.next().get("abstract").toString());
        }

        ResultSetFormatter.out(results);
    }
person William Greenly    schedule 14.06.2016
comment
Хороший ответ. Кроме того, как всегда говорит @JoshuaTaylor, рекомендуется использовать функцию LANGMATCHES SPARQL. - person UninformedUser; 14.06.2016
comment
Да, я понял свою ошибку. Всем спасибо за помощь! - person developer; 15.06.2016