如何从DBpedia获取地理标记的维基百科文章

时间:2016-09-22 08:32:38

标签: r sparql wikipedia dbpedia

我想查询所有带有人员条目的文章及其German DBpedia的地理坐标。由于没有多少文章在信息框中有一个单独的列lat/long,但是有地理标记(参见WikiProject Geographical coordinates),我想得到地理标记,它位于一个右上角维基百科文章(如果存在)。获取此信息的任何想法(如果可能在R中)?

R

中的示例代码
library(SPARQL)

query <- "prefix  dbpedia-owl: <http://dbpedia.org/ontology/> 

SELECT DISTINCT  ?name
             ?staff
             ?lat
             ?long
             ?geometry
WHERE {
  ?place               rdfs:label ?name   .  
  ?place        dbpedia-owl:staff ?staff  .
Optional {  ?place      geo:lat   ?lat    . }
Optional {  ?place      geo:long  ?long   . }
Optional {  ?place      geo:geometry  ?geometry   . }  
}
LIMIT 100"

endpoint <- "http://de.dbpedia.org/sparql"
resultList <- SPARQL(endpoint, query)
head(resultList[[1]])

                                                                            name staff     lat   long geometry
1 "Hochschule für Angewandte Psychologie der Fachhochschule Nordwestschweiz"@de    80 47.4796 8.2129       NA
2                                                         "Hochschule Luzern"@de  1431 47.0140 8.3060       NA
3                                                                      "AKAD"@de   450      NA     NA       NA
4                                                                      "AKAD"@de  2011      NA     NA       NA
5                                                                      "AKAD"@de  2750      NA     NA       NA
6                                                       "Dar ul-Ulum Deoband"@de   400      NA     NA       NA

问题是,大多数文章都没有关于信息框中lat/long的信息,但仍然按照我提到的右上角维基百科中的地理标记进行了地理标记。就像'Fachschule Fulda'一样,它是查询结果的第10行,但没有lat / long。当你转到the Wikipedia article时,你可以看到右上角的坐标。

3 个答案:

答案 0 :(得分:0)

由于我不确定你想从dbpedia中检索什么,这是一个相当普遍的例子。在R中,您可以使用包SPARQL将SPARQL查询发送到您感兴趣的端点(此处为dbpedia.org的端点)。以下是获取所有资源的标签,主题,纬度和经度的代码:

library(SPARQL)

query <- 
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT DISTINCT ?label ?subject  ?lat ?long WHERE {
  ?subject geo:lat ?lat.
  ?subject geo:long ?long.
  ?subject rdfs:label ?label.
}"

endpoint <- "http://dbpedia.org/sparql"
resultList <- SPARQL(endpoint, query)
head(results[[1]])

                    label                                          subject     lat     long
1              "大袋駅"@ja    <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780
2 "Stazione di Ōbukuro"@it    <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780
3              "大袋站"@zh    <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780
4     "Ōbukuro Station"@en    <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780
5   "111 Murray Street"@en  <http://dbpedia.org/resource/111_Murray_Street> 40.7156 -74.0128
6  "11th Ward, Chicago"@en <http://dbpedia.org/resource/11th_Ward,_Chicago> 41.8380 -87.6460



dim(results[[1]])
[1] 10000     4

请注意,一个查询的结果数限制为10000。因此,如果您想要检索更多内容,则必须使用LIMITOFFSET,如下所示:

query <- 
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT DISTINCT ?label ?subject  ?lat ?long WHERE {
  ?subject geo:lat ?lat.
  ?subject geo:long ?long.
  ?subject rdfs:label ?label.
} LIMIT 10000 OFFSET 10000"

此查询会将结果返回10001到20000!

有关SPARQL查询如何工作的详细信息,我可以向您推荐这个优秀的教程:SPARQL by Example

答案 1 :(得分:0)

请注意,DBpedia数据来自维基百科数据,但DBpedia并不总是最新的,所以只是在维基百科上看到的东西并不意味着它将出现在DBpedia上。

我首先在DBpdia数据集中查看您关心的一些资源 - 查看它们具有哪些属性,尤其是查看哪些属性可能是您想要的。

我认为您可能比latlong感兴趣的更多,例如您可能会看到a query like this -

PREFIX  dbpedia-owl:  <http://dbpedia.org/ontology/> 
PREFIX          geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX       georss:  <http://www.georss.org/georss/>

SELECT DISTINCT ?label  ?subject  ?staff
                ?lat ?long 
                ?geometry 
                ?georss
 WHERE 
   {               ?subject  dbpedia-owl:staff ?staff           ;
                             rdfs:label        ?label           .
       OPTIONAL {  ?subject  geo:lat           ?lat             . }
       OPTIONAL {  ?subject  geo:long          ?long            . }
       OPTIONAL {  ?subject  georss:point      ?georss          . }
       OPTIONAL {  ?subject  geo:geometry      ?geometry        . }
    } 
ORDER BY  
          ASC  ( ?lat      ) 
          ASC  ( ?long     ) 
          ASC  ( ?geometry ) 
          ASC  ( ?georss   )
          ASC  ( ?label    )
          ASC  ( ?subject  )
   LIMIT  1000 
  OFFSET  10000

LIVE RESULTS

答案 2 :(得分:0)

我找到了一个尴尬的解决方案,但它正在发挥作用:

  1. 下载包含所有地理编码文章here
  2. 列表的数据库
  3. 使用此query
  4. 将其导入PostGIS数据库
  5. 查询感兴趣区域内的所有记录及其Page_ID
  6. 使用wikiPageID
  7. 查询DBPedia中所有必需的记录
  8. 链接R
  9. 中的两个数据集