2017-07-20 27 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