当我在探索一些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
}
}
答案 0 :(得分:2)
@AKSW在评论中回答;在这里改写了一下 -
通常,数据集的模式比保存实例数据包含更少的三元组;即,有一些属性和类,但有更多的三元组使用这些类和属性。
您的查询必须迭代数据集中的三元组,直到找到足够的谓词(即,直到达到LIMIT
)。如果谓词数少于LIMIT
(此处少于100个),则甚至可以扫描整个数据集。
LinkedGeoData具有相当少的属性(~1,805;请参阅query text和live result [大约需要3分钟])和相当多的三元组(~1,384,887,592;请参阅{{3} }和query text [大约需要1分钟]),因此,您的第二个查询会慢得多。
谓词索引肯定会加速这个查询;它不仅仅是Virtuoso数据库中的默认索引,因为它在大多数常见场景中都没有提供太多好处(这个查询不是这样)。我们在文档中讨论了live result和default "3+2" indexing scheme。