我必须为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的帮助
答案 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()之后获取数据集模型。 我希望这会有所帮助。