【问题标题】:How to resolve the execution limits in Linkedmdb如何解决 Linkedmdb 中的执行限制
【发布时间】:2014-08-05 14:25:42
【问题描述】:

我试图从 Linkedmdb 中提取所有电影。我使用 OFFSET 来确保我不会达到每个查询的最大结果数。我在python中使用了以下脚本

"""
 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
 PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
 SELECT distinct ?film
 WHERE {
 ?film a movie:film .
 } LIMIT 1000 OFFSET %s """ %i

我循环了 5 次,偏移量为 0,1000,2000,3000,4000 并记录了结果的数量。它是(1000,1000,500,0,0)。我已经知道限制是 2500,但我认为通过使用 OFFSET,我们可以摆脱这个问题。 这不是真的吗?没有办法获取所有数据(即使我们使用某种循环)?

【问题讨论】:

  • 对不起,我错过了。我会发布您的解决方案以防万一,但感谢您的评论。

标签: sparql linkedmdb


【解决方案1】:

您当前的查询是合法的,但没有指定顺序,因此偏移量不会将您带到结果中可预测的位置。 (惰性实现可能只是一遍又一遍地返回相同的结果。)当您使用 limitoffset 时,您需要使用 按顺序排列。 SPARQL 1.1 规范说(强调):

15.4 OFFSET

OFFSET 导致生成的解决方案在指定的时间后开始 解决方案的数量。零偏移量无效。

使用 LIMIT 和 OFFSET 选择查询的不同子集 除非订单是可预测的,否则解决方案将无用 使用 ORDER BY。

【讨论】:

  • 看起来偏移量大于 2500,Linkedmdb 什么也不返回。我确实遵循了 order by、offset、limit 指令,但对于大于 2500 的 affset 值,服务器似乎没有返回任何内容
  • 它可能只会在内部选择 2500 个结果,然后对它们进行排序,然后再对它们进行分页。如果您可以找到一些可以过滤的值,以便在开始时选择较少的结果,您也许可以解决这个问题。不幸的是,为了获得您需要的数据,我认为您需要一些 SPARQL 1.1 运算符,我认为 LinkedMDB 端点不支持。
  • @JoshuaTaylor 所以当查询返回 0 结果是否意味着我们可以停止?我们可以设置一个条件,比如“如果结果数 = 0,则停止执行循环内的 sparql 查询”
猜你喜欢
  • 2019-08-29
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多