2017-05-16 14 views
1

私はOpenLink Virtuosoが新しく、RDFグラフのロードとJavaおよびVirtuoso Jena Providerを介したSPARQLクエリの実行に関するいくつかの質問があります。Openlink VirtuosoのデフォルトのRDFグラフと名前付きRDFグラフのロードと照会

私はのUbuntu 16.04デスクトップ版を実行しているPC上でのVirtuosoバージョン06.01.3127をインストールしました。また、Virtuoso Jena Provider 3とVirtuoso JDBC 4 Driverを使用しています。

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)と1つの名前付きグラフ( http://testA.org)があることを前提としています

は、私は次のようにデフォルトと名前付きグラフの両方を呼び出すSPARQLクエリを実行します。

は、私は次のように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 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(); 

は別の方法として、私は次のように VirtGraphを使用してみました。 SPARQLクエリの GRAPH宣言の中で、私は名前のグラフを指定するために GRAPH ?g、その後 FILTER (?g=<http://testA.org>)を使用することを

は注意してください。

代わりにGRAPH <http://testA.org>を使用すると、クエリの結果に基づいてクエリが解析されますが、GRAPHの宣言は無視されるようです。

VirtuosoのSPARQLクエリ内でGRAPHを呼び出す正しい方法はどれですか?

一般に、VirtuosoでRDFグラフと名前付きRDFグラフを呼び出すRDFデータセットとSPARQLクエリを処理するためのベストプラクティスは何ですか?

私はこれらの問題についてGoogleで検索しましたが、啓発的な例は見ていません。

申し訳ありませんが、長いポストと事前におねがいします!

答えて

0

手順DB.DBA.rdf_insert_triple_cは、Virtuosoサーバーに組み込まれており、旧バージョンのVirtuoso 6.x(2013年以前のバージョン日付)には存在しませんでした。

Virtuoso server 7.x(強くお勧めします)のcurrent versionをインストールするか、Virtuoso 6.x用の古いバージョンのVirtuoso Jenaプロバイダを使用できます。

関連する問題