python - 针对超大型数据库优化 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.
}
所以我想问一下我是否可以做些什么来优化/提高它的性能。我一直在环顾四周,看到以下选项:
- 设置本地 SPARQL 端点
- 下载包含我需要的三元组并使用该文件的 rdf 文件:由于我只需要 wikilink 关系,我已经发现该文件仅包含来自 DBPedia 的文件。但是压缩后的文件已经快2GB了,我猜未压缩的应该是30+GB左右,rdflib能解析这么大的文件吗?
你知道我能为我的情况做些什么吗?(也许是另一个库,其他更智能的查询方式,......)
谢谢!
解决方案
正如我已回答您的其他问题一样,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,如果它无法处理数据,请调查其他库。
推荐阅读
- css - 为什么我的页面的 css 存在/特异性与导入的 css 库(hexagonjs)表现不同
- java - 运行 Android Studio Preferences 活动模板的 Android 异常
- c# - 视觉代码不显示任何文本,有什么建议吗?
- java - 用 FXGraphics2D (Java.awt) 替换 java 中的剪辑
- r - 如何更改 clusterOptions 以在 R 传单中显示饼图?
- user-interface - 用户点击时如何更改文本颜色?Flutter - Firestore - StreamBuilder
- .net - .Net 解析具有 7 个字段的 Cron 表达式
- javascript - XPathEvaluator is undefined' script error in Microsoft Dynamics CRM using IEDriverServer and Internet Explorer through Selenium and Java
- java - Java 并行流工作线程退出后内存的一致性
- windows - 在cmd中的for循环内将变量写入txt文件