Ошибка запроса конструкции провайдера Virtuoso Jena

Моя проблема похожа на проблему, заданную по этому вопросу: Есть ли разница между запросами CONSTRUCT, отправленными на виртуальную конечную точку, и запросами, отправленными на Йенскую?

Я использую открытый исходный код Virtuoso в качестве своего хранилища графов и использую поставщика jena для доступа к данным в этом хранилище графов. Я делаю несколько запросов, и все работает нормально (за исключением удивительного количества памяти и времени, которое требует каждого вывода с виртуозом, но это должно быть в другом вопросе ...).

Проблема возникла, когда я попытался создать модель с помощью конструктивного запроса. Я попытался использовать VirtuosoQueryExecutionFactory и запрос в виде строки и QueryExecutionFactory по умолчанию с фабрикой запросов:

qexec = VirtuosoQueryExecutionFactory.create(queryString,inputModel);

model = qexec.execConstruct();

И

Query query = QueryFactory.create(queryString);
qexec = QueryExecutionFactory.create(query,inputModel);

model = qexec.execConstruct();

Запрос дает ожидаемый результат в конечной точке sparql, но пустую модель при запросе в коде.

LOGGER.info("The model is: {}", model);
LOGGER.info("The size is: {}", model.size());

Дает следующий результат:

The model is: <ModelCom   {} | >
The size is: 0

Модель, в которой я выполняю запросы, не пуста, и я сделал тот же запрос из конечной точки sparql, как я уже сказал, получив заданные результаты.

Кто-нибудь знает, где может быть ошибка?

Спасибо.

Даниэль.

РЕДАКТИРОВАТЬ: вот запрос, который я пытаюсь выполнить.

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl:<http://www.w3.org/2002/07/owl#> 
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>  
PREFIX spatiaCore:<http://www.cedint.upm.es/residentialontology.owl#> 
PREFIX test:<http://test.url#> 
PREFIX spatiaCore: <http://www.cedint.upm.es/residentialontology.owl#> 
CONSTRUCT { 
    ?u ?p ?o1. 
    ?o1 ?p2 ?o2. 
    ?o2 ?p3 ?o3. 
    ?o3 ?p4 ?o4. 
    ?o4 ?p5 ?o5. 
    ?o6 ?p6 ?u. 
    ?o7 ?p7 ?o6
}  

WHERE { 
    ?u rdf:type spatiaCore:User. 
    ?u spatiaCore:id "0000000003B3B474"^^<http://www.w3.org/2001/XMLSchema#string>. 
    ?u ?p ?o1.
    OPTIONAL { 
        ?o1 ?p2 ?o2. 
        OPTIONAL {   
            ?o2 ?p3 ?o3.  
            OPTIONAL {
                ?o3 ?p4 ?o4.  
                OPTIONAL {
                    ?o4 ?p5 ?o5. 
                }
            }
        }
    }
    OPTIONAL { 
        ?o6 ?p6 ?u. 
        OPTIONAL {
            ?o7 ?p7 ?o6
        } 
    }
} 

Как видите, запрос пытается построить граф со всеми узлами, с которыми связан пользователь, с глубиной максимум пяти отношений и узлами, которые связаны с пользователем, с глубиной максимум двух отношений.


person Koalk    schedule 19.03.2014    source источник
comment
Вы не показываете нам запрос или данные. Как мы можем узнать, что пустая модель не является правильным результатом?   -  person Joshua Taylor    schedule 20.03.2014
comment
@AndyS inputModel - это экземпляр com.hp.hpl.jena.rdf.model, собирающего данные из хранилища графов. @JoshuaTaylor Как я уже сказал в вопросе, данные и запрос не имеют отношения к делу, поскольку LOGGER.info("The model is: {}", inputModel); показывает все данные правильно, а тот же запрос, выполненный на конечной точке sparql, возвращает ожидаемую модель в качестве результатов (которая не пуста). Если все еще слишком сложно понять вопрос, я могу попробовать сделать минимальный рабочий пример, воспроизводящий ту же ошибку.   -  person Koalk    schedule 20.03.2014


Ответы (1)


Какой метод вы использовали для создания объекта VirtModel?

ЗАМЕТКА:

Если вы использовали:

public static VirtModel openDefaultModel(DataSource ds);
public static VirtModel openDefaultModel(String url, String user, String password);

поэтому Модель будет содержать только данные из графика "virt: DEFAULT". И VirtuosoQueryExecutionFactory добавит следующую прагму в текст запроса:

define input:default-graph-uri <virt:DEFAULT>

Если вы использовали что-то вроде:

public static VirtModel openDatabaseModel(String graphName, DataSource ds);
public static VirtModel openDatabaseModel(String graphName, String url, String user, String password) 

поэтому Модель будет содержать только данные из графика graphName. И VirtuosoQueryExecutionFactory добавит следующую прагму в текст запроса:

define input:default-graph-uri <graphName>

Если вы хотите использовать данные со всех графиков, вы должны вызвать:

VirtModel vmodel = ....create model method...
vmodel.setReadFromAllGraphs(true);

Если вы установите выше значение TRUE, прагма для default-graph-uri не будет добавлена.

Рабочий пример использования Construct с провайдером Virtuoso Jena:

url = "jdbc:virtuoso://localhost:1111";
VirtGraph set = new VirtGraph ("test1", url, "dba", "dba");

set.clear();

String qry = "INSERT INTO GRAPH <test1> { <aa> <bb> 'cc' . <aa1> <bb> 'zz' }";
VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(qry, set);
vur.exec();                  

Model inputModel = new VirtModel(set);
System.out.println("InputModel :"+inputModel);
System.out.println("InputModel size :"+inputModel.size());
System.out.println();


qry = "CONSTRUCT { ?x <a> ?y } WHERE { ?x <bb> ?y }";
QueryExecution vqe = VirtuosoQueryExecutionFactory.create (qry, inputModel);

Model model = vqe.execConstruct();
System.out.println("Model :"+model);
System.out.println("Model size :"+model.size());
person Sergey Malinin    schedule 21.03.2014
comment
На самом деле я не использую ни один из этих методов. Я использовал следующий код для извлечения данных в модель. VirtGraph graph = new VirtGraph(String graphName, String url_host, String user, String password) Model inputModel = new VirtModel(VirtGraph graph) Итак, я полагаю, что с этим я просто могу читать и писать на графике, с которым я работаю. - person Koalk; 22.03.2014
comment
Почему UpdateFactory создается с графом, а QueryExecutionFactory с моделью? Ваш рабочий пример выглядит точно так же, как я пытался, поэтому мне все еще интересно, где ошибка в моем коде ... - person Koalk; 26.03.2014
comment
Теперь VirtuosoUpdateFactory работает только с VirtuosoUpdateFactory. (Но похоже, что он также должен быть обновлен для поддержки модели и набора данных). Если у вас такой же код, значит, проблема может быть в запросе. Может быть, он возвращает пустой набор результатов. - person Sergey Malinin; 27.03.2014
comment
Как я уже сказал в вопросе, тот же запрос, выполненный в конечной точке SPARQL, возвращал правильные данные. Я собираюсь принять этот ответ, поскольку он действительно работает, проблема, должно быть, заключается в том, чего мне не хватает, что отличается от вашего кода. Большое тебе спасибо! - person Koalk; 27.03.2014