Search code examples
sparqlwikidata

Wikidata Query misses results


I am trying to query all the countries from Wikidata (query link):

SELECT ?item WHERE { ?item wdt:P31 wd:Q6256. }

Unfortunately, the results are missing for example Switzerland (Q39):

https://www.wikidata.org/wiki/Q39

Looking at the Switzerland data, it has the triple: instance of (P31) country (Q6256). Could you help me understand why Q39 is not present in the results then?

Thanks!


Solution

  • In WikiData, often you have what are called statements. These allow for qualifications to those statements. For instance, in the case of Switzerland being a country, the qualification is that the rank of this statement should be 'normal' instead of preferred. The preferred way to refer to Switzerland is sovereign state (wd:Q3624078), and it looks like WikiData will only have a wdt:P31 relationship between an entity and its 'preferred rank' classification only, as this query shows.

    I think this could be because 'country' is a more generic concept, e.g. Wales is a country but not a sovereign state.

    Fear not however, as this query:

    SELECT DISTINCT ?item
    WHERE { 
      ?item p:P31/ps:P31 wd:Q6256. 
    }
    

    returns wd:Q39 as well. What this query is doing is to navigate from Switzerland to Country via the statement. That is, we have in our data:

    wd:Q39 p:P31 wds:Q39-fbe1ac75-4a8a-93c4-6009-81055d79f9cb .
    wds:Q39-fbe1ac75-4a8a-93c4-6009-81055d79f9cb ps:P31 wd:Q6256 .
    

    but not:

    wd:Q39 wdt:P31 wd:Q6256 .
    

    Try this:

    SELECT DISTINCT *
    WHERE { 
      ?item p:P31 ?y .
      ?y ps:P31 wd:Q6256 ;
         ?p ?o .
      VALUES ?item {wd:Q39}
    }
    

    to see for yourself.