试图找出所有超过 2000000 人的城市位于使用 DBPEDIA 的区域
Posted
技术标签:
【中文标题】试图找出所有超过 2000000 人的城市位于使用 DBPEDIA 的区域【英文标题】:Trying to figure out all cities larger than 2000000 people locate in a area using DBPEDIA 【发布时间】:2015-03-17 23:18:24 【问题描述】:您好,我正在尝试定位人口超过阈值的区域内的所有城市。
这个 SPARQL 查询工作正常,
SELECT DISTINCT *
WHERE
?city rdfs:label ?citylabel ;
dbpedia-owl:country ?country ;
dbpedia-owl:populationTotal ?population .
?city rdf:type dbpedia-owl:City
UNION
?city rdf:type dbpedia-owl:Settlement
UNION
?city rdf:type dbpedia-owl:Town
?city geo:geometry ?geo .
?country rdfs:label ?countrylabel .
FILTER (
lang(?countrylabel) = 'en' &&
bif:st_intersects(?geo, bif:st_point(2.0, 50.0), 200) &&
?population > 1000000
)
在坐标 (2, 50) 附近给我点 200 公里 - 关闭巴黎
但是,当我将阈值更改为 2000000 时,结果似乎是随机的
SELECT DISTINCT *
WHERE
?city rdfs:label ?citylabel ;
dbpedia-owl:country ?country ;
dbpedia-owl:populationTotal ?population .
?city rdf:type dbpedia-owl:City
UNION
?city rdf:type dbpedia-owl:Settlement
UNION
?city rdf:type dbpedia-owl:Town
?city geo:geometry ?geo .
?country rdfs:label ?countrylabel .
FILTER (
lang(?countrylabel) = 'en' &&
bif:st_intersects(?geo, bif:st_point(2.0, 50.0), 200) && ?population > 2000000
)
我做错了什么?
编辑
我的原始帖子中缺少一些信息。 1) 我正在尝试在我的个人服务器上运行查询。在 DBPedia.org 上,查询似乎工作正常。 2)我基本按照这个链接启用空间查询。总结一下,我已经运行 DB.DBA.RDF_GEO_FILL() 来创建几何属性/索引,然后是检查点。我想没有其他步骤可以采取。 3) 更清楚结果的随机性似乎是以下查询的工作原理:
SELECT DISTINCT ?countrylabel
(group_concat(distinct ?citylabel ; separator = "||")
AS ?city_set)
WHERE
?city rdfs:label ?citylabel ;
dbpedia-owl:country ?country ;
dbpedia-owl:populationTotal ?population .
# City is a Town or Settlement or City
?city rdf:type dbpedia-owl:City
UNION
?city rdf:type dbpedia-owl:Settlement
UNION
?city rdf:type dbpedia-owl:Town
?city geo:geometry ?geo .
?country rdfs:label ?countrylabel .
FILTER (
lang(?countrylabel) = "en" &&
bif:st_intersects(?geo, bif:st_point(2.0, 48.0), 200) &&
?population > 2000000.0
)
如您所见,返回巴黎。注意纬度是 48.0
"head":
"link": [],
"vars": [
"countrylabel",
"city_set"
]
,
"results":
"distinct": false,
"ordered": true,
"bindings": [
"countrylabel":
"type": "literal",
"xml:lang": "en",
"value": "France"
,
"city_set":
"type": "literal",
"value": "Paris"
]
但是,当我将纬度更改为 50 时,一切都变了:
SELECT DISTINCT ?countrylabel
(group_concat(distinct ?citylabel ; separator = "||")
AS ?city_set)
WHERE
?city rdfs:label ?citylabel ;
dbpedia-owl:country ?country ;
dbpedia-owl:populationTotal ?population .
# City is a Town or Settlement or City
?city rdf:type dbpedia-owl:City
UNION
?city rdf:type dbpedia-owl:Settlement
UNION
?city rdf:type dbpedia-owl:Town
?city geo:geometry ?geo .
?country rdfs:label ?countrylabel .
FILTER (
lang(?countrylabel) = "en" &&
bif:st_intersects(?geo, bif:st_point(2.0, 50.0), 200) &&
?population > 2000000.0
)
结果很疯狂(!!!):
"head":
"link": [],
"vars": [
"countrylabel",
"city_set"
]
,
"results":
"distinct": false,
"ordered": true,
"bindings": [
"countrylabel":
"type": "literal",
"xml:lang": "en",
"value": "Poland"
,
"city_set":
"type": "literal",
"value": "Lublin Voivodeship||Voivodia de Lublin"
,
"countrylabel":
"type": "literal",
"xml:lang": "en",
"value": "Mexico"
,
"city_set":
"type": "literal",
"value": "Guanajuato"
,
"countrylabel":
"type": "literal",
"xml:lang": "en",
"value": "United Kingdom"
,
"city_set":
"type": "literal",
"value": "Inner London"
,
"countrylabel":
"type": "literal",
"xml:lang": "en",
"value": "Nigeria"
,
"city_set":
"type": "literal",
"value": "Kano (estado)||Kano State"
]
所以我猜大师创建的索引有问题,但是我不知道我应该怎么做。
【问题讨论】:
你的意思是结果似乎是随机的?当我运行您的第二个查询时,我得到 Paris 和 Nord 作为结果。 (我不知道法国的哪些城市应该符合条件。) 另外,您可以使用 values 简化 ?city a type1 union ?city a type2 ...
。你会做values ?type dbpedia-owl:City dbpedia-owl:Town dbpedia-owl:Settlement ?city a ?type
。在我看来,干净得多。
另外,你应该使用langMatches(lang(?countrylabel),'en')
而不是lang(?countrylabel) = 'en'
。
好吧,原来它可能是一个大师版本的问题。当我从 Virtuoso 7.1 切换到 7.2 时,一切似乎都正常。我将进行更多测试。
【参考方案1】:
我不确定结果“似乎是随机的”是什么意思。我不确定法国有多少地方的人口超过 200 万,但查询返回两个地方:巴黎和北。如果您稍微清理一下查询(例如,使用 value 来简化 union,并使用属性路径来获得正确的 ?country 变量(除非你想要国家变量,在这种情况下保留它),并使用 langMatches 而不是 lang(...) = ...,并过滤城市的语言标签:
select distinct * where
values ?type dbpedia-owl:City dbpedia-owl:Settlement dbpedia-owl:Town
?city a ?type ;
rdfs:label ?citylabel ;
dbpedia-owl:country/rdfs:label ?countrylabel ;
dbpedia-owl:populationTotal ?population ;
geo:geometry ?geo
filter ( langMatches(lang(?countrylabel),'en')
&& langMatches(lang(?citylabel),'en')
&& bif:st_intersects(?geo, bif:st_point(2.0, 50.0), 200)
&& ?population > 2000000 )
SPARQL results
【讨论】:
当我查询 dbpedia.org 端点时,结果非常好。问题出在我个人的大师级安装上。同一查询的结果是墨西哥的一个城市和韩国的另一个城市。那是随机的。没有人口限制,一切都与 dbpedia 端点一样工作。 @FernandoFerreira 我会检查您是否需要做任何事情来启用地理空间 bif 功能。 是的,我会检查的。无论如何,感谢您帮助查询。你的建议确实让它变得更好。 我也会编辑原帖,更清楚我的问题以上是关于试图找出所有超过 2000000 人的城市位于使用 DBPEDIA 的区域的主要内容,如果未能解决你的问题,请参考以下文章