我试图让所有城市都有一位女市长,但我的问题是,大多数市长如果他们在数据中标记他们大多数没有与一个人联系,他们只是作为字符串给出。那么我怎样才能获得性别。
我得到所有市长的命令是:
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))
}
}
}
有没有人想让所有城市都有女市长?我也很高兴得到一些刺激。
答案 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>
第二行的结果有一个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个男性)。