首页 文章

使用 Jena 写入 Ontotext GraphDB

提问于
浏览
2

我正在尝试使用 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 文档,它声明可以使用 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?我见过这个相关的问题,但我希望有更好的方法。

2 回答

  • 3

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

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

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

    不再支持 GraphDB 的 Jena 适配器。

  • 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();
     }
    

    如果需要,它将 auto-commit 并在连接关闭时自动回滚。

相关问题