SPARQL:与女市长一起获得最大城市

时间:2017-07-07 19:49:34

标签: sparql dbpedia

我试图让所有城市都有一位女市长,但我的问题是,大多数市长如果他们在数据中标记他们大多数没有与一个人联系,他们只是作为字符串给出。那么我怎样才能获得性别。

我得到所有市长的命令是:

SELECT * WHERE {
 ?city a dbo:City .
 ?city dbo:populationTotal ?pop .
 ?city (dbp:mayor | dbo:mayor | dbp:leader |dbo:leader) ?mayor

}
ORDER BY DESC(?pop)

我不确定我是否得到所有市长,因为只有500位市长与19584个城市的人口听起来较少。

由于我没有通过这种方式获得性别,我做了第二次请求让所有女性在DBpedia中尝试比较两个结果,但大部分以超时结束或"没有结果"

在超时运行的示例命令是:

SELECT ?name ?sayor WHERE {
 ?person a dbo:Person .
 ?person foaf:gender ?gender .
 FILTER regex(?gender, "^female$", "i") .
 ?person rdfs:label ?name .
 {
  SELECT str(?mayor) AS ?sayor WHERE {
   ?city a dbo:City .
   ?city (dbp:mayor | dbp:leader) ?mayor .
   FILTER (str(?mayor) = str(?name))
  }
 }
}

有没有人想让所有城市都有女市长?我也很高兴得到一些刺激。

2 个答案:

答案 0 :(得分:4)

这是由于多种因素而产生的特殊问题。这里主要有两个:

dbo的尴尬属性结构:结算: 维基百科模板Infobox结算的信息框没有直接的领导/市长财产。由于这些模板的创建并未考虑到明确的对象结构,因此在此模板中将引导属性展平为:

| leader_title = [[Mayor of Chicago|Mayor]]
| leader_name = [[Rahm Emanuel]]
| leader_party = [[Democratic Party (United States)|D]]
| leader_title1 = [[City council|Council]]
| leader_name1 = [[Chicago City Council]]

这让编辑们没有真正的选择,只能滥用' leader_name属性,不是为了放下名字文字,而是指向有问题的资源(人)。不同的信息框模板具有市长/领导者属性,但这是最常用于描述英语维基百科中城市的属性。

其次,DBpedia映射的相当严格的行为,在处理Infobox属性时可能是文字或资源链接。至少对映射编辑来说很难解决这个问题。 DBpedia现在通过介绍RML mappings来处理这个问题(以及其他问题)。

当然,这也可以在其他dbo类中以类似的方式出现。虽然DBpedia正在研究这些问题,但是从维基百科模板到DBpedia本体的最新映射是解决这个问题的一种方法,任何人都可以contribute

考虑到这一点,我们可以解决您的原产地问题:

SELECT * WHERE {
   ?plebs rdfs:subClassOf dbo:Settlement.
   ?city a ?plebs .
   ?city (dbp:mayor | dbo:mayor | dbp:leader |dbo:leader | dbo:leaderName) ?mayor .
   ?mayor foaf:gender ?gender.
   ?city dbo:populationTotal ?pop .
   FILTER(str(?gender) = "female")
  }
ORDER BY DESC(?pop)

这导致前三名:

http://dbpedia.org/resource/Tokyo   http://dbpedia.org/resource/Yuriko_Koike    
"female"@en    13617445
http://dbpedia.org/resource/Mumbai  http://dbpedia.org/resource/Snehal_Ambekar  
"female"@en    12442373
http://dbpedia.org/resource/Yuncheng    http://dbpedia.org/resource/Wang_Yuyan  
"female"@en    5134779

这对我来说似乎是正确的。

答案 1 :(得分:3)

部分问题在于,对于很多城市而言,DBPedia并没有记录足够的信息来做到这一点。如果我们看一下原始查询的结果,它看起来像这样:

city    pop     mayor
http://dbpedia.org/resource/Berlin  3610156 "Michael Müller"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#langString>
http://dbpedia.org/resource/Hamburg     1774242 http://dbpedia.org/resource/Olaf_Scholz
http://dbpedia.org/resource/Pekanbaru   1093416 "Prof. Dr. Andre Syahputra, M.Sc"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#langString>

see result live

第二行的结果有一个URI(http://dbpedia.org/resource/Olaf_Scholz)作为mayor的结果,这意味着有更多关于该特定市长的信息(例如性别)。但是在第1行和第3行(并且,如果你查看完整的查询结果,大多数行),mayor的值只是一个字符串文字,而不是资源URI - 在这些情况下只有市长的名字记录,但没有进一步的信息。

除此之外,您的第二个查询不必要地复杂。不需要使用子查询或正则表达式来查询市长的性别(至少具有性别的那些),并且使用这些复杂的查询模式会使您的查询超时。你可以这样做:

SELECT * WHERE {
 ?city a dbo:City .
 ?city dbo:populationTotal ?pop .
 ?city (dbp:mayor | dbo:mayor | dbp:leader |dbo:leader) ?mayor .
 ?mayor foaf:gender "female"@en
}
Order by DESC(?pop)

不幸的是,这似乎只给你2或3个结果 - DBPedia上的性别信息非常稀少。您可以通过执行以下查询来验证是否是这种情况:

SELECT * WHERE {
  ?city a dbo:City .
  ?city dbo:populationTotal ?pop .
  ?city (dbp:mayor | dbo:mayor | dbp:leader |dbo:leader) ?mayor .
  ?mayor foaf:gender ?gender
 }
 Order by DESC(?pop)

它会返回所有已知性别的市长。如你所见,结果只有8个左右(2个女性,6个男性)。