如何从SPARQL聚合中投影其他变量

时间:2017-07-20 09:35:29

标签: sparql aggregate-functions wikidata

我想在Wikidata的帮助下了解最近的瑞士城市人口。获得具有首选等级的那些将是容易的但没有帮助。我有以下SPARQL查询,但现在我有问题为聚合中的最新日期(而不仅仅是日期)预测实际人口数?popWD。据我了解,您无法预测未汇总的值。

SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {            
      ?wikiURI wdt:P31 wd:Q70208;
               p:P1082 ?popWDStatement.
      ?popWDStatement pq:P585 ?timeWDAll;
                      ps:P1082 ?popWD.
}
GROUP BY ?wikiURI

我用一个确实有效但看起来有点复杂且很慢的子选择解决了这个问题:

SELECT ?wikiURI ?timeWD ?popWD WHERE {
    ?wikiURI p:P1082 ?popWDStatement.
    ?popWDStatement ps:P1082 ?popWD;
                    pq:P585 ?timeWD.
    {
        SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
            ?wikiURI wdt:P31 wd:Q70208;
                     p:P1082 ?popWDStatement.
            ?popWDStatement pq:P585 ?timeWDAll.
        }
        GROUP BY ?wikiURI
    }
}

是否有更好更快的解决方案?上面的代码段应该适用于:https://query.wikidata.org

1 个答案:

答案 0 :(得分:1)

您似乎只需添加一行即可提高查询效果:

#! /usr/bin/tclsh
package require json

proc call_python {} {
    set output [exec python sample.py]
    return [json::json2dict $output]
}

# Print the parsed value out
puts [call_python]

查看这些查询执行计划(向下滚动到“查询评估统计信息”部分):

  1. modified querySELECT ?wikiURI ?timeWD ?popWD WHERE { ?wikiURI wdt:P31 wd:Q70208. #-- this line ?wikiURI p:P1082 ?popWDStatement. ?popWDStatement ps:P1082 ?popWD; pq:P585 ?timeWD. { SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE { ?wikiURI wdt:P31 wd:Q70208; p:P1082 ?popWDStatement. ?popWDStatement pq:P585 ?timeWDAll. } GROUP BY ?wikiURI } } ),
  2. original query(没有?wikiURI wdt:P31 wd:Q70208)。
  3. 此外,下面的变体似乎更具可读性和适应性:

    ?wikiURI wdt:P31 wd:Q70208