如何使用Geonames ID丰富地点信息

4

我有一个地点列表,我希望用geonames的ID来丰富它们。由于geonames默认已嵌入到WikiData中,因此我选择直接通过WikiData端点使用SPARQL进行操作。

我的工作流程:

  • I have imported the excel file into OpenRefine and created a new project
  • In OpenRefine I have created my graph, then I have downloaded it as RDF/XML. Here a snapshot:

      <rdf:Description rdf:about="http://localhost:3333/0">
          <rdfs:label>Aïre</rdfs:label>
          <crm:P1_is_identified_by>5A1CE163-105F-4BAF 8BF9</crm:P1_is_identified_by>
      </rdf:Description>
    
  • I have imported then the RDF file into my local graphDB and I runned the federated query:

PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
     SELECT  *
             WHERE {?place <http://purl.org/NET/cidoc-crm/core#P1_is_identified_by> ?value;
                         rdfs:label ?label_geo.
                     SERVICE <https://query.wikidata.org/sparql> { 
                         ?value wdt:P31/wdt:P279* wd:Q515;
                                rdfs:label ?label; 
                                wdt:P1566 ?id_value. 
                      } 
                   }  

     limit 10

没有结果。

输出应该像这样:


|-----------------------|------------------|---------------|
|      Oggetto          |    Place         | GeonamesID    |
|-----------------------|------------------|---------------|
|5A1CE163-105F-4BAF 8BF9|      Aïre        |11048419       |
|-----------------------|------------------|---------------|


建议是什么? 非常感谢。

我不理解你在查询中做了什么。?value不是一个字符串文字吗?在你的例子中,我猜它是 5A1CE163-105F-4BAF 8BF9,对吗?那么,在维基数据中哪个 RDF 三元组会是 "5A1CE163-105F-4BAF 8BF9" wdt:P31 wd:Q515.?文字永远不是 RDF 三元组的主语。如果要按标签连接,应该使用相同的标签变量而不是 ?label?label_geo。而且,你确实应该使用不同的变量来表示 ?value。实际上,这可能仍然失败,因为在维基数据中,文字都有语言标记。 - UninformedUser
明白了。那在OpenRefine中创建一个新的图表怎么样? - Pelide
如果您只使用单个标签变量,现在是否可以工作?它们是相同的吗?我没有任何设置来测试它。如果可能的话,您应该使用语言标签创建标签,例如 "Aïre"@en - UninformedUser
顺便问一下,你有没有检查过Aïre在Wikidata中是否存在? - UninformedUser
1个回答

1

我直接通过客户端解决了这个问题

以下是我的流程:

  1. 我创建了一个包含地名列表的Excel表格
  2. 我编写了一个Python脚本,使用Excel表格中的值作为查询参数,并将输出保存在一个.txt文件中。例如:Aïre,https://www.geonames.org/11048419
import pandas as pd 
import requests
import json
import csv


url = 'http://api.geonames.org/searchJSON?'

#Change df parameters according to excel sheet specification.

df = pd.read_excel('grp.xlsx', sheet_name='Foglio14', usecols="A")

for item in df.place_name:

    df.place_name.head()

    #Change username params with geonames API username

    params ={   'username': "XXXXXXXX", 

                'name_equals': item,

                'maxRows': "1"}

    e = requests.get(url, params=params)

    pretty_json = json.loads(e.text)

    with open("data14.txt", "a") as myfile:

            writer = csv.writer(myfile)

            for item in pretty_json["geonames"]:

                    #print("{}, https://www.geonames.org/{}".format(item["name"], item["geonameId"]))

                    writer.writerow([item["name"], "https://www.geonames.org/{}".format(item["geonameId"])])  #Write row.

    myfile.close()
  1. 我已经将.txt文件中的输出复制到了Excel表格的B列。
  2. 然后我将输出值拆分为两列。例如:
    |---------------------|-----------------------------------|
    |      ColA           |     ColB                          |
    |---------------------|-----------------------------------|
    |         Aïre        | https://www.geonames.org/11048419 |
    |---------------------|-----------------------------------|

  1. 由于地名与获取的结果之间没有1:1的对应关系,因此我已经对齐了这些值。
    • 在Excel表格中,我创建了一个新的空列B
    • 在列B中,我写入了公式:=IF(ISNA(MATCH(A1;C:C;0));"";INDEX(C:C;MATCH(A1;C:C;0))),并将该公式迭代到列表末尾
    • 然后我创建了一个新的空列C
    • 在列C中,我写入了公式:=IFERROR(INDEX($E:$E;MATCH($B1;$D:$D;0));""),并将该公式迭代到列表末尾

这里是最终结果:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接