如何做多个添加操作apache jena tdb

时间:2014-06-26 13:12:32

标签: java sparql jena semantic-web tdb

我必须为DBpedia的一组1500实体序列化一些特定属性(大约十个电影的属性)。因此,对于每个实体,我运行sparql查询以便检索它们,之后,对于每个ResultSet,我使用默认的apache jena tdb API将所有数据存储在tdb数据集中。我为每个属性创建一个语句,然后使用以下代码添加它们:

public void addSolution(QuerySolution currSolution, String subjectURI) {
    if(isWriteMode) {
        Resource currResource = datasetModel.createResource(subjectURI);

        Property prop = datasetModel.createProperty(currSolution.getResource("?prop").toString());
        Statement stat = datasetModel.createStatement(currResource, prop, currSolution.get("?value").toString());
        datasetModel.add(stat);
    }
}

如何在单个数据集上执行多个添加操作?我应该使用什么策略?

编辑:

我能够无错误地执行所有代码,但TDBFactory没有创建任何文件。为什么会这样? 我想我需要Joshua Taylor的帮助

2 个答案:

答案 0 :(得分:2)

听起来好像查询正在远程dbpedia端点上运行。假设这是正确的,你可以做几件事。

首先wrap the update in a transaction

dataset.begin(ReadWrite.WRITE);
try {
  for (QuerySolution currSolution: results) {
    addSolution(...);
  }
  dataset.commit();
} finally {
  dataset.end();
}

其次,您可以通过使用CONSTRUCT来恢复模型来保存自己的工作,而不必循环遍历结果。我不清楚subjectURI发生了什么,但它可能很简单:

CONSTRUCT { <subjectURI> ?prop ?value }
WHERE
... existing query body ...

答案 1 :(得分:0)

我已经解决了我的问题,我想在这里提出我所拥有的问题也会有同样的问题。 对于您执行的每个事务,您需要重新获取数据集模型,并且不要对所有事务使用相同的事务。

因此,对于您启动的每个事务,您需要在调用begin()之后获取数据集模型。 我希望这会有所帮助。