【问题标题】:SPARQL query executes but returns emptySPARQL 查询执行但返回空
【发布时间】:2018-12-11 11:33:51
【问题描述】:

无法让此 SPARQL 查询返回结果:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT 
  ?team
  ?club
  (sql:group_concat(?coach, ";;;") as ?coaches) 
  (sql:group_concat(?president, ";;;") as ?presidents) 
  (sql:group_concat(?scorer, ";;;") as ?scorers)
  ?date 
  ?position 
  WHERE {
  SERVICE <http://it.dbpedia.org/sparql/> {
     ?value rdfs:label "Campionato italiano di calcio Serie A"@it .
     ?year <http://purl.org/dc/terms/subject> ?value . 
     ?team <http://dbpedia.org/ontology/league> ?year .
     ?team <http://it.dbpedia.org/property/presidente> ?president .
     ?team <http://dbpedia.org/ontology/coach> ?coach .
     ?team <http://it.dbpedia.org/property/campionatoPosizione> ?position .
     ?team <http://it.dbpedia.org/property/stagione> ?date .
     ?team <http://it.dbpedia.org/property/club> ?club .
     OPTIONAL { ?team <http://it.dbpedia.org/property/marcatori> ?scorer }
     FILTER( 1946 < ?date )
  }} group by ?team ?date ?position ?club LIMIT 1

用来运行它的服务是URIBURNER

【问题讨论】:

  • 这与您上一个问题中的问题相同...旧版本的 DBpedia 和 SERVICE 子句必须先从端点收集所有数据,然后才能执行聚合函数。正如上次建议的那样,您应该联系维护人员并建议更新到最新的 Virtuoso。如果您不想这样做,无论出于何种原因,请随时将 DBpedia 下载到您自己的本地 Virtuoso 实例中
  • 好的,但是group_concatdistinct 一起使用——只是更贵。它是 SPARQL 标准的一部分。主要问题仍然存在,Virtuoso 版本太旧,您不能只在意大利 DBpedia 端点上运行查询,因为它根本不支持 group_concat。这很奇怪,说实话我不知道不更新的原因。
  • 此外,当您运行已在其端点上使用 sql:group_concat 解决方法的查询时,您将收到错误 Virtuoso 22023 Error SR319: Max length of a temp row (9206) exceeded - 设置较新版本并检查配置设置。
  • 我只能说 1)这里的整个查询在意大利 DBpedia 端点上不起作用 2)在意大利 DBpedia 端点上运行时,只有三重模式的查询不是空的,所以3) 我确定 SERVICE 子句尝试检索所有数据并执行分组部分,但由于 Virtuoso 随时功能而停止执行。显然,Virtuoso 的维护者和开发者,比如用户 TallTed 可能会给你一个更好的答案。而且您仍然可以托管自己的意大利 DBpedia 实例。幸运的是,数据 + 三重存储是免费的
  • 正如@AKSW 所说,这里问题的根源是提供意大利 DBpedia 端点的非常古老的 Virtuoso(06.01.3127 于 2014 年 9 月 15 日建成)。您最好的直接选择是说服 Marco 等人升级该 Virtuoso。也就是说,请注意 it.dbpedia.org 被配置为仅返回 1000 个结果——因此对于具有较大解决方案集的查询(包括这一解决方案集),您将无法获得完整的结果,因此您可能需要重新考虑您的流程。

标签: sparql dbpedia virtuoso


【解决方案1】:

如 cmets 中所述 --

这里问题的根源是提供意大利 DBpedia 端点的非常老的 Virtuoso(06.01.3127 建造于 2014 年 9 月 15 日)。您最好的直接选择是说服 Marco 等人升级 Virtuoso。

也就是说,请注意页面显示,“(查询结果限制为 1000 条记录)”。 这意味着结果集被截断为 1000 条记录,类似于您从中获得的结果LIMIT 1000 OFFSET 0。 (您可以通过LIMIT 1000 OFFSET 1000 获得下一个 1000。这将是一个重新考虑的过程......)

【讨论】:

    【解决方案2】:

    您使用 URI Burner 有什么原因吗?

    您的查询仅从意大利 DBpedia 端点提取数据,因此:

    1. 不要使用SERVICE 子句;
    2. 只需在 http://it.dbpedia.org/sparql 上运行它!

    另见https://stackoverflow.com/a/53529798/10719765

    此外,查询结果集明确限制为 1,000 行:这也是为了避免查询执行超时。

    如果查询超时,则需要通过OFFSETLIMIT 实现分页机制。例如:

    SELECT ?musician
    WHERE { ?musician a <http://dbpedia.org/ontology/MusicalArtist> . }
    OFFSET 0
    LIMIT 1000
    

    下一页将是OFFSET 1000 LIMIT 2000 等等。

    【讨论】:

    • 我认为您没有尝试使用其他问题中建议的解决方法直接在意大利 DBpedia 端点上运行查询,您将看到该问题会产生“临时行最大长度”错误,因为该端点运行在一个非常旧的 Virtuoso 版本上,所有这些都在 cmets 中讨论过。
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多