Как я могу использовать SPARQL, чтобы "соединить таблицу A с таблицей B" и взять только те строки в B со значением MAX? - PullRequest
1 голос
/ 05 мая 2019

Следующий SPARQL запрашивает Wikidata для всех европейских стран (суверенные государства, Q3624078) и загружает для каждой страны последние несколько известных чисел населения (P: 1082 населения):

SELECT DISTINCT ?item $itemLabel ?population ?popDate
  WHERE {
    ?item wdt:P31 wd:Q3624078.                                #select only sovereign states

    ?item wdt:P706/wdt:P361*|wdt:P361*|wdt:P30 wd:Q46.        #select items which are geographically in Europe

    ?item p:P31 ?statement.
    ?statement ps:P31 wd:Q3624078.
    FILTER NOT EXISTS { ?statement pq:P582 ?end. }            #filter out items which are not sovereign states anymore
    FILTER NOT EXISTS { ?item wdt:P31 wd:Q3024240. }          #filter out historical countries

    OPTIONAL {
      ?item p:P1082 ?popStatement.
      ?popStatement ps:P1082 ?population;
                    pq:P585 ?popDate.
      FILTER ( YEAR(?popDate) >= 2014 )
    }
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  }
  ORDER BY ASC($itemLabel)

Вы можете проверить это здесь .

Как я могу ограничить данные о населении самым последним числом населения?

Я пытался ограничить его определенным годом (FILTER (YEAR(?popDate) = 2018), но это не работает, потому что в некоторых странах нет оценки численности населения на 2018 год.

Это похоже на запрос SQL, такой как SELECT * FROM country c INNER JOIN population p ON p.CountryId = c.Id. В SQL вам потребуется создать подзапрос с оператором MAX, чтобы найти самые последние данные о населении по странам. Как я могу добиться того же в SPARQL?

...