试图找出所有超过 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 的区域的主要内容,如果未能解决你的问题,请参考以下文章

多重比较谬误(Multiple Comparisons Fallacy)

NYOJ--187--快速查找素数(筛选法,素数打表)

从 CLGeocoder 获取当前城市和国家?

青岛和深圳,两座条件相似的城市,为何GDP相差这么大

高速查找素数

一线城市程序员薪资数据出炉,你属于哪一档?