【问题标题】:Making multiple MQL queries to Freebase from Google GWT Appengine with Python apiclient使用 Python apiclient 从 Google GWT Appengine 对 Freebase 进行多个 MQL 查询
【发布时间】:2012-05-28 09:17:01
【问题描述】:

如何使用适用于 Python 的 Google API 客户端库 (http://wiki.freebase.com/wiki/Google_API_Client_Libraries#Python) 重现以下 MQL 查询

https://api.freebase.com/api/service/mqlread?queries={"q1":[{"name~=":"*doubt*","name": None,"type": "/media_common/quotation","author": [{"name": "William Shakespeare"}]}], "q2":[{"name~=":"*law*","name": None,"type": "/media_common/quotation","author": [{"name": "William Shakespeare"}]}]}

以下单个查询有效:

from apiclient import discovery
from apiclient import model
import json
from pprint import pprint

DEVELOPER_KEY = ''

model.JsonModel.alt_param = ""
freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY)
query = [{"name~=":"*doubt*","name": None,"type": "/media_common/quotation","author": [{"name": "William Shakespeare"}]}]
response = json.loads(freebase.mqlread(query=json.dumps(query)).execute())
pprint (response)

我不知道如何将参数“查询”更改为“查询”

【问题讨论】:

    标签: python freebase google-api-python-client


    【解决方案1】:

    queries 参数已在新 API 中消失。您可以改为使用lightly documented RPC 接口,方式类似于:

    import urllib
    import urllib2
    import json
    
    url = 'https://www.googleapis.com/rpc'
    requests = [{
      'method': 'freebase.text.get', 
      'apiVersion': 'v1', 
      'params': {
       'id': ['en','bob_dylan']
      }
    },{
      'method': 'freebase.text.get', 
      'apiVersion': 'v1', 
      'params': {
        'id': ['en','blade_runner']
      }
    }]
    headers = { 'Content-Type': 'application/json' }
    req = urllib2.Request(url, json.dumps(requests), headers)
    response = urllib2.urlopen(req)
    print response.read()
    

    [代码 sn-p 由 Google 开发人员 Shawn Simister 提供]

    【讨论】:

    • 每个请求是构成一个新的http请求还是都捆绑在一个传输中?
    • 另外,如何将我的 api 密钥添加到此?我收到 DownloadError: ApplicationError: 2 timed out 错误。它在本地运行良好,我只有在部署后才会收到错误。
    【解决方案2】:

    Google API Python Client 的下一个版本(版本 1.0 beta 9)中,您将能够像这样批量处理多个查询:

    from apiclient import discovery, model
    from apiclient.http import BatchHttpRequest
    import json
    
    DEVELOPER_KEY = open('DEVELOPER_KEY').read()
    query1 = [{"name~=":"*doubt*","name":None,"type":"/media_common/quotation","author":[{"name":"William Shakespeare"}]}]
    query2 = [{"name~=":"*law*","name":None,"type":"/media_common/quotation","author":[{"name":"William Shakespeare"}]}]
    
    model.JsonModel.alt_param = ""
    freebase = discovery.build('freebase', 'v1', developerKey=DEVELOPER_KEY)
    
    def display_results(request_id, response):
        for topic in response['result']:
            print topic['name']
    
    batch = BatchHttpRequest(callback=display_results)
    batch.add(freebase.mqlread(query=json.dumps(query1)))
    batch.add(freebase.mqlread(query=json.dumps(query2)))
    batch.execute(http)
    

    使用这种技术,您可以组合多个查询,甚至 MQL 查询与搜索查询,它只会创建一个 HTTP 请求。

    【讨论】:

      【解决方案3】:

      假设发现文档包含queries参数,我相信会是:

      queries = {"q1":[{"name~=":"*doubt*","name": None,"type": "/media_common/quotation","author": [{"name": "William Shakespeare"}]}], "q2":[{"name~=":"*law*","name": None,"type": "/media_common/quotation","author": [{"name": "William Shakespeare"}]}]}
      response = json.loads(freebase.mqlread(queries=json.dumps(queries)).execute())
      pprint (response)
      

      客户端使用发现文档来确定每个 API 方法接受的参数。因此,只需更改 python 参数的名称就可以了。

      【讨论】:

      • 我也这么认为 - 这是我尝试的第一件事,但运气不佳:'得到了一个意外的关键字参数“查询”'
      • 显然查询参数不在发现文档中。我有没有合适的方法来添加参数?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多