在 Openlink Virtuoso 中加载和查询默认和命名 RDF 图
Loading and querying default and named RDF graphs in Openlink Virtuoso
我对 OpenLink Virtuoso 很陌生,我有一些关于通过 Java 和 Virtuoso Jena Provider 加载 RDF 图并针对它们执行 SPARQL 查询的问题。
我在电脑上安装了Virtuoso版本06.01.3127
运行ning 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();
这似乎工作正常。
请注意,在 SPARQL 查询的 GRAPH
声明中,我使用 GRAPH ?g
然后 FILTER (?g=<http://testA.org>)
来指定命名图。
如果我改用 GRAPH <http://testA.org>
,查询会被解析,但根据查询结果,GRAPH
声明似乎被忽略。
在 Virtuoso 的 SPARQL 查询中调用 GRAPH
的正确方法是什么?
总的来说,我想知道在 Virtuoso 中处理 RDF 数据集和调用默认和命名 RDF 图的 SPARQL 查询的最佳实践是什么?
我已经 Google 搜索这些问题,但我没有看到有启发性的例子。
抱歉这么久 post 并提前致谢!
程序 DB.DBA.rdf_insert_triple_c
内置于 Virtuoso 服务器中,它在旧版本的 Virtuoso 6.x 中不存在(您的版本日期为 2013 年或更早)。
您可以安装 current version of Virtuoso server 7.x(强烈推荐),或使用旧版本的 Virtuoso Jena 提供程序用于 Virtuoso 6.x。
我对 OpenLink Virtuoso 很陌生,我有一些关于通过 Java 和 Virtuoso Jena Provider 加载 RDF 图并针对它们执行 SPARQL 查询的问题。
我在电脑上安装了Virtuoso版本06.01.3127
运行ning 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();
这似乎工作正常。
请注意,在 SPARQL 查询的 GRAPH
声明中,我使用 GRAPH ?g
然后 FILTER (?g=<http://testA.org>)
来指定命名图。
如果我改用 GRAPH <http://testA.org>
,查询会被解析,但根据查询结果,GRAPH
声明似乎被忽略。
在 Virtuoso 的 SPARQL 查询中调用 GRAPH
的正确方法是什么?
总的来说,我想知道在 Virtuoso 中处理 RDF 数据集和调用默认和命名 RDF 图的 SPARQL 查询的最佳实践是什么?
我已经 Google 搜索这些问题,但我没有看到有启发性的例子。
抱歉这么久 post 并提前致谢!
程序 DB.DBA.rdf_insert_triple_c
内置于 Virtuoso 服务器中,它在旧版本的 Virtuoso 6.x 中不存在(您的版本日期为 2013 年或更早)。
您可以安装 current version of Virtuoso server 7.x(强烈推荐),或使用旧版本的 Virtuoso Jena 提供程序用于 Virtuoso 6.x。