我已经设置了一个用于托管Freebase数据的Virtuoso服务器(version 07.20.3217, built Jan 5 2017;我非常感谢you can have a try}。
让我们考虑这种情况:在威斯康星州(?var1
)找到最大的位置(可能是一个县,用fb:m.0824r
表示),其中?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.
鉴于这些简单查询的结果,我真的很困惑哪一步带来了性能问题。有人能给我一些建议吗?非常感谢!
答案 0 :(得分:2)
正如issue you raised on the project -
所述当查询的其余部分没有产生任何解决方案时,
OPTIONAL
似乎存在查询计划问题,因为仅从初始查询brings results near instantly中删除该子句。删除
?var1 fb:location.location.area ?area
模式(以及ORDER BY DESC(?area)
),这是将解决方案设置为零的原因,同样brings near instant results。这个问题将随着开发一起提出来进行分析。