Подключение к репозиторию - откат не работает с использованием запросов SPARQL?

Я хочу удалить и вставить тройки из репозитория сезама с помощью запросов SPARQL, и я хочу выполнить обе операции как одну транзакцию.

  1. УДАЛИТЬ
  2. ВСТАВЛЯТЬ

Если во время транзакции возникает исключение, выполняется откат ... но похоже, что это не работает. Проблема в том, что если во время запроса вставки возникает исключение, выполняется откат, но ранее удаленные тройки не восстанавливаются (почему?).

Вот код:

У меня есть класс OwlimConnector, который обертывает соединение с репозиторием и предоставляет некоторые методы для выполнения запросов SPARQL. В конструкторе этого класса я установил соединение и установил для autocommit значение false:

RemoteRepositoryManager repos_manager = RemoteRepositoryManager.getInstance(SERVER_URL, USER, PASSWORD);
repos_manager.initialize();
Repository ssr = repos_manager.getRepository(REPOSITORY);
rconn = ssr.getConnection();
rconn.setAutoCommit(false);

В OwlimConnector есть метод executeUpdate:

public void executeUpdate(String queryString) throws RepositoryException,                MalformedQueryException, UpdateExecutionException
{
  Update up = rconn.prepareUpdate(QueryLanguage.SPARQL, queryPrefixString + queryString);
  up.execute();
}

и эти методы среди других:

public void commit(){
rconn.commit();
}

public void rollback() {        
rconn.rollback();
}

public void close(){
rconn.close();
}

С другой стороны, у меня есть веб-служба updateUserGroup, которая использует предыдущий OwlimConnector и объект доступа к данным под названием UserGroupDAO:

@PUT
@Consumes(MediaType.APPLICATION_XML)
public Response updateUserGroup(UserGroup ug) {

try {
    oc = new OwlimConnector();
} catch (OwlimInstantiationException e) {
    return ResponseFactory.getError(e.getErrorMessage());
}

try {
    UserGroupDAO ugdao = new UserGroupDAO(oc);
    ugdao.delete(ug.getUri());
    ugdao.add(ug);
    oc.commit();
    oc.close();
    return ResponseFactory.getOK();
} catch (MandatoryFieldException e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(e.getErrorMessage());
} catch (NotExistingResourceException e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(e.getErrorMessage());
} catch (Exception e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(new GenericException(e).getErrorMessage());
}

}

1 Что делает ugdao.delete (ug.getUri ()), так это вызов метода OwlimConnector executeUpdate:

oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }");

Здесь тройки удаляются, хотя фиксации нет!

2 Что делает ugdao.add (ug):

Чтобы проверить, что ug.getName () не является нулем или пробелами, в противном случае создается исключение MandatoryFieldException:

if (ug.getName() == null || ug.getName().equals("")){
throw new MandatoryFieldException("name");
}

Затем данные вставляются:

oc.executeUpdate("INSERT DATA { " + ug.getUri() + " a scmu:UserGroup ; scmu:hasName \"" + ug.getName() + "\" . }");

Когда ug.getName () имеет значение null или пробелы, генерируется исключение MandatoryFieldException и перехватывается updateUserGroup. Затем выполняется откат, но удаленные тройки не восстанавливаются.

Не знаю, почему это происходит. Любая идея?

заранее большое спасибо


person jegarna    schedule 18.09.2012    source источник
comment
Это похоже на проблему / ошибку, характерную для OWLIM, я бы посоветовал задать вопрос в их списках рассылки - в онтексте. com / owlim / списки рассылки   -  person RobV    schedule 18.09.2012
comment
Хорошо, я спрошу там. Я дам вам знать, если у меня будет подсказка.   -  person jegarna    schedule 20.09.2012


Ответы (1)


Решение намного проще, чем я думал. Это ответ, который я получил от Ontotext AD в списке рассылки:

"вы используете RemoteRepository, поэтому каждое обновление немедленно отправляется в удаленный репозиторий на up.execute (), и там оно сразу же автоматически заполняется.

то, что вы могли бы сделать, это вместо подготовки и выполнения каждой операции удаления / добавления в вашей службе, чтобы начать сбор всех отдельных обновлений (например, в StringBuilder) и на oc.commit (), чтобы подготовить и выполнить весь список обновлений одновременно (и просто очистите список при откате, если возникнет исключение)

Ваш запрос на обновление может содержать несколько обновлений "ВСТАВИТЬ ДАННЫЕ" или "УДАЛИТЬ ДАННЫЕ" ... "

И это работает! Спасибо.

person jegarna    schedule 21.09.2012