使用DBpedia-Live SPARQL端点http://dbpedia-live.openlinksw.com/sparql,我试图计算与owl:Thing
类型的实例相关联的三元组总数。由于计数非常大,因此抛出异常“Virtuoso 42000错误估计的执行时间”。为了摆脱这种情况,我尝试在查询中使用subselect,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
}
}
您的解决方案始于耐心。当超时发生时,Virtuoso的Anytime Query feature会返回一些结果,并在后台继续运行查询 - 因此,如果您稍后再回来,您通常会获得更多解决方案,直到完整的结果集。
我不得不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秒)相反 - 但是这些都没有明显命中,也没有命中端点的server-side configured timeout。
我想您已经理解了这一点,但请注意,此计数是一个移动目标,并且随着DBpedia-Live内容继续从Wikipedia firehose更新,将会定期更改。
你的分而治之的努力有一个重大问题。请注意,如果没有将ORDER BY
子句与LIMIT
/ OFFSET
子句结合使用,您可能会发现某些解决方案(在这种情况下,?s
的某些值)重复和/或某些解决方案永远不会出现在组合所有这些部分结果的最终聚合中。
此外,当你试图计算三元组时,你应该做一个count(*)
而不是count (?s)
。如果不出意外,这有助于查询的读者了解您正在做什么。
为了能够在您的查询命中时调整此类执行时间限制 - 最简单的方法是通过DBpedia-Live AMI实例化您自己的镜像;遗憾的是,出于多种原因,目前新客户无法使用此功能。 (现有客户可能会继续使用他们的AMI。)我们可能会在某些时候重振这一点,但时机不确定;您可以open a Support Case注册您的兴趣,并在AMI可供新用户使用时收到通知。
迈向最终解决方案......与您目前正在进行的工作相比,可能有更好的方法来实现您的实际目标。您可以考虑询问DBpedia mailing list或OpenLink Community Forum。