使用耶拿(Jena)写入Ontotext GraphDB

时间:2018-06-29 09:51:53

标签: jena graphdb

我正在尝试使用Jena写入本地免费的独立GraphDB(版本8.5.0)存储库。

我尝试过的事情

(1)从耶拿直接使用

我使用了这个Jena 3.7.0代码段:

String strInsert =  
  "INSERT DATA {"
    + "<http://dbpedia.org/resource/Grace_Hopper> " 
    + "<http://dbpedia.org/ontology/birthDate>" 
    + " \"1906-12-9\"^^<http://www.w3.org/2001/XMLSchema#date> .}";

UpdateRequest updateRequest = UpdateFactory.create(strInsert);

UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemote(updateRequest, 
  "http://localhost:7200/repositories/PersonData");

updateProcessor.execute();

这会导致以下异常

org.apache.jena.atlas.web.HttpException: 415 - 
at org.apache.jena.riot.web.HttpOp.exec(HttpOp.java:1091)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:718)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:501)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:459)
at org.apache.jena.sparql.modify.UpdateProcessRemote.execute(UpdateProcessRemote.java:81)
at org.graphdb.jena.tutorial.SimpleInsertQueryExample.main(SimpleInsertQueryExample.java:91)

在GraphDB端,出现以下错误:

[INFO ] 2018-06-29 11:33:05,605 [repositories/PersonData | o.e.r.h.s.ProtocolExceptionResolver] Client sent bad request ( 415)
org.eclipse.rdf4j.http.server.ClientHTTPException: Unsupported MIME type: application/sparql-update

(2)通过Jena Fuseki实现GraphDB

作为替代方案,我探索了GraphDB documentation,该声明指出可以使用Jena Joseki(现在为Fuseki)服务器访问GraphDB。但是为此,需要配置Fuseki以将GraphDB作为Jena数据集读取,然后通过Ontotext Jena适配器com.ontotext.jena.SesameDataset进行访问。但是我找不到包含此类的GraphDB库。

(3)使用RDF4J访问GraphDB

从RDF4J访问GraphDB不会出现问题:

Repository repository = new HTTPRepository(GRAPHDB_SERVER, REPOSITORY_ID);
repository.initialize();
RepositoryConnection repositoryConnection = repository.getConnection();
repositoryConnection.begin();

Update updateOperation = repositoryConnection.prepareUpdate(QueryLanguage.SPARQL, strInsert);
updateOperation.execute();

try {
  repositoryConnection.commit();
} catch (Exception e) {
  if (repositoryConnection.isActive())
    repositoryConnection.rollback();
}

我的问题

是否有一种方法可以从Jena高效地访问GraphDB?我已经看到了这个related SO question,但我希望有一个更好的方法。

2 个答案:

答案 0 :(得分:3)

GraphDB根据RDF4J协议实现标准的SPARQL 1.1端点。

尝试更改您的代码以指向更新端点:

UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemote(updateRequest, 
    "http://localhost:7200/repositories/PersonData/statements");

不再支持GraphDB的Jena适配器。

答案 1 :(得分:1)

FWIW并不是“如何与Jena连接”的答案,但是用于通过RDF4J API访问GraphDB的代码比需要的复杂。您可以简单地做到这一点:

 Repository repository = new HTTPRepository(GRAPHDB_SERVER, REPOSITORY_ID);
 repository.initialize();

 try(RepositoryConnection conn = repository.getConnection()) {
    conn.prepareUpdate(strInsert).execute();
 }

它将自动提交,并在必要时在连接关闭时自动回滚。