1

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

因此,我首先使用 Jena SDB 将我的 OWL 本体加载到基于 MySQL 的三重存储中。因此我用

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

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

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

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

对于 ontModel,我使用了 OWL_MEM;根据文档,这应该意味着没有应用推理。

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

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

将感谢每一个专家意见或您与耶拿的经验。

4

2 回答 2

0

对于刚刚加载,

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

storeSBD存储对象在哪里)但是如果你在添加和删除,很难加快速度。

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

于 2013-09-06T18:36:14.677 回答
0

使用带有推理器的持久三重存储(尤其是 SDB)并不是一个好主意。Reasoners 经常对数据库执行大量的随机访问,每次访问都有一点开销。一旦你把它们加起来,事情就会变慢。

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

考虑到数据的大小,这可能很适合内存,所以就这样做吧。您始终可以从 SDB 存储中大量移动数据以将其持久化。

于 2013-09-06T15:54:10.130 回答