【发布时间】: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.
}
所以我想问一下我是否可以做些什么来优化/提高它的性能。我一直在环顾四周,看到以下选项:
- 设置本地 SPARQL 端点
- 下载包含我需要的三元组的 rdf 文件并使用该文件:由于我只需要 wikilink 关系,我已经发现该文件只包含来自 DBPedia 的文件。但是压缩后的文件已经快2GB了,我猜未压缩的应该有30+GB左右,rdflib能解析这么大的文件吗?
你知道我可以为我的情况做些什么吗? (也许是另一个库,其他更智能的查询方式……)
谢谢!
【问题讨论】:
标签: python query-optimization sparql dbpedia rdflib