我已经建立了一个Virtuoso服务器来托管Freebase数据(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.
鉴于这些简单查询的结果,我真的很困惑哪一步带来了性能问题。有人能给我一些建议吗?非常感谢!
正如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。这个问题将通过Development进行分析。