2013-02-26 76 views
1

我試圖在Freebase上查詢美國所有縣和他們的goelocation(經度+緯度)。我注意到有時查詢會起作用,但在其他嘗試中,它會返回以下內容:<「HttpError 503在請求時返回」後端錯誤「>當查詢結果超過一定數量時,Freebase + GoogleAPI查詢返回錯誤

我試着更改查詢結果限制,我發現的是,我的查詢分解的極限有所不同;有時它在「極限」:2900時有效,有時在「極限」:1200時返回上述錯誤。我寫的目前爲止的代碼:

 

    from itertools import islice 

    from apiclient import discovery 
    from apiclient import model 
    import json 
    from CREDENTIALS import FREEBASE_KEY 

    from pandas import DataFrame, Series 

    DEVELOPER_KEY = FREEBASE_KEY 

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

    query_json = """ 
    [{ 
     "id": null, 
     "name": null, 
     "/location/us_county/fips_6_4_code": [], 
     "/location/location/geolocation": { 
     "latitude": null, 
     "longitude": null 
     }, 
     "limit": 3050 
    }]""".replace("\n", " ") 

    query = json.loads(query_json) 

    response = json.loads(freebase.mqlread(query=json.dumps(query)).execute()) 

    results = list() 

    for result in islice(response['result'], None): 
     results.append({'id': result['id'], 
         'name': result['name'], 
         'latitude': float(result['/location/location/geolocation']['latitude']), 
         'longitude': float(result['/location/location/geolocation']['longitude']), 
         'fips': result['/location/us_county/fips_6_4_code'], 
         }) 

    states = DataFrame(results) 
    plt.scatter(states["longitude"], states["latitude"]) 

這似乎不是配額問題,而其他人已經注意到Freebase郵箱中的類似問題g列表:http://lists.freebase.com/pipermail/freebase-discuss/2011-December/007710.html 但是這是針對另一種類型的數據,所以看起來他們的解決方案不適用於我正在處理的內容。


[編輯] 我使用的光標通過數據進行迭代,並且它很好地工作。下面是我用最後的代碼:

 

    from itertools import islice 
    from apiclient import discovery 
    from apiclient import model 
    import json 
    from CREDENTIALS import FREEBASE_KEY 
    from pandas import DataFrame, Series 

    DEVELOPER_KEY = FREEBASE_KEY 

    model.JsonModel.alt_param = "" 
    freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY) 
    query = [{ 
     "id": None, 
     "name": None, 
     "type": "/location/us_county", 
     "/location/location/geolocation": { 
     "latitude": None, 
     "longitude": None 
     } 
    }] 

    results = [] 
    count = 0 
    def do_query(cursor=""): 
     response = json.loads(freebase.mqlread(query=json.dumps(query), cursor=cursor).execute()) 
     for result in islice(response['result'], None): 

      results.append({'id': result['id'], 
          'name': result['name'], 
          'latitude': result['/location/location/geolocation']['latitude'], 
          'longitude': result['/location/location/geolocation']['longitude'], 
          }) 
     return response.get("cursor") 

    cursor = do_query() 
    while(cursor): 
     cursor = do_query(cursor) 
     # Check how many iterations this loop has gone through. 
     #print count 
     count+=1 

    # Plug results into a pandas DataFrame and plot. 
    states = DataFrame(results) 
    plt.scatter(states["longitude"], states["latitude"]) 

回答

2

這是一個相對簡單的查詢,但要正確看待它的默認值是100,這是很多比你要求較低。我建議使用一個下限和一個光標來遍歷結果(並提交一個錯誤報告,因爲它不應該返回一個通用的「後端錯誤」,但某種MQL特定的錯誤)

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個結果批次的整個列表進行迭代。

+0

謝謝大家。我用了一個光標,瞧!所有事情都是相應的。 – 2013-02-27 18:57:33