SPARQL查询 - 为什么提取不同的谓词如此之慢?

时间:2017-08-05 02:52:59

标签: sparql linked-data

当我在探索一些SPARQL查询时,我注意到获取不同的谓词非常慢,但在获取主题或对象时没有这样的问题。

我使用linkedgeodata对其进行了测试,并在linkedgeodata的端点(由于显而易见的原因未在此情况下使用的SERVICE命令),SPARQL playground和Apache Jena Fuseki服务器上运行了以下查询。行为是一样的。 任何人都可以帮我理解背后的原因吗?

#selecting distinct subjects. Executes fast
SELECT * WHERE {
 SERVICE <http://linkedgeodata.org/sparql> {
 select distinct ?s
    where{
    ?s ?p ?o .        
    } limit 100
 }  
}

#selecting distinct predicates. VERY SLOW
SELECT * WHERE {
 SERVICE <http://linkedgeodata.org/sparql> {
 select distinct ?p
    where{
    ?s ?p ?o .        
    } limit 100
 }  
}

1 个答案:

答案 0 :(得分:2)

@AKSW在评论中回答;在这里改写了一下 -

通常,数据集的模式比保存实例数据包含更少的三元组;即,有一些属性和类,但有更多的三元组使用这些类和属性。

您的查询必须迭代数据集中的三元组,直到找到足够的谓词(即,直到达到LIMIT)。如果谓词数少于LIMIT(此处少于100个),则甚至可以扫描整个数据集。

LinkedGeoData具有相当少的属性(~1,805;请参阅query textlive result [大约需要3分钟])和相当多的三元组(~1,384,887,592;请参阅{{3} }和query text [大约需要1分钟]),因此,您的第二个查询会慢得多。

谓词索引肯定会加速这个查询;它不仅仅是Virtuoso数据库中的默认索引,因为它在大多数常见场景中都没有提供太多好处(这个查询不是这样)。我们在文档中讨论了live resultdefault "3+2" indexing scheme