首页 > 解决方案 > 针对超大型数据库优化 SPARQL 查询

问题描述

您好,我需要在一个非常大的数据库(特别是 DBPedia)上优化我的(相当简单的)查询。我目前正在为 Python 使用 rdflib 和 SPARQLWrapper。

目前我需要做一个可达性查询,我提供一个源和目标 wiki 文章,一个绑定的d并询问我是否可以通过最多d单击其中的 wikilink 到达目的地。

我正在尝试通过此查询实现 BFS(示例来自 Albert Einstein):

SELECT ?id
WHERE { 
 ?linkto  a  owl:Thing.
 ?linkto dbo:wikiPageID ?id.
 ?origin    dbo:wikiPageWikiLink  ?linkto.
 ?origin  dbo:wikiPageID 736.
}

然后对于找到的每个邻居,我再次执行该查询以查找邻居的邻居(依此类推,直到达到界限)。之后,我检查源文章是否在该邻居列表中以得出可达性问题。

您可以想象的问题是,完成所有这些查询需要很长时间。即使度数只有 2(A->B->C,然后返回找到的所有 C),也需要 20 多秒才能完成。当我尝试使用查询来返回所有 4 级邻居的数量时,这需要 30 秒才能完成(更新:当我今天再次尝试时,它只是返回一个错误,我猜是超时,最后我尝试它返回 1 + 万条)

SELECT ?article (count(distinct ?neighbor4) as ?ncount)
WHERE {
     ?neighbor1 a owl:Thing.
     ?neighbor2 a owl:Thing.
     ?neighbor3 a owl:Thing.
     ?neighbor4 a owl:Thing.
     ?article dbo:wikiPageWikiLink ?neighbor1.
     ?neighbor1 dbo:wikiPageWikiLink ?neighbor2.
     ?neighbor2 dbo:wikiPageWikiLink ?neighbor3.
     ?neighbor3 dbo:wikiPageWikiLink ?neighbor4.
     ?article dbo:wikiPageID 736.
}

所以我想问一下我是否可以做些什么来优化/提高它的性能。我一直在环顾四周,看到以下选项:

  1. 设置本地 SPARQL 端点
  2. 下载包含我需要的三元组并使用该文件的 rdf 文件:由于我只需要 wikilink 关系,我已经发现该文件仅包含来自 DBPedia 的文件。但是压缩后的文件已经快2GB了,我猜未压缩的应该是30+GB左右,rdflib能解析这么大的文件吗?

你知道我能为我的情况做些什么吗?(也许是另一个库,其他更智能的查询方式,......)

谢谢!

标签: pythonquery-optimizationsparqldbpediardflib

解决方案


正如我已回答您的其他问题一样,RDFLib 不适合大量数据,例如 DBpedia 和复杂查询。对于这些用例,最好使用专用的三重存储,例如 Virtuoso Opensource 7,您可以使用 Docker 轻松设置。

至于其他库,论文Graph-XLL: a Graph Library for Extra Large Graph Analytics on a Single Machine可能是一个很好的资源。他们展示了自己的方法,并注意到了其他方法,例如 igraph R 库和 NetworkX for Python。我会先从 NetworkX 开始,因为您已经在使用 Python,如果它无法处理数据,请调查其他库。


推荐阅读