如何通过控制查询执行顺序使Virtuoso上的SPARQL查询更快?
我已经建立了一个Virtuoso服务器来托管Freebase数据;我真的很感激你如何通过控制查询执行顺序使Virtuoso上的SPARQL查询更快?,sparql,freebase,virtuoso,openlink-virtuoso,Sparql,Freebase,Virtuoso,Openlink Virtuoso,我已经建立了一个Virtuoso服务器来托管Freebase数据;我真的很感激你 让我们考虑一下这个场景:找到最大的位置,可能是一个县,在威斯康星州FB:M.0824R中用VAR1表示,在哪里?VAR1包含至少一个由VAR2表示的位置,类型为FB:PosithION-YouthOrthys/ 我编写了SPARQL查询,如下所示: PREFIX fb: <http://rdf.freebase.com/ns/> SELECT DISTINCT ?var1 ?var2 ?v2_name
让我们考虑一下这个场景:找到最大的位置,可能是一个县,在威斯康星州FB:M.0824R中用VAR1表示,在哪里?VAR1包含至少一个由VAR2表示的位置,类型为FB:PosithION-YouthOrthys/
我编写了SPARQL查询,如下所示:
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var2 fb:type.object.type fb:location.place_with_neighborhoods .
?var1 fb:location.location.area ?area .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
} ORDER BY DESC(?area)
LIMIT 1
不幸的是,Virtuoso引擎在一个多小时内未能返回查询结果
我尝试了一些简单的查询,可以在不到一秒钟的时间内生成结果:
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var2 fb:type.object.type fb:location.place_with_neighborhoods .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
}
# Remove the area-related information with ?var1
# Returns ONLY ONE result in 0.05s.
以及
考虑到这些简单查询的结果,我真的很困惑哪一步会带来性能问题。有谁能给我一些建议吗?非常感谢你 如图纸所示-
当查询的其余部分没有生成解决方案时,似乎存在查询计划问题,并带有OPTIONAL,因为只从初始查询中删除该子句
删除?var1 fb:location.location.area?区域模式,从而删除ORDER BY DESC?区域,这也是将解决方案设置为零的原因
这一问题将随着发展而提出,供他们分析
由于删除具有此属性的三重模式时返回的单个结果与fb:location.location.area没有关系,因此结果将为空。唯一的财产http://rdf.freebase.com/ns/m.05_jhl 是fb:location.location.contains属性。删除可选,启用&explain=on。@AKSW是的,你是对的,我从未找到这一点!所以问题变得更有趣了:当查询显然应该返回空的时候,virtuoso怎么能在那里停留这么长时间呢?@StanislavKralin真棒!这个查询在删除之后工作,我真的很好奇为什么。我在哪里可以设置&explain=on?您可以看到如何分析查询,但老实说,对于非用户体验的用户resp来说,这很难理解。开发商但是您可以将输出附加到邮件列表线程或Github问题中
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name ?area WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var1 fb:location.location.area ?area .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
}
# Remove the type limitation of ?var2
# Returns ~7000 results in ~1s.