Загрузка и запрос графов по умолчанию и именованных RDF в Openlink Virtuoso
Я новичок в OpenLink Virtuoso, и у меня есть несколько вопросов, касающихся загрузки графов RDF и выполнения запросов SPARQL к ним через Java и Virtuoso Jena Provider.
Я установил версию Virtuoso06.01.3127
на ПК под управлением Ubuntu 16.04 для настольных компьютеров. Также я использую Virtuoso Jena Provider 3 и Virtuoso JDBC 4 Driver.
Я хочу запускать SPARQL-запросы, используя как графы по умолчанию, так и именованные, как показано ниже:
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix cc: <http://example.org/cc/>
SELECT ?c1 ?sx ?c2 ?m
FROM <http://test.org>
WHERE { ?c1 rdf:type cc:Test1; cc:p11 ?sx.
?c2 rdf:type cc:Test2; cc:p21 ?sx; cc:p22 ?m.
FILTER EXISTS { GRAPH <http://testA.org> {?m cc:p cc:M.} }
}
Так что предполагается, что есть график по умолчанию (http://test.org
) и один названный граф (http://testA.org
).
Я пытался использовать VirtDataset
следующее:
VirtModel Model1 = VirtModel.openDefaultModel("jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
Model1.read(RDF1InputStream, null, "TTL");
VirtModel Model2 = VirtModel.openDatabaseModel("http://testA.org", "jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
Model2.read(RDF2InputStream, null, "TTL");
VirtDataset virtDataset = new VirtDataset("jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
virtDataset.setDefaultModel(Model1);
virtDataset.addNamedModel("http://testA.org", Model2);
String queryString = "prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix cc: <http://example.org/cc/>
SELECT ?c1 ?sx ?c2 ?m
WHERE { ?c1 rdf:type cc:Test1; cc:p11 ?sx.
?c2 rdf:type cc:Test2; cc:p21 ?sx; cc:p22 ?m.
FILTER EXISTS { GRAPH <http://testA.org> {?m cc:p cc:M.} }
}";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, virtDataset);
ResultSet rs = qe.execSelect();
while (rs.hasNext()) {
System.out.println(rs.next());
}
qe.close();
virtDataset.close();
Однако это заканчивается следующей ошибкой в строке: Model1.read(RDF1InputStream, null, "TTL");
Exception in thread "main" org.apache.jena.shared.JenaException: java.sql.BatchUpdateException: SR185: Undefined procedure DB.DBA.rdf_insert_triple_c.
at virtuoso.jena.driver.VirtGraph.stopBatchAdd(VirtGraph.java:1090)
at virtuoso.jena.driver.VirtModel.read(VirtModel.java:273)
at VirtuosoTest.main(VirtuosoTest.java:45)
Caused by: java.sql.BatchUpdateException: SR185: Undefined procedure DB.DBA.rdf_insert_triple_c.
at virtuoso.jdbc4.VirtuosoPreparedStatement.throwBatchUpdateException(VirtuosoPreparedStatement.java:520)
at virtuoso.jdbc4.VirtuosoPreparedStatement.executeBatchUpdate(VirtuosoPreparedStatement.java:156)
at virtuoso.jdbc4.VirtuosoPreparedStatement.executeBatch(VirtuosoPreparedStatement.java:541)
at virtuoso.jena.driver.VirtGraph.stopBatchAdd(VirtGraph.java:1083)
... 2 more
Это процедура DB.DBA.rdf_insert_triple_c
отсутствует? Как я могу это исправить?
В качестве альтернативы я попытался использовать VirtGraph
следующее:
VirtGraph virtGraphTest = new VirtGraph("http://test.org", "jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
virtGraphTest.read("file://test/test.ttl", "TTL");
virtGraphTest.close();
VirtGraph virtGraphTestA = new VirtGraph("http://testA.org", "jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
virtGraphTestA.read("file://test/testA.ttl", "TTL");
virtGraphTestA.close();
VirtGraph virtGraph = new VirtGraph("jdbc:virtuoso://localhost:1111/charset=UTF-8", <usr>, <pass>);
String queryStringTest = " prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix cc: <http://example.org/cc/>
SELECT ?c1 ?sx ?c2 ?m
FROM <http://test.org>
WHERE { ?c1 rdf:type cc:Test1; cc:p11 ?sx.
?c2 rdf:type cc:Test2; cc:p21 ?sx; cc:p22 ?m.
FILTER EXISTS { GRAPH ?g {?m cc:p cc:M.} FILTER(?g=<http://testA.org>) }
}";
Query queryTest = QueryFactory.create(queryStringTest);
VirtuosoQueryExecution qet = VirtuosoQueryExecutionFactory.create(queryTest, virtGraph);
ResultSet rst = qet.execSelect();
while (rst.hasNext()) {
System.out.println(rst.next());
}
qet.close();
virtGraph.close();
Кажется, это работает нормально.
Обратите внимание, что в GRAPH
объявление запроса SPARQL, я использую GRAPH ?g
а потом FILTER (?g=<http://testA.org>)
для того, чтобы указать названный граф.
Если я использую GRAPH <http://testA.org>
вместо этого запрос анализируется, но GRAPH
объявление, кажется, игнорируется, основываясь на результате запроса.
Какой правильный способ вызвать GRAPH
в рамках запроса SPARQL для Virtuoso?
В общем, мне было интересно, что является лучшей практикой для обработки наборов данных RDF и запросов SPARQL, использующих графы по умолчанию и именованные RDF в Virtuoso?
Я сделал поиск в Google по этим вопросам, но я не видел поучительный пример.
Извините за длинный пост и заранее спасибо!
1 ответ
Процедура DB.DBA.rdf_insert_triple_c
встроен в сервер Virtuoso и не существовал в старых версиях Virtuoso 6.x (ваша версия датируется 2013 годом или ранее).
Вы можете установить текущую версию сервера Virtuoso 7.x (настоятельно рекомендуется) или использовать старую версию поставщика Virtuoso Jena для Virtuoso 6.x.