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>
第二行的结果有一个 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
这对我来说似乎是正确的。
我试图让所有城市都有一位女市长,但我的问题是,大多数市长如果在数据中被标记,他们大多与一个人无关,他们只以字符串形式给出。那么我怎样才能得到性别。
我得到所有市长的命令是:
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>
第二行的结果有一个 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
这对我来说似乎是正确的。