当前位置: 首页 > 知识库问答 >
问题:

存储库连接-回滚不使用SPARQL查询工作?

江渊
2023-03-14

我希望使用SPARQL查询从sesame存储库中删除和插入三元组,并希望将这两个操作作为单个事务执行。

  1. 删除
  2. 插入

如果在事务期间抛出异常,则执行回滚...但似乎不起作用问题是,如果在插入查询期间抛出异常,则执行回滚,但之前删除的三元组没有恢复(为什么?)。

这里有一些代码:

我有一个名为OwlimConnector的类,它包装了存储库连接,并提供了一些进行SPARQL查询的方法。在这个类的构造函数中,我设置了连接,并将自动提交设置为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();
}

另一方面,我有一个web服务“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什么乌格道。delete(ug.getUri())的作用是调用OwlimConnector方法executeUpdate:

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

在这里,即使没有提交,三元组也会被删除!

2ugdao.add(ug)做的是:

要检查ug.getName()是否为null或空格,否则将引发MandatoryFieldExctive:

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或空格updateUserGroup引发并捕获MandatoryFieldException异常。然后执行回滚,但不会恢复已删除的三元组。

我不知道为什么会这样。知道吗?

事先非常感谢

共有1个答案

居飞扬
2023-03-14

解决方法比我想象的简单得多。这是我从邮件列表中的Ontotext广告中得到的答案:

“您正在使用RemoteRepository,因此每次更新都会立即发送到up.execute()上的远程存储库,并在那里立即自动提交。

您可以做的是,不必准备并执行服务中的每个删除/添加操作,而是开始收集所有单独的更新(例如到StringBuilder中)和oc。commit()一次准备并执行整个更新列表(并在回滚时清除列表,以防引发异常)

您的更新请求可以有多个“插入数据”或“删除数据”更新。。。"

而且很有效!非常感谢。

 类似资料:
  • 我们使用RDF4J(以前的sesame)框架来运行sparql查询到远程GraphDB三重存储。 这可以通过rdf4j HTTPRepository接口成功地工作,该接口使用Graphdb服务器的URL和存储库ID,但在使用rdf4j SPARQLRepository接口时失败,该接口将Sparlqendpointurl作为参数。 在运行查询时,我们在查询验证中得到一个异常 “获取服务器协议失败;

  • ..回购方法 我用DESC和ASC调用编写了一个单元测试,反之亦然,似乎第一个调用是什么,第二个调用给出的结果是一样的。

  • 问题内容: 我想通过注释@Query通过Jpa存储库进行Join查询。我有三个表。 本机查询是: 现在我有了Table Hibernate实体,所以我在ApplicationRepository中尝试过 日志说 意外的标记 有什么想法吗? 我的表实体 Application.java: Customer.java: User.java: 问题答案: 您不需要JPA中的ON子句,因为借助映射注释,J

  • 问题内容: 我想使用带有注释@Query的Jpa存储库进行Join查询。 我有两个表: 和: 本机查询是: 现在我有一个表休眠实体用户和区域 所以我尝试了UserRespository 日志说: 意外的标记: 有什么主意吗? 我的表实体 问题答案: 您遇到此问题的原因有两个。 JPQL查询无效。 您尚未在基础JPQL查询可以利用的实体之间创建关联。 在JPQL中执行联接时,必须确保尝试联接的实体之

  • 我正在尝试使用rdf4j文档构造SPARQL查询:https://rdf4j.org/documentation/tutorials/sparqlbuilder/ 我是java的新手(和stackoverflow,如果写得不好,很抱歉),但我想我已经包含了正确的开始步骤。我用以下方式实例化了一个选择查询、前缀和变量: URL已被右前缀替换 我试图编写的查询是:选择?在哪里{:team_1:draf

  • 本机查询为: 现在我有了表Hibernate实体,所以我在ApplicationRepository中尝试了 日志上说