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 查询返回邻居数的主要内容,如果未能解决你的问题,请参考以下文章

邻居数 KNN 算法

通知邻居问题

BGP邻居路由条目数超限

如何从张量返回最大值及其邻居

邻居好说话:冒泡排序

在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居