我正在使用一个简单的Jena数据集,该数据集只导入了一个~30 MB的RDF文件。作为应用程序的一部分,我试图让用户查询默认图形(或命名图形),并将查询中生成的三元组插入到新的命名图形中。为此,我使用CONSTRUCT语句以RDF形式构成三元组的结果集,然后将这些三元组放入新模型(使用QueryExecution.execConstruct())并将此模型添加到数据集中。这似乎再次起作用,因为数据集获得了一个新的图形节点,并且TDB数据库文件夹的磁盘大小也在增大。
当我尝试从数据集中删除命名图时,会出现问题。使用数据集的removeNamedName(“graphName”)方法,我从数据集中删除模型。对该模型名称的未来查询表明它已成功删除。但是,即使在同步和退出后,TDB数据库文件夹的磁盘大小仍保持相同的大小。
起初我认为数据库可能只是将已删除文件的空间标记为空闲,以便在新数据进入时可以覆盖它,但似乎并非如此。如果我删除一个命名图并在同一个程序运行后立即替换它,该文件夹似乎没有增长,但如果我添加一个新的命名图并在同一个运行中删除它,文件夹大小会变大,模型删除不会释放内存,这意味着在几次运行后,数据库文件夹的大小是其原始大小的五倍或十倍,而不再保留任何数据。
任何见解或帮助都会很棒,再次感谢。
答案 0 :(得分:6)
您可以通过询问Jena邮件列表(users@jena.apache.org)获得更多洞察,但我会尝试回答。您可能还希望查看网站上的TDB Architecture页面。
TDB通过构建所谓的节点表来存储数据,节点表将RDF节点映射为64位整数ID,反之亦然。然后,它使用这些整数ID构建单独的索引,这允许它执行回答SPARQL查询所需的各种数据库扫描。
添加数据可能会为这两个结构添加条目(节点表和索引),但删除数据只会从索引中删除数据。因此,随着时间的推移,节点表将继续增长,即使您删除了旧数据,因为它不会从节点表中删除。
背后的实际原因有两个:
免责声明 - 我是Jena项目的提交者但是从未亲自在TDB组件上做过任何工作,所以这反映了我最好的理解,可能不完全准确。