jena.query.ResultSet: hasNext() оценивает false, но должен содержать что-то

Я пытаюсь запросить наборы данных dbpedia 3.9 на virtuoso (local, 7.0.0). Запрос отлично работает на конечной точке SPARQL, но при использовании Jena ResultSet от виртуозного выполнения запроса ничего не содержит (hasNext() имеет значение false). Я посмотрел здесь и здесь, но у меня все еще есть файл pb.

Ниже код, который я использую. У кого-нибудь есть идея, что не так?

Спасибо.

import virtuoso.jena.driver.VirtGraph;
import virtuoso.jena.driver.VirtuosoQueryExecution;
import virtuoso.jena.driver.VirtuosoQueryExecutionFactory;

import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;

public static void testDbpediaLex(Resource dbpedia)
{

    String query = " PREFIX  lexvo: <http://lexvo.org/ontology#> \n"
            + " PREFIX rdf: <http://www.w3.org/2000/01/rdf-schema#> \n\n"
            + " SELECT ?lexlabel WHERE { \n"
            + " <http://dbpedia.org/resource/Fernando_Alonso> lexvo:label ?lexlabel . \n"
            + " <http://dbpedia.org/resource/Fernando_Alonso> rdf:label ?label . \n"
            + " FILTER (?lexlabel != ?label) .  } ";

    VirtGraph graph = new VirtGraph ("http://dbpedia.org/", "jdbc:virtuoso://localhost:1111", "dba", "dba");

    VirtuosoQueryExecution vqLex = VirtuosoQueryExecutionFactory.create(query, graph);
    ResultSet rLex = VirtuosoConnection.executeVirtuosoQuery(vqLex);
    if(rLex != null)
    {
        while (rLex.hasNext())
        {
            QuerySolution result = rLex.nextSolution();
            System.out.println(result.get("lexlabel"));
            i++;
        }
    }
}

person ecrin    schedule 06.10.2014    source источник
comment
Поскольку вы спрашиваете о тройках с темой <http://dbpedia.org/resource/Fernando_Alonso>, не могли бы вы показать нам результаты <http://dbpedia.org/resource/Fernando_Alonso> ?p ?o. Используя это, мы можем лучше предположить, что вернет ваш запрос.   -  person Joshua Taylor    schedule 06.10.2014
comment
Три непосредственных примечания: (i) типичный префикс для http://www.w3.org/2000/01/rdf-schema#rdfs:. Это не изменит смысла запроса, но люди, вероятно, увидят ваш (rdf:) и подумают, что у вас опечатка. (ii) Сравнение меток может быть затруднено из-за языковых меток. Поведение != может соответствовать большему количеству вещей, чем вы ожидаете (или нет, это просто мысль). (iii) Это не похоже на полный код. Может быть, я что-то упускаю, но я не вижу объявления i, а в вашем цикле есть i++. Легче помочь с кодом, который мы можем скомпилировать и запустить.   -  person Joshua Taylor    schedule 06.10.2014
comment
@Джошуа, большое спасибо за ваши комментарии. Я исправлю (i), ограничусь только label@en (ii) и да, я удалил часть кода и забыл эту, извините (iii). Что касается основной проблемы с пустым набором результатов, я обнаружил свою ошибку: набор данных лексикализации DBpedia является именованным графом, и это должно быть явно указано в запросе (GRAPH ?g { <http://dbpedia.org/resource/Fernando_Alonso> lexvo:label ?lexlabel }). Были некоторые расхождения относительно наборов графических данных между моим запросом через Jena и запросом через конечную точку sparql, и я не сразу это заметил.   -  person ecrin    schedule 06.10.2014
comment
@ehrmama Если вы придумали свой собственный ответ, вы можете опубликовать его как таковой.   -  person RobV    schedule 06.10.2014


Ответы (1)


Наконец-то нашел решение для пб, вот подробнее.

С помощью следующего запроса sparql я хочу получить метки данного ресурса (независимо от того), как определено через свойства rdfs:label и lexvo:label. Первый применяется к триплетам (набор данных меток dbpedia), второй — к четырехъядерным (набор данных лексикализации dbpedia Spotlight).

PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  lexvo: <http://lexvo.org/ontology#>

SELECT  ?lexlabel
WHERE
  { <http://dbpedia.org/resource/Fernando_Alonso> lexvo:label ?lexlabel .
    <http://dbpedia.org/resource/Fernando_Alonso> rdfs:label ?label
    FILTER langMatches(lang(?label), "en")
    FILTER langMatches(lang(?lexlabel), "en")
    FILTER ( ?lexlabel != ?label )
  }

На локальной конечной точке sparql (virtuoso.ini) граф по умолчанию не указан. Таким образом, Graph IRI на конечной точке sparql пуст, и в этих условиях запрос работает хорошо.

С помощью Virtuoso Jena Provider определяется VirtGraph с графом http://dbpedia.org, и в этом случае запрос не дает результата. Действительно, то же самое происходит при указании http://dbpedia.org в поле Graph IRI конечной точки sparql, это была моя ошибка, что я не проверил это.

Наконец, чтобы получить результаты через Jena (т. е. используя VirtGraph с http://dbpedia.org), запрос должен указывать набор данных графика, когда это необходимо:

SELECT ?lexlabel WHERE 
{
GRAPH ?g {<http://dbpedia.org/resource/Fernando_Alonso> lexvo:label ?lexlabel . }
<http://dbpedia.org/resource/Fernando_Alonso> rdfs:label ?label .  
FILTER (LANGMATCHES(LANG(?label), "en"))
FILTER (LANGMATCHES(LANG(?lexlabel), "en"))
FILTER (?lexlabel != ?label) .  } 

который дает следующие ярлыки: «Алонсо»@en, «Фернандо»@en и «Ало»@en.

person ecrin    schedule 06.10.2014
comment
Если это решение и оно сработало для вас, вам следует принять его. Если это только та информация, которую я запросил в комментарии к вопросу, то вам следует отредактировать вопрос с этой дополнительной информацией. - person Joshua Taylor; 06.10.2014