SPARQL:按国家选择人员

SPARQL: selecting people by country

我正在尝试 select 来自 DBPedia 的所有出生在特定国家(例如葡萄牙)的人。

我可以使用这个查询:

         SELECT DISTINCT ?person   
         WHERE {
            ?person dbpedia-owl:birthPlace dbpedia:Portugal.
          }

但问题是并非所有人都将 dbpedia:Portugal 作为 出生地。大约 30% 的人只有一个城镇名称 birthPlace,例如

       dbpedia:Lisbon

我可以在 FILTER 子句中添加所有葡萄牙城市,但这是一个很大的列表。

也许可以通过某种方式在 SPARQL 查询中从 Lisbon 推断出 Portugal

(不要在 FILTER 中添加所有葡萄牙城市以获得所有人)

如果我们假设特定国家/地区的所有城市在 dbpedia 中都被定义为该国家/地区的一部分,那么您可以进行查询,首先查找将 dbpedia:Portugal 作为国家/地区的人,然后再查找其中的城市dbpedia:Portugal.

SELECT DISTINCT ?person
WHERE {
    ?person a dbpedia-owl:Person.
Optional{
    ?person dbpedia-owl:birthPlace ?country.
}
Optional{
    ?person dbpedia-owl:birthPlace ?place.
    ?place dbpedia-owl:country ?country
}
filter(?country= dbpedia:Portugal)
}

您编写的查询识别了 1723 个不同的 URI,这找到了 2563 个 URI。

通过这个http://answers.semanticweb.com/questions/22450/sparql-selecting-people-by-country可能会获得完整的结果 - 2730 人

   PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
   PREFIX dbpedia: <http://dbpedia.org/resource/>

   SELECT ?person
    WHERE
      {   
             {?person a <http://dbpedia.org/ontology/Person>;
              <http://dbpedia.org/ontology/birthPlace> ?place.
              ?place <http://dbpedia.org/ontology/country> ?birthCountry.
              ?birthCountry a <http://dbpedia.org/ontology/Country>.
              FILTER (?birthCountry = dbpedia:Portugal).
              }
          UNION
              { ?person a <http://dbpedia.org/ontology/Person>;
              <http://dbpedia.org/ontology/birthPlace> ?birthCountry.
               ?birthCountry a <http://dbpedia.org/ontology/Country>.
              FILTER (?birthCountry = dbpedia:Portugal).
              }
          }
      GROUP BY ?person
      ORDER BY ?person

有效,但对于一个非常简单的查询来说它非常冗长。可以简化为:

select distinct ?person where {
  ?person a dbpedia-owl:Person ;
          dbpedia-owl:birthPlace/dbpedia-owl:country? dbpedia:Portugal
}

SPARQL results (2449)