Запись в Ontotext GraphDB с использованием 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) GraphDB через Йену Фусеки

В качестве альтернативы я изучил документацию GraphDB, в которой говорится, что доступ к GraphDB можно получить с помощью сервера Jena Joseki, теперь Fuseki. Но для этого необходимо настроить Fuseki для чтения GraphDB как набора данных Jena, а затем доступа к нему через адаптер Ontotext Jena com.ontotext.jena.SesameDataset. Но я не могу найти библиотек GraphDB, которые включают этот класс.

(3) Доступ к GraphDB с помощью RDF4J

Доступ к GraphDB из RDF4J работает без проблем:

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

Мой вопрос

Есть ли способ эффективно получить доступ к GraphDB из Йены? Я видел этот связанный с этим вопрос SO, но я надеялся на лучший подход .


person Henriette Harmse    schedule 29.06.2018    source источник


Ответы (2)


GraphDB реализует стандартные конечные точки SPARQL 1.1 в соответствии с протоколом RDF4J.

Попробуйте изменить свой код, чтобы он указывал на конечную точку обновления:

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

Адаптер Jena для GraphDB больше не поддерживается.

person vassil_momtchev    schedule 29.06.2018

FWIW не является ответом на вопрос «как подключиться к Jena», но код, который вы используете для доступа к GraphDB через RDF4J API, более сложен, чем должен быть. Вы можете просто сделать это:

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

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

Он будет автоматически зафиксирован, а также автоматически откатится при закрытии соединения, если это необходимо.

person Jeen Broekstra    schedule 03.07.2018
comment
Спасибо за информацию, Джин! Я просто хочу проверить: в приведенном мною тривиальном примере автоматическая фиксация, безусловно, не проблема. Однако в случае, когда у вас есть несколько операторов conn.prepareUpdate(strInsertNNN).execute();, я предполагаю, что использование транзакции будет более надежным подходом? Это верно? - person Henriette Harmse; 04.07.2018
comment
Да, выполнение нескольких обновлений в одной транзакции обычно будет быстрее, и вы получите поведение «все или ничего». Обратите внимание, что даже для этой ситуации есть утилиты, облегчающие работу. Подробнее см. В документации по rdf4j. - person Jeen Broekstra; 04.07.2018