为什么 rdflib 这么慢?

Joh*_*ied 8 rdf sparql rdflib

我有一个很大的 rdf 文件:

  • 大小:470MB
  • 行数:近600万行
  • 独特的三重科目:约650,000
  • 三倍金额:约4,200,000

我通过以下方式将 rdf 定义加载到 rdflib 的 berkeley db 后端:

graph = rdflib.Graph("Sleepycat")
graph.open("store", create=True)
graph.parse("authorities-geografikum_lds.rdf")
Run Code Online (Sandbox Code Playgroud)

在我的笔记本上花了很多小时才完成。计算机的功能并不强大(Intel B980 CPU、4GB RAM、无 SSD),而且定义也很大,但完成这项任务的时间似乎相当长。也许部分是由于索引/优化数据结构?

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

SELECT (COUNT(DISTINCT ?s) as ?c)
WHERE {
    ?s ?p ?o
}
Run Code Online (Sandbox Code Playgroud)

(结果:667,445)

花了20多分钟

SELECT (COUNT(?s) as ?c)
WHERE {
    ?s ?p ?o
}
Run Code Online (Sandbox Code Playgroud)

(结果:4,197,399)

花了超过25分钟。

根据我的经验,如果有适当的索引,充满可比数据的关系型 DBMS 将在一小部分时间内完成相应的查询。

所以我的问题是:

为什么 rdflib 这么慢(尤其是对于查询)?

我可以像使用 RDBMS 中的索引一样调整/优化数据库吗?

从性能角度来看,另一个(免费且“紧凑”)三重存储是否更适合这种大小的数据?

小智 1

我也经历过 RDFLIB 类似的缓慢行为。对我来说,一个可能的解决方案是将底层图存储更改为 Oxrdflib,这极大地提高了 SPARQL 查询的速度。

请参阅: https: //pypi.org/project/oxrdflib/