在 Fuseki SPARQL 端点上使用 Jena API 进行的事务实际上并不修改数据库

问题描述 投票:0回答:1

我想使用事务在 SPARQL 端点上执行插入/更新/删除查询。问题是更改实际上并未保存到端点。

如果我运行这个小示例程序:

    public void test1()
    {
        Dataset dataset = DatasetFactory.create("http://localhost:3030/demo");
        System.out.println("Supports transactions = " + dataset.supportsTransactions());
        System.out.println("Triples before: " + dataset.getDefaultModel().size());

        dataset.begin(TxnType.WRITE);

        UpdateRequest request = UpdateFactory.create(
            "INSERT DATA { <http://example.org/b68d359eb001> a 123 }");
        UpdateExecution.dataset(dataset).update(request).execute();

        try
        {
            dataset.commit();
        }
        catch (Throwable throwable)
        {
            throwable.printStackTrace();
        }
        finally
        {
            dataset.end();
        }

        System.out.println("Triples after: " + dataset.getDefaultModel().size());
    }

它输出:

Supports transactions = true
Triples before: 1178
Triples after: 1179

我们可以看到新的三元组已添加到数据集对象中。但是,如果我再次运行该程序,我会得到确切的输出,因此三元组实际上并未保存到数据库中。如果我使用 Fuseki UI 运行相同的查询,它可以毫无问题地保存三元组。我是否错误地运行了交易?

我遵循了文档:https://jena.apache.org/documentation/txn/transactions_api.html(请参阅那里最大的代码片段)。请注意,我需要使用 SPARQL 查询进行更新,而不是通过模型等进行更新。

transactions sparql rdf jena fuseki
1个回答
0
投票

看起来我能够通过不使用事务而是将所有查询(我有几个需要执行)放入一个

UpdateRequest
来解决这个问题。如果任何一个查询失败,则整个请求都会失败:

UpdateRequest updateRequest = new UpdateRequest();
statements.forEach(updateRequest::add);
UpdateExec.service("http://localhost:3030/demo").update(updateRequest).execute();
© www.soinside.com 2019 - 2024. All rights reserved.