【问题标题】:Optimize SPARQL query for a very large database针对超大型数据库优化 SPARQL 查询
【发布时间】:2021-12-15 04:13:42
【问题描述】:

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

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

我正在尝试通过此查询实现 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能解析这么大的文件吗?

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

谢谢!

【问题讨论】:

    标签: python query-optimization sparql dbpedia rdflib


    【解决方案1】:

    正如我已回复您的other question,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,如果它无法处理数据,请调查其他库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2013-08-09
      相关资源
      最近更新 更多