[英]How to make SPARQL queries faster on Virtuoso by controlling query execution order?
我已经设置了一个Virtuoso服务器来托管Freebase数据( 版本07.20.3217,于2017年1月5日构建 ;非常感谢您可以尝试一下 )。
让我们考虑一下这种情况:查找威斯康星州州( fb:m.0824r
)中最大的位置(可能是一个县,用?var1
表示),其中?var1
包含至少一个位置(用?var2
表示),类型为fb:place_with_neighborhoods
。
我编写了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.
和,
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.
鉴于这些简单查询的结果,我真的很困惑哪一步带来了性能问题。 有谁可以给我一些建议吗? 非常感谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.