Моя проблема аналогична задаче, заданной по этому вопросу: существует ли разница между запросами CONSTRUCT, отправленными на конечную точку виртуоза, и одна, отправленная на Йену?
Я использую Virtuoso opensource в качестве своего графического магазина и использую поставщика 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, как я уже сказал, для получения результатов.
Кто-нибудь знает, где может быть ошибка?
Благодарю.
Дэниел.
EDIT: Вот запрос, который я пытаюсь выполнить.
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
}
}
}
Как вы можете видеть, запрос пытается построить граф со всеми узлами, к которым пользователь привязан, с глубиной до пяти отношений и узлами, которые связаны с пользователем с глубиной макс двух отношений.
Какой метод вы использовали для создания объекта 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());
VirtGraph graph = new VirtGraph(String graphName, String url_host, String user, String password)
Model inputModel = new VirtModel(VirtGraph graph)
Так что я думаю, что с этим я просто могу читать и писать в графике, с которым я работаю.