如何使用Jena SDB插入/更新/删除个人以保持最佳性能?

时间:2013-09-06 15:15:10

标签: mysql performance sparql jena

最近我从OWL API切换到Jena,希望有关插入和查询数据的性能会提高。

所以我开始使用Jena SDB将我的OWL本体加载到基于MySQL的三重存储中。因此我用了

model.read("owl-concepts.turtle")

Jena在三重存储中创建了大约1500个节点(在Mysql表中)。最初我对节点数量很多感到惊讶。但这似乎是合理的,因为OWL本体包含大约80个具有多个数据和对象属性的OWL类。

为了从本体中读取数据(个体),我利用了Jena SDB接口。我检索了一个模型,并基于模型一个ontModel。我使用ontModel来修改个人,例如:

ontModel.createIndividual(...);
ontModel.getIndividual(....);
individual.remove();

对于使用OWL_MEM的ontModel;根据文件,这应该意味着没有任何推理。

我意识到,基于所描述的方法,个人(s)数据的修改并不像我预期的那么快。平均而言,插入一个简单的个人需要2到30秒。

所以我开始问:在Jena中使用模型接口是推荐的修改数据的方法,还是这种方法性能较低,而SPARQL应该用于修改数据?我最初的计划是仅将SPARQL用于查询部分......

感谢每一位专家意见或您对耶拿的经历。

2 个答案:

答案 0 :(得分:0)

使用持久性三重存储 - 特别是SDB - 使用推理器并不是一个好主意。 Reasoners经常在数据库上执行大量随机访问,每个访问都有一点开销。一旦你添加它们就会变慢。

同样,使用SPARQL而不是模型或本体API,因为您再次生成大量小访问。

鉴于您的数据大小,这可能很适合内存,所以这样做。您始终可以从SDB存储中移除数据,以便持久化它。

答案 1 :(得分:0)

只是加载,

        store.getLoader().startBulkUpdate();
        ...
        store.getLoader().flushTriples(); 

(其中store是SBD商店对象) 但如果你要添加和删除,很难加快。

一种方法是将所有数据读入内存,在那里工作,并将其全部放回原处。您可以使用Fuseki切断的数据并使用SPARQL的图形存储协议部分来执行此操作。您可以使用任何存储后端。