SPARQL:拥有女市长的最大城市

SPARQL: get biggest city with female mayor

我试图让所有城市都有一位女市长,但我的问题是,大多数市长如果在数据中被标记,他们大多与一个人无关,他们只以字符串形式给出。那么我怎样才能得到性别。

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

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 中的所有女性都得到并尝试比较两个结果,但大多以超时或 "no result"[=12= 结束]

示例命令运行超时为:

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))
  }
 }
}

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

部分问题是 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)

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

这是一个由多种因素引起的特殊问题。这里主要有两个:

dbo:Settlement 笨拙的 属性 结构: Wikipedia Template Infobox结算的Infobox没有直接的leader/mayor属性。由于创建这些模板时并未考虑到清晰的对象结构,因此此模板中的领导者属性被展平为:

| 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]]

这让编辑们别无选择,只能'misuse' leader_name 属性,不要写下名字文字,而是指向相关资源(人)。不同的信息框模板有一个 mayor/leader 属性,但这是英语维基百科中最常用于描述城市的模板。

其次,DBpedia 映射的相当严格的行为,在处理可能是文字或资源的信息框属性时存在问题 link。至少地图编辑很难解决这个问题。 DBpedia 现在正在通过引入 RML mappings 来处理这个(和其他问题)。

当然,这也可以以类似的方式出现在其他 dbo 类 中。虽然 DBpedia 正在研究此类问题,但从维基百科模板到 DBpedia ontology 的最新映射是解决此问题的一种方法,这是任何人都可以做到的 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

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