如何减小TDB支持的Jena Dataset的规模?

pau*_*aul 6 java database sparql jena arq

我正在使用一个简单的Jena数据集,它只导入了一个~30 MB的RDF文件.作为应用程序的一部分,我试图让用户查询默认图形(或命名图形),并将查询中生成的三元组插入到新的命名图形中.为此,我使用CONSTRUCT语句以RDF形式构成三元组的结果集,然后将这些三元组放入新模型(使用QueryExecution.execConstruct())并将此模型添加到数据集中.这似乎再次起作用,因为数据集获得了一个新的图形节点,并且TDB数据库文件夹的磁盘大小也在增大.

当我尝试从数据集中删除命名图时,会出现此问题.使用数据集的removeNamedName("graphName")方法,我从数据集中删除模型.对该模型名称的未来查询表明它已成功删除.但是,即使在同步和退出后,TDB数据库文件夹的磁盘大小仍保持相同的大小.

起初我想也许数据库只是将已删除文件的空间标记为空闲,以便在新数据进入时可以覆盖它,但似乎并非如此.如果我删除一个命名图并在同一个程序运行后立即替换它,该文件夹似乎没有增长,但如果我添加一个新的命名图并在同一个运行中删除它,文件夹大小会变大,模型删除不会释放内存,这意味着在几次运行后,数据库文件夹的大小是原始大小的五倍或十倍,而不再保留任何数据.

任何见解或帮助都会很棒,再次感谢.

Rob*_*obV 6

您可以通过询问Jena邮件列表(users@jena.apache.org)获得更多洞察,但我会尝试回答.您可能还希望查看网站上的TDB架构页面.

TDB通过构建所谓的节点表来存储数据,节点表将RDF节点映射为64位整数ID,反之亦然.然后,它使用这些整数ID构建单独的索引,从而允许它执行回答SPARQL查询所需的各种数据库扫描.

添加数据可能会为这两个结构添加条目(节点表和索引),但删除数据只会从索引中删除数据.因此,随着时间的推移,节点表将继续增长,即使您删除旧数据,因为它不会从节点表中删除.

这背后的实际原因有两个:

  1. 整数ID部分编码文件偏移,因此ID到节点查找是一个快速文件扫描因此,当数据被删除时,您不能删除节点表的一部分而不必重写所有节点ID,即ID中的节点表 - >节点方向是一个顺序文件(有助于使插入非常快)
  2. 删除数据时,您不知道是否多次使用节点而未进行完整的数据库扫描.因此,您无法确定是否应首先删除节点表条目.唯一可行的方法是实现完整的引用计数方案,这本身就会增加系统的复杂性并减慢添加和删除的速度.

免责声明 - 我是Jena项目的提交者,从未亲自在TDB组件上做过任何工作,因此这反映了我的最佳理解,可能并不完全准确.