2017-07-20 29 views
2

我想借助维基数据了解最近的瑞士城市人口。要获得具有首选排名的人很容易,但没有帮助。我有以下的SPARQL查询,但现在我有问题投射实际人口数?popWD为聚合的最新日期(不仅是日期)。据我所知,你不能投影未汇总的值。如何从SPARQL聚合项目中预测其他变量

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

看来你可以通过添加只有一行提高查询性能:

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) 
+0

感谢您对过滤器结构的第二个变体。这个解决方案似乎和[在这里]介绍的一样(https://stackoverflow.com/questions/36181713/sparql-query-to-get-only-results-with-the-most-recent-date#36183745 ),我现在可以在你的帮助下实施。 – Belda