2017-07-20 4 views
2

Je voudrais connaître la population la plus récente des communes suisses avec l'aide de Wikidata. Pour obtenir ceux qui ont le rang préféré serait facile mais pas utile. J'ai la requête SPARQL suivante mais maintenant j'ai le problème de projeter le nombre réel de population ?popWD pour la date la plus tardive (et pas seulement la date) hors de l'agrégation. Si je comprends bien, vous ne pouvez pas projeter des valeurs qui ne sont pas agrégées.Comment projeter des variables supplémentaires à partir des agrégats 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 

Je résolu le problème avec une sous-sélection qui fonctionne, mais semble un peu compliqué et assez lent:

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

Y at-il des solutions plus rapides et plus? Le code snippets ci-dessus devrait à la fois le travail à: https://query.wikidata.org

Répondre

1

Il semble que vous pouvez améliorer les performances de votre requête en ajoutant une seule ligne:

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

Jetez un oeil à ces plans d'exécution des requêtes (faites défiler jusqu'à la « Les statistiques d'évaluation des requêtes »section):

  1. modified query (avec ?wikiURI wdt:P31 wd:Q70208),
  2. original query (sans ?wikiURI wdt:P31 wd:Q70208).

En outre, la variante ci-dessous semble être plus lisible et adaptable:

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

Merci pour la deuxième variante avec la structure du filtre. Cette solution semble être la même que celle présentée [ici] (https://stackoverflow.com/questions/36181713/sparql-query-to-get-only-results-with-the-most-recent-date#36183745) que je suis maintenant en mesure de mettre en œuvre avec votre aide. – Belda