包含 Wikidata 上的子查询的 SPARQL 查询给出了意外结果

Med*_*lal 6 sparql wikidata blazegraph wikidata-query-service

我知道以下针对Wikidata SPARQL Endpoint查询的 SPARQL 是毫无意义的。我的应用程序中会自动生成类似的查询。请忽略概念的合理性,让我们深入研究这个奇怪的(至少对我来说)发生的事情。

\n\n
SELECT ?year1 ?year_labelTemp\n    WHERE\n      { \n        ?year1  <http://www.w3.org/2000/01/rdf-schema#label>  ?year_labelTemp .\n        { SELECT distinct ?year1\n          WHERE\n            { ?film  <http://www.wikidata.org/prop/direct/P577>  ?date ;\n                     <http://www.wikidata.org/prop/direct/P31>  <http://www.wikidata.org/entity/Q11424>\n              BIND(year(?date) AS ?year1)\n            }\n        }   \n      }\n    limit 10\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据 SPARQL 中的查询评估,首先评估子查询,然后将其结果投影到包含查询。因此,将首先评估该子查询。

\n\n
SELECT distinct ?year1\n      WHERE\n        { ?film  <http://www.wikidata.org/prop/direct/P577>  ?date ;\n                 <http://www.wikidata.org/prop/direct/P31>  <http://www.wikidata.org/entity/Q11424>\n          BIND(year(?date) AS ?year1)\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

子查询准确地给出了预期的结果(130 个不同的年份)。然后,该子查询(变量)的结果?year1将被投影出来并与外部选择中的三元组模式连接。

\n\n
?year1  <http://www.w3.org/2000/01/rdf-schema#label>  ?year_labelTemp .\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,由于外部选择不应该有任何数据(没有标签?year1),因此连接不会给出任何结果。

\n\n

令人惊讶的是(至少对我来说),执行首先声明的整个查询 () 给出了结果,而且结果很奇怪。

\n\n
 wd:Q43576  Mi\xc3\xab\n wd:Q221    Mas\xc3\xa8donia\n wd:Q221    \xd0\xa0\xd0\xb5\xd1\x81\xd0\xbf\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xba\xd1\x8d\xd1\x83 \xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd0\xb8\xd0\xb5\n wd:Q221    Republiek van Masedoni\xc3\xab\n wd:Q212    \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd0\xb8\xd0\xbd\xd0\xb0\n wd:Q212    Ukraina\n wd:Q212    \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd0\xb8\xd0\xbd\xd1\x8d\n wd:Q212    Oekra\xc3\xafne\n wd:Q207    George W. Bush\n wd:Q207    George W. Bush\n
Run Code Online (Sandbox Code Playgroud)\n\n

我缺少什么?

\n

Sta*_*lin 2

问题是有时BIND无法正确投影变量。

您可以使用以下查询来检查这一点:

SELECT ?year1 ?year_labelTemp ?projected
    WHERE
      { 
        ?year1  rdfs:label  ?year_labelTemp .
        hint:Prior hint:runLast true .
        { SELECT DISTINCT ?year1
          WHERE
            { ?film  wdt:P577  ?date ;
                     wdt:P31 wd:Q11424
              BIND(year(?date) AS ?year1)
              hint:SubQuery hint:runOnce true 
            }
         } 
        BIND(bound(?year1) AS ?projected)
      }
    LIMIT 10
Run Code Online (Sandbox Code Playgroud)

尝试一下!

幸运的是,以下技巧有帮助:

SELECT ?year1 ?year_labelTemp
    WHERE
      { 
        ?year1  rdfs:label  ?year_labelTemp  .
        hint:Prior hint:runLast true .
        { SELECT DISTINCT ?year1
          WHERE
            { ?film  wdt:P577  ?date ;
                     wdt:P31 wd:Q11424
              BIND(year(?date) AS ?year1)
              FILTER (?year1 > 0)
            }
         } 
      }
    LIMIT 10
Run Code Online (Sandbox Code Playgroud)

尝试一下!


该错误可以在没有嵌套子查询和使用的情况下重现hint:Query hint:optimizer "None",因此它应该不是查询优化器错误。但有趣的是,替换为 后 该错误就消失了wd:Q11424wd:Q24862

BLZG-963似乎是最相关的问题(如您所见,也涉及内置函数)。