SPARQL 查询返回邻居数
Posted
技术标签:
【中文标题】SPARQL 查询返回邻居数【英文标题】:SPARQL query to return number of neighbor 【发布时间】:2021-11-07 18:09:07 【问题描述】:我只需要在 DBPedia 中找到给定文章的邻居数量(最多 4 个节点)(当它们之间有 wikilink 时,2 篇文章是邻居)。目前我正在做这个查询,但计算需要很长时间:
SELECT COUNT(?n4)
WHERE
SELECT DISTINCT ?n4
WHERE
<http://dbpedia.org/resource/Albert_Einstein> dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink ?n4 .
有人知道什么是更好的方法吗?我只需要邻居的数量。该查询只能快速运行到 2 级,从 3 级开始需要将近 30 秒才能完成,而 4 级几乎总是超时。
我正在使用 RDFLib 和 Python 进行查询,所以任何使用 Python 的技巧也会有所帮助!
编辑:我已经下载了数据集并为查询设置了本地端点,但性能仍然很低。
【问题讨论】:
这不是 Python 性能问题。这是三重存储和查询的问题。最好的选择是将 Wikilinks 数据集加载到本地三重存储中,然后运行查询。公共端点是共享资源,具有确保公平使用的限制 忘了提到我已经下载了 wikilink 数据集并设置了本地端点。但与公共端点相比,性能并没有提升。 您使用哪个三联商店?大师?如果是这样,您应该可以通过virtuoso.ini
设置查询超时
是的,我正在使用 virtuoso。但我想知道是否有更有效的方法来进行查询,因为现在它需要很长时间才能被接受。
【参考方案1】:
如果您要对 4 步之外的邻居进行大量重复查询,您可以将所有计算工作集中到一个单一的、一次性的等效属性计算中:
PREFIX ex: <http://example.com/>
CONSTRUCT
?x ex:fourthNeighbour ?y .
WHERE
?x dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink ?y .
这仍然需要很长时间才能运行,但是您只需执行一次,然后对 4 步邻居的任何查询都会快得多。
【讨论】:
【参考方案2】:SPARQL 1.1 属性路径可能具有非常高的时间和空间复杂度,请参阅论文Counting Beyond a Yottabyte, or how SPARQL 1.1 Property Paths will Prevent Adoption of the Standard
您的查询的最大复杂度为 O(n^4),其中 n 是 DBpedia 中的文章数,很多。具体的运行时间取决于数据的网络结构。假设约翰有 100 个朋友,那么 4 级的朋友最多(包括重复)100^4 = 10^8 = 1 亿。
此外,与 Virtuoso Opensource 7 等专用三元存储库相比,RDFLib 在我的测试中性能非常低。
但是,即使这还不够,您也可以尝试专用的图论工具和库,例如 NetworkX、Gephy 和 Cytoscape。虽然 RDF 也是一种图数据模型,但三元存储可能不会针对这种查询进行优化。
【讨论】:
以上是关于SPARQL 查询返回邻居数的主要内容,如果未能解决你的问题,请参考以下文章