为什么rdflib运行速度如此缓慢?

8

我有一个大的rdf文件:

  • 大小:470MB
  • 行数:近600万
  • 唯一三元组主体:约65万个
  • 三元组数量:约420万个

我通过以下方式将rdf定义加载到rdflib的Berkeley DB后端中:

graph = rdflib.Graph("Sleepycat")
graph.open("store", create=True)
graph.parse("authorities-geografikum_lds.rdf")

在我的笔记本上完成这个任务需要很多小时。虽然我的电脑(Intel B980 CPU,4GB RAM,没有SSD)不是很强大,而且数据很大,但为了完成这个任务花费这么长的时间似乎有些长。也许部分原因是正在进行索引/优化数据结构?

真正令人烦恼的是以下查询所需的时间:

SELECT (COUNT(DISTINCT ?s) as ?c)
WHERE {
    ?s ?p ?o
}

结果:667,445

耗时超过20分钟并且

SELECT (COUNT(?s) as ?c)
WHERE {
    ?s ?p ?o
}

结果:4,197,399

花了超过25分钟的时间。

依据我的经验,如果使用关系型数据库管理系统存储可比较的数据,通过适当的索引,在相应的查询中只需要很短的时间就能完成操作。

因此我有以下问题:

为什么rdflib如此缓慢(特别是在查询时)?

我是否可以像关系型数据库管理系统中的索引一样调整/优化数据库?

是否有另一个(免费且“紧凑的”)三元组存储适合这种大小的数据,从性能方面考虑?


问题是:为什么要在关系数据库上使用rdflib,而不是使用“合适的”三元组存储库?有一些开源软件可用,例如Apache Jena Fuseki、Virtuoso等。 - UninformedUser
关于你的问题,如果查询需要20分钟才能完成,我怀疑是否使用了任何索引。但这是开发人员更好地回答的事情。 - UninformedUser
这里有一些相关问题:https://github.com/RDFLib/rdflib/issues/787 - UninformedUser
感谢您的回答。我的问题是:如果 rdflib 的主要用例是存储和查询三元组,而 rdflib 与 berkeley db 显然不适合此用例,那么为什么还要使用 rdflib 和 berkeley db 呢? - Johann Gottfried
3
在RDF的早期阶段,还没有本地的RDF存储设施。最初的RDF存储是建立在现有的存储引擎上,例如SQL数据库和BDB。rdflib实现可以追溯到这些早期。现在这种方法已经过时了,因为本地存储提供了更好的性能和完整的SPARQL兼容性。(Virtuoso在这里是一个有趣的例外;据我所知,它的RDF存储仍然是一个高度调优的关系型引擎,实际上具有出色的性能。) - cygri
显示剩余3条评论
1个回答

1

我曾经遇到过RDFLIB速度慢的类似情况。对于我来说,一个可能的解决方案是将底层图形存储更改为Oxrdflib,这大大提高了SPARQL查询的速度。

参见:https://pypi.org/project/oxrdflib/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接