Загрузка и запрос графов по умолчанию и именованных 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.

Другие вопросы по тегам