1

Freebase上のすべての米国の郡とそのgoelocation(経度+緯度)を照会しようとしています。クエリが機能する場合があることに気付きましたが、他の試行では次のように返されます:<"リクエスト時にHttpError503...が"バックエンドエラー">を返しました。

クエリ結果の制限を変更しようとしましたが、クエリが失敗する制限が異なることがわかりました。「limit」:2900の場合に機能する場合もあれば、「limit」:1200の場合に上記のエラーを返す場合もあります。

これまでに書いたコードは次のとおりです。

    itertoolsからisliceをインポートします

    apiclientインポートディスカバリーから
    apiclientインポートモデルから
    jsonをインポートする
    CREDENTIALSからFREEBASE_KEYをインポートします

    パンダからインポートDataFrame、シリーズ

    DEVELOPER_KEY = FREEBASE_KEY

    model.JsonModel.alt_param = ""
    freebase = Discovery.build('freebase'、'v1'、developerKey = DEVELOPER_KEY)

    query_json = "" "
    [{
      "id":null、
      「名前」:null、
      "/ location / us_county / fips_6_4_code":[]、
      "/ location / location / geolocation":{
        「緯度」:null、
        「経度」:null
      }、
      「制限」:3050
    }] "" "。replace(" \ n "、" ")

    query = json.loads(query_json)

    応答=json.loads(freebase.mqlread(query = json.dumps(query))。execute())

    結果=list()

    islice(response ['result']、None)の結果の場合:
        results.append({'id':result ['id']、
                         '名前':結果['名前']、
                         'latitude':float(result ['/ location / location / geolocation'] ['latitude'])、
                         'longitude':float(result ['/ location / location / geolocation'] ['longitude'])、
                         'fips':result ['/ location / us_county / fips_6_4_code']、
                         })

    状態=DataFrame(results)
    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をインポートします
    パンダからインポートDataFrame、シリーズ

    DEVELOPER_KEY = FREEBASE_KEY

    model.JsonModel.alt_param = ""
    freebase = Discovery.build('freebase'、'v1'、developerKey = DEVELOPER_KEY)
    クエリ=[{
      "id":なし、
      「名前」:なし、
      "タイプ": "/ location / us_county"、
      "/ location / location / geolocation":{
        「緯度」:なし、
        「経度」:なし
      }
    }]

    結果=[]
    カウント=0
    def do_query(cursor = ""):
        応答=json.loads(freebase.mqlread(query = json.dumps(query)、cursor = cursor).execute())
        islice(response ['result']、None)の結果の場合:

            results.append({'id':result ['id']、
                             '名前':結果['名前']、
                             'latitude':result ['/ location / location / geolocation'] ['latitude']、
                             'longitude':result ['/ location / location / geolocation'] ['longitude']、
                             })
        response.get( "cursor")を返します

    カーソル=do_query()
    while(カーソル):
        カーソル=do_query(cursor)
        #このループが何回繰り返されたかを確認します。
        #print count
        count + = 1

    #結果をパンダのDataFrameに接続してプロットします。
    状態=DataFrame(results)
    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 に答える