从类型返回全部 - Freebase MQL

时间:2013-12-19 11:02:57

标签: javascript angularjs freebase mql

为什么这会返回400错误(唯一查询最多可能有一个结果。得到100):

[{
    name:null,
    type:'music/artist'
}]

我希望它能从音乐/艺术家中返回前100个名字?它是一个独特的查询?

我正在尝试构建一个随机查询,我可以提供两个参数 - 页面和页面内的结果返回 - 并返回一个项目

如果MQL支持return: 'random'

之类的东西,那会很棒

编辑 - 添加完整的Angular工厂。如果我将其打入freebase.com/query引擎,则查询运行正常。

myApp.factory('FB_Random', function ($http) {
    return {
        fn: function (callback) {
            $http.get("https://www.googleapis.com/freebase/v1/mqlread",
                {
                    params: {
                        query:[{
                            name: null,
                            type: '/music/artist'
                        }]                        
                    }
                }
            ).success(function (d, status, headers, config) {
                callback(d.result);
            }).error(function (d, status, headers, config) {
                console.log(d);
            });
        }
    };
});

1 个答案:

答案 0 :(得分:1)

看起来这里有一些未记录的Angular行为。根据{{​​3}}, params 参数采用“在网址后将转为?key1=value1&key2=value2的字符串或对象的地图。”

但是,似乎还有一些额外的逻辑可以在 params 映射中查找数组值并将它们转换为重复参数;即。 ?query={...}&query={...}。由于您的查询(正确地)以数组表示法包装,表明您期望多个结果,因此Angular将其解释为具有查询参数的单个值的列表。然后它提取该查询参数并将其添加到URL中,如下所示:

https://www.googleapis.com/freebase/v1/mqlread?query={%22name%22:null,%22type%22:%22/music/artist%22}

这就是为什么您错误地询问查询错误请求单个结果的原因。因为Angular删除了MQL所需的外部数组符号。

解决此问题的最简单方法是将查询简单地包装在另一个数组中,如下所示:

$http.get("https://www.googleapis.com/freebase/v1/mqlread",
  {
    params: {
      query:[[{
        name: null,
        type: '/music/artist'
      }]]                       
    }
  }
)

如果您想使修复更明确,并且您的代码更容易阅读,您可以像这样自己将MQL查询字符串化:

$http.get("https://www.googleapis.com/freebase/v1/mqlread",
  {
    params: {
      query: JSON.stringify([{
        name: null,
        type: '/music/artist'
      }])                     
    }
  }
)