繁体   English   中英

SPARQL 查询返回邻居数

[英]SPARQL query to return number of neighbor

我只需要在 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 的技巧也会有所帮助!

编辑:我已经下载了数据集并为查询设置了本地端点,但性能仍然很低。

如果您要对 4 步外的邻居进行大量重复查询,您可以将所有计算工作放在一个单一的、一次性的等效属性计算中:

PREFIX ex: <http://example.com/>

CONSTRUCT {
  ?x ex:fourthNeighbour ?y .
}
WHERE {
  ?x dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink/dbo:wikiPageWikiLink ?y .
}

这仍然需要很长时间才能运行,但是您只需要执行一次,然后对 4 步邻居的任何查询都会快得多。

SPARQL 1.1 属性路径可能具有非常高的时间和空间复杂度,请参阅论文Counting Beyond a Yottabyte,或 SPARQL 1.1 属性路径将如何阻止标准的采用

您的查询的最大复杂度为 O(n^4),其中 n 是 DBpedia 中的文章数,这是很多。 具体的运行时间取决于数据的网络结构。 想象John有100个朋友,那么度数为4的朋友可以达到(包括重复)100^4 = 10^8 = 1亿。

此外,在我的测试中,与 Virtuoso Opensource 7 等专用三重存储库相比,RDFLib 的性能非常低。

然而,如果这还不够,您可以尝试专用的图论工具和库,如 NetworkX、Gephy 和 Cytoscape。 虽然 RDF 也是一种图数据模型,但三元组存储可能不会针对这种查询进行优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM