使用 Jena 写入 Ontotext GraphDB
Writing to Ontotext GraphDB using Jena
我正在尝试使用 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
进行访问。但是我找不到包含这个 class.
的 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,但我希望有更好的方法。
GraphDB 根据 RDF4J 协议实现标准 SPARQL 1.1 端点。
- http://localhost:7200/repositories/PersonData - SPARQL 查询端点,不支持 "application/sparql-update"
- http://localhost:7200/repositories/PersonData/statements - SPARQL 更新端点
尝试更改您的代码以指向更新端点:
UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemote(updateRequest,
"http://localhost:7200/repositories/PersonData/statements");
不再支持 GraphDB 的 Jena 适配器。
FWIW 不是 "how to connect with Jena" 的答案,但是您用来通过 RDF4J API 访问 GraphDB 的代码比它需要的更复杂。你可以简单地这样做:
Repository repository = new HTTPRepository(GRAPHDB_SERVER, REPOSITORY_ID);
repository.initialize();
try(RepositoryConnection conn = repository.getConnection()) {
conn.prepareUpdate(strInsert).execute();
}
它将自动提交并在必要时自动回滚连接关闭。
我正在尝试使用 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
进行访问。但是我找不到包含这个 class.
(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,但我希望有更好的方法。
GraphDB 根据 RDF4J 协议实现标准 SPARQL 1.1 端点。
- http://localhost:7200/repositories/PersonData - SPARQL 查询端点,不支持 "application/sparql-update"
- http://localhost:7200/repositories/PersonData/statements - SPARQL 更新端点
尝试更改您的代码以指向更新端点:
UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemote(updateRequest,
"http://localhost:7200/repositories/PersonData/statements");
不再支持 GraphDB 的 Jena 适配器。
FWIW 不是 "how to connect with Jena" 的答案,但是您用来通过 RDF4J API 访问 GraphDB 的代码比它需要的更复杂。你可以简单地这样做:
Repository repository = new HTTPRepository(GRAPHDB_SERVER, REPOSITORY_ID);
repository.initialize();
try(RepositoryConnection conn = repository.getConnection()) {
conn.prepareUpdate(strInsert).execute();
}
它将自动提交并在必要时自动回滚连接关闭。