1

我正在尝试在 Freebase 上查询所有美国县及其地理位置(经度 + 纬度)。我注意到有时查询会起作用,但在其他尝试时它会返回以下内容:<"HttpError 503 when requesting...returned "Backend Error">。

我尝试更改查询结果限制,我发现我的查询分解的限制各不相同;有时它在“limit”:2900时起作用,有时它在“limit”:1200返回上述错误。

这是我到目前为止编写的代码:

    从 itertools 导入 islice

    从 apiclient 导入发现
    从 apiclient 导入模型
    导入json
    从 CREDENTIALS 导入 FREEBASE_KEY

    从熊猫导入数据框,系列

    DEVELOPER_KEY = FREEBASE_KEY

    model.JsonModel.alt_param = ""
    freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY)

    query_json = """
    [{
      “身份证”:空,
      “名称”:空,
      "/location/us_county/fips_6_4_code": [],
      “/位置/位置/地理位置”:{
        “纬度”:空,
        “经度”:空
      },
      “限制”:3050
    }]""".replace("\n", "")

    查询 = json.loads(query_json)

    响应 = json.loads(freebase.mqlread(query=json.dumps(query)).execute())

    结果=列表()

    结果为 islice(response['result'], None):
        results.append({'id': 结果['id'],
                         '名称':结果['名称'],
                         '纬度':浮动(结果['/location/location/geolocation']['latitude']),
                         '经度':浮动(结果['/location/location/geolocation']['longitude']),
                         'fips': 结果['/location/us_county/fips_6_4_code'],
                         })

    状态 = 数据帧(结果)
    plt.scatter(states["longitude"], states["latitude"])

这似乎不是配额问题,其他人在 Freebase 邮件列表中注意到了类似的问题:http: //lists.freebase.com/pipermail/freebase-discuss/2011-December/007710.html 但这是针对另一种类型的数据,所以他们的解决方案似乎不适用于我正在研究的内容。


[编辑] 我使用游标遍历数据,它工作正常。这是我使用的最终代码:

    从 itertools 导入 islice
    从 apiclient 导入发现
    从 apiclient 导入模型
    导入json
    从 CREDENTIALS 导入 FREEBASE_KEY
    从熊猫导入数据框,系列

    DEVELOPER_KEY = FREEBASE_KEY

    model.JsonModel.alt_param = ""
    freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY)
    查询 = [{
      “身份证”:无,
      “名称”:无,
      "type": "/location/us_county",
      “/位置/位置/地理位置”:{
        “纬度”:无,
        “经度”:无
      }
    }]

    结果 = []
    计数 = 0
    def do_query(cursor=""):
        响应 = json.loads(freebase.mqlread(query=json.dumps(query), cursor=cursor).execute())
        结果为 islice(response['result'], None):

            results.append({'id': 结果['id'],
                             '名称':结果['名称'],
                             '纬度': 结果['/location/location/geolocation']['latitude'],
                             '经度':结果['/location/location/geolocation']['longitude'],
                             })
        返回 response.get("光标")

    游标 = do_query()
    而(光标):
        游标 = do_query(游标)
        # 检查这个循环经历了多少次迭代。
        #打印计数
        计数+=1

    # 将结果插入 pandas DataFrame 并绘图。
    状态 = 数据帧(结果)
    plt.scatter(states["longitude"], states["latitude"])

4

2 回答 2

2

这是一个相对简单的查询,但从长远来看,默认限制是 100,这比您要求的要低很多。我建议使用下限和光标来翻阅结果(并提交错误报告,因为它不应该返回一般的“后端错误”,而是某种 MQL 特定错误)

于 2013-02-26T12:38:15.097 回答
0

下面是一些示例代码,向您展示如何使用游标遍历结果:

cursor = ''
while cursor != False:
  response = json.loads(freebase.mqlread(query=json.dumps(query), cursor=cursor).execute())
  for county in response['result']:
    print county['name']
  cursor = response['cursor']

只需将该limit子句从您的查询中删除,它将以 100 个结果的批次遍历整个县列表。

于 2013-02-26T19:48:58.420 回答