SPARQL:按国家选择人员

SPARQL:按国家选择人员,sparql,dbpedia,Sparql,Dbpedia,我试图从DBPedia中选择所有出生在特定国家(如葡萄牙)的人 我可以使用以下查询: SELECT DISTINCT ?person WHERE { ?person dbpedia-owl:birthPlace dbpedia:Portugal. } 但问题是并不是所有人都把葡萄牙作为出生地。大约30%的人只有一个镇名作为出生地,例如 我可以在过滤条款中添加所有葡萄牙城市,但这是一个很大的列表 也许有可能在S

我试图从DBPedia中选择所有出生在特定国家(如葡萄牙)的人

我可以使用以下查询:

         SELECT DISTINCT ?person   
         WHERE {
            ?person dbpedia-owl:birthPlace dbpedia:Portugal.
          }
但问题是并不是所有人都把葡萄牙作为出生地。大约30%的人只有一个镇名作为出生地,例如

我可以在过滤条款中添加所有葡萄牙城市,但这是一个很大的列表

也许有可能在SPARQL查询中从里斯本推断出葡萄牙


(不要在筛选器中添加所有葡萄牙城市以获取所有人员)

如果我们假设某个特定国家的所有城市都在dbpedia中定义为该国家的一部分,您可以使用一个查询,首先查找将
dbpedia:pulation
作为国家的人,然后查找
dbpedia:pulation
中的城市

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。

通过此查询可以获得完整的结果 -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
前缀dbpedia owl: 前缀dbpedia: 选择人 哪里 { {人a; ?地点。 地点?出生国。 ?出生国a。 过滤器(?出生国=dbpedia:葡萄牙)。 } 联合 {人a; ?出生国。 ?出生国a。 过滤器(?出生国=dbpedia:葡萄牙)。 } } 按人分组 点菜人 有效,但对于一个非常简单的查询来说,它非常冗长。可以简化为:

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

是的,谢谢!。。由于DBPedia的数据,我们仍然错过了大约1000人//dbpedia.org/resource/Vera_Kolodzig。。。。但这是DBPEdia数据issue@gmlvsv这个答案是可行的,但非常冗长。它可以用一种更短(可能更高效)的方式编写。我已经加了。@Artemis,你是如何得到这个2563的结果的?当我运行它时,将select行更改为
select(count(distinct?person)as?n)
,我得到2449,就像在中一样。我觉得有些地方不对劲。。。(不过,当运行OP的查询时,我得到了1723条信息。)我在《为什么计数如此不同》中通过一个简单的计数得到了它?这两个查询之间的区别是什么。我不能全部检查,但我检查了一些,例如you is missing()。因为没有直接指定的国家。那么,与答案中提供的其他两个相比,这个查询发现和缺少了什么呢?我的查询没有遗漏Adriano_Niz。例如,如果您添加一个过滤器,将我的查询限制为那些标签包含“Niz”的查询,例如,使用类似于您得到Adriano Niz的查询,而Adriano Niz具有。我的查询不应该遗漏任何内容。。。此查询查找通过路径
dbpedia owl:birthPlace/dbpedia owl:country?
连接到葡萄牙的个人。结尾的问号很重要;它的意思是“零或一”,所以从一个人到葡萄牙的路径是按出生地,或按出生地/国家,就像你的一样。很高兴知道。谢谢。@Artemis但我还是很好奇,你是如何检查丢失的结果的?如果你点击“SPARQL结果”链接(我第一次忘了放进去),在页面上搜索“_Niz”,你会看到Adriano_Niz的列表非常清晰。不过,我们的查询肯定会以不同的顺序生成结果。我通过一个过滤器进行检查,结果出现了,但当我搜索页面时,它没有出现。我想这是另一个演奏家的小毛病。
select distinct ?person where {
  ?person a dbpedia-owl:Person ;
          dbpedia-owl:birthPlace/dbpedia-owl:country? dbpedia:Portugal
}