2015-06-20 85 views
1

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

我可以使用此查询:

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

但问题是,并不是所有的人都有DBpedia中:葡萄牙发源地。大约30%的人只有一个城镇名称为birthPlace,例如,

 dbpedia:Lisbon 

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

可能可以推断葡萄牙 from 里斯本在SPARQL查询莫名其妙?

(不加过滤器的所有葡萄牙的城市获得所有人)

回答

3

如果我们假定在某一特定国家的所有城市被定义为在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。

+0

呀,感谢..由于DBpedia的数据,我们仍然怀念约1000 persons..e.g。 //dbpedia.org/resource/Vera_Kolodzig ....但它是DBPEdia数据问题 – gmlvsv

+0

@gmlvsv这个答案有效,但它非常冗长。它可以写得更短(也可能更有效)。我已添加[答案](http://stackoverflow.com/a/30988780/1281433)。 –

+0

@Artemis,你如何得到这2563结果呢?当我运行它时,将选择行更改为'select(count(distinct?person)as?n)',我得到2449,就像在[我的答案]中一样(http://stackoverflow.com/a/30988780/1281433 )。我认为有些地方是不正确的......(我运行OP的查询时得到1723) –

1

全部结果可能会受到此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 
1

Artemis' answer的作品,但它是什么是一个非常简单的查询,非常详细。它可以简化为:

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

SPARQL results (2449)

+0

数量如此不同?这两个查询有什么区别。我无法检查所有,但我检查了一些,例如你缺少(http://dbpedia.org/page/Adriano_Niz)。由于没有国家直接指定。那么,与查询中提供的其他两个查询相比,查询发现和丢失的是什么? – Artemis

+0

我的查询不会错过Adriano_Niz。例如。,如果你添加一个过滤器来限制我的查询给那些标签包含“Niz”的人,例如,用[this one](http://pastebin.com/kkMSpmZj)这样的查询,你会得到Adriano Niz,这个结果[这些结果](http://goo.gl/9M7wkA)。我的查询不应该丢失任何东西......此查询查找通过路径“dbpedia-owl:birthPlace/dbpedia-owl:country?'连接到葡萄牙的个人。最后这个问号很重要;它的意思是“零或一”,所以通过出生地或出生地/国家,路径从人到葡萄牙,就像你的。 –

+0

很高兴知道。谢谢。 – Artemis