我在这里提交了一个不完整的解决方案,既可以解决手头的IATA-Contry-Code问题,也可以吸引人们注意结构化内容的未充分使用资源:我在说Freebase!
从不包括所有IATA代码(虽然我猜覆盖率相对较高)或没有为所有IATA代码分配国家代码(这是较常见的情况)的角度来看,这是不完整的。
我想建议的API是Freebase MQL Read Service。
这项免费服务的工作原理是发送一个HTTPS请求,该请求带有一个使用MQL(Metaweb查询语言)表达查询的参数,并接收具有所需结果的JSON对象。
具体来说,请求看起来像
https://www.googleapis.com/freebase/v1/mqlread?indent=2&query=[{"type":"/aviation/airport","id":null,"limit": 25,"name":null,"sort":"name","iata": "SFO", "/location/location/containedby": [{"limit":6,"name":null,"optional": true,"sort":"name","/location/country/iso3166_1_alpha2": [{ "limit":6, "optional": false, "sort":"value", "value":null}]}],"airport_type": [{"limit":3,"name":null,"optional": true,"sort":"name","type":"/aviation/airport_type"}]}]
^--- here place the IATA code
为了提高可读性,我在多行上显示了带有缩进的相应MQL;与上述相同的只是更好的布局。
[{
"type": "/aviation/airport",
"id": null,
"limit": 25,
"name": null,
"sort": "name",
"iata": "SFO", -- <<< that's where you place the desired IATA code
"/location/location/containedby": [{
"limit": 6,
"name": null,
"optional": true,
"sort": "name",
"/location/country/iso3166_1_alpha2": [{
"limit": 6,
"optional": false,
"sort": "value",
"value": null
}]
}],
"airport_type": [{
"limit": 3,
"name": null,
"optional": true,
"sort": "name",
"type": "/aviation/airport_type"
}]
}]
响应如下所示:
{
"result": [
{
"name": "San Francisco International Airport",
"iata": "SFO",
"/location/location/containedby": [
{
"name": "United States of America",
"/location/country/iso3166_1_alpha2": [
{
"value": "US"
}
]
}
],
"airport_type": [
{
"type": "/aviation/airport_type",
"name": "Public"
}
],
"type": "/aviation/airport",
"id": "/en/san_francisco_international_airport"
}
]
}
通过钻研Freebase
/aviation/airport
类型并使用我将在下面简要介绍的各种工具,在大约30分钟内“解决了”该解决方案。
请注意,这是一种通用方法,适用于各种查询:例如,我们可以将跨度超过500英尺的桥梁建于1950年之前的桥梁清单,而不是将IATA机场代码与ISO国家/地区代码进行匹配,或者出生在给定城市等地的著名音乐家。此外,免费提供AFAIK,Freebase API和信息。但是请注意,与从专门来源获得的内容相比,在Freebase上找到的内容存在一些限制(和某些优势!)。
从Freebase获得的信息可能不如从专门来源获得的API和数据摘录获得的权威,完整或最新。与主要由志愿工作组以协作,类似Wiki的方式在Freebase上收集的信息的准通用性相比,这种局限性表明,与各行各业的有偿专业人员进行的集中,通常是单一目的的信息收集相比IATA或国际海事组织(IMO)之类的组织。另一方面,Freebase以其数据的语义表示,提供了以强大方式连接信息位的方式。权威来源主要提供“表格”数据,而Freebase查询可以匹配看似无关的信息。例如,通过IMO可能会列出海港的年度吨位,码头数量等清单,Freebase还可以找到在这些港口拍摄的电影或出生于该港口的著名作家。
但是足够的披露,让我们看看人们如何产生这些查询
首先,仔细阅读
Freebase上所需项目的种类,以熟悉该站点在该区域必须提供的内容,并获得非正式的“感觉”,以了解此类项目可用信息的广度和深度。
例如,可能会窥视为
Airport Type on Freebase找到的各种机场实例
一旦确定了所需项目的类型,就可以查看其模式(多种到达方法,例如页面底部的链接)
这是我们的
Airport Type示例的架构。
该模式显示为给定类型收集哪些信息字段。但是请注意,尽管架构可以相对完整和详尽,但相应类型的各个实例可能并未全部正确填写这些字段:请使用实例的临时评审或实例列表进行非正式验证,如下所述。
返回实例视图列表,并通过添加和删除列来修改此视图。分别通过列表左上方的橙色“ +”按钮和每个列标题旁边的小“ x”按钮来完成此操作。
查看“添加新列”部分中显示的树(按下“ +”后显示)如何允许深入研究以我们开头的类型或与其连接的类型的模式。
在机场方面,我迅速删除了与“图片”,“文章”和“航空公司”相关的字段,以腾出空间,并添加了IATA代码,并在“位置”中钻取以查找国家/地区,然后ISO代码。与“国家/地区”的联系有点棘手,我不得不查看“包含者”本身就是另一个“位置”,然后使用“更多”调出“国家/地区”类型。
有了表格列表,所需的字段以及可能用于查看目的的一些其他字段之后,可以通过在“使用此集合中的数据”中选择“ MQL”链接来导出相应的MQL代码。页面底部。这会弹出一个窗口,您可以在其中复制MQL代码段,尽管继续进行
Query Editor可能更好。 (由于应用程序存在一个错误,当您按下“在查询编辑器中查看”按钮时,该错误不会带来该MQL,因此您可能仍需要复制MQL代码并将其粘贴回编辑器中。)
查询编辑器提供了一种调整此初始/默认查询并对其进行测试的便捷方法。您可能需要熟悉
MQL language,这通常很直观。
当查询恰好产生了我们所需的内容时,就该使它成为“单行”(编辑器屏幕底部的格式化便捷按钮)了,然后可以在Freebase MQL Read服务的URL中使用它(请参见示例)。此答案的顶部)。
还有更多的测试和调整(例如,在将字符串复制/编辑到URL时解决由拼写错误引起的JSON语法错误)等等。
使用Freebase实际上可以做很多事情,例如使用
Google Client Library来促进与MQL服务的集成。
我想提出以下建议:与将在线API集成到您的应用程序不同,有时可以下载完整列表并使用它创建本地数据库。以这种方式,可以通过添加行和/或填充空列来补充数据。这种方法特别适用于IATA /机场示例-在所有机场及其基本代码列表相对较小且不会频繁变化之后。当然,这种方法可能需要刷新和偶尔维护本地数据库,但是它消除了与Freebase在线,实时连接的要求。
我是一名优秀的程序员,十分优秀!