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

How to project additional variables from SPARQL aggregates

我想借助维基数据了解瑞士城市的最新人口。要获得具有首选等级的那些很容易但没有帮助。我有以下 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

看来您只需添加一行就可以提高查询的性能:

SELECT ?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
    }
}

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

  1. modified query(含 ?wikiURI wdt:P31 wd:Q70208),
  2. original query(没有?wikiURI wdt:P31 wd:Q70208)。

此外,下面的变体似乎更具可读性和适应性:

SELECT ?wikiURI ?timeWD ?popWD WHERE {
    ?wikiURI wdt:P31 wd:Q70208.
    ?wikiURI p:P1082 ?popWDStatement.
    ?popWDStatement ps:P1082 ?popWD;
                    pq:P585 ?timeWD.
    FILTER NOT EXISTS {
        ?wikiURI wdt:P31 wd:Q70208.       #-- this line is important for performance
        ?wikiURI p:P1082 ?popWDStatement_.
        ?popWDStatement_ ps:P1082 ?popWD_;
                         pq:P585 ?timeWD_.
        FILTER (?timeWD_ > ?timeWD)}
} ORDER BY DESC(?popWD)