使用DBpedia-Live SPARQL端点http://dbpedia-live.openlinksw.com/sparql,我试图计算与类型owl:Thing
的实例相关联的三元组总数。由于计数确实很大,因此将引发异常“ Virtuoso 42000错误,预计执行时间”。为了解决这个问题,我尝试在查询中使用子选择limit
和offset
。但是,当offset
大于limit
时,该解决方案将无法正常工作,并且将再次引发相同的异常(Virtuoso 42000错误),有人可以在我的查询中找到问题所在吗? ?或建议解决方法?提供的是我正在尝试的查询:
select count(?s) as ?count
where
{
?s ?p ?o
{
select ?s
where
{
?s rdf:type owl:Thing.
}
limit 10000
offset 10000
}
}
答案 0 :(得分:2)
您的解决方案始于耐心。发生超时时,Virtuoso的Anytime Query feature返回 some 结果,并继续在后台运行查询-因此,如果您稍后再返回,通常可以得到更多的解决方案,直至完整结果集。
我不得不guess at your original query,因为您只发布了您想使用的零散文件-
select ( count(?s) as ?count )
where
{
?s rdf:type owl:Thing.
}
I got 3,923,114只需几秒钟,而不会造成任何超时。我在表单上设置了3000000毫秒(= 3000秒= 50分钟)的超时时间-与端点的默认超时30000毫秒(= 30秒)相反,但显然没有碰到这两个端点,也没有碰到端点的{{ 3}}。
我认为您已经了解了这一点,但是请注意,此计数是一个动态的目标,随着DBpedia-Live内容不断从Wikipedia firehose进行更新,该计数将定期更改。
您的“分而治之”工作存在重大问题。请注意,如果没有将ORDER BY
/ LIMIT
子句与OFFSET
子句结合使用,您可能会发现某些解决方案(在这种情况下,?s
的某些值)会重复和/或某些解决方案永远不会出现在将所有部分结果合并在一起的最终汇总中。
此外,当您尝试计算三倍时,您可能应该执行count(*)
而不是count (?s)
。如果没有其他要求,这可以帮助查询的读者了解您在做什么。
为了能够在查询命中时调整执行时间限制,最简单的方法是通过server-side configured timeout实例化自己的镜像。不幸的是,由于多种原因,当前不适用于新客户。 (现有的客户可能会继续使用他们的AMI。)我们可能会在某个时候恢复这种状态,但是时机不确定。您可以DBpedia-Live AMI注册您的兴趣,并在新用户可以使用AMI时收到通知。
寻求最终解决方案...可能有比您目前正在研究的方法更好的方法来达到您的最终目标。您可以考虑在open a Support Case或DBpedia mailing list上提问。