1

我是 MQL 的绝对初学者,试图通过ken-rb以这种方式访问​​ Freebase :

[1] pry(main)> res = Ken.get("/en/allium_neapolitanum")
=> #<Resource id="/en/allium_neapolitanum" name="Allium neapolitanum">

我注意到通过 freebase API 提交的查询:

{"guid":null,"name":null,"ken:type":[
  {"id":null,"name":null,"properties":[
    {"id":null,
     "name":null,
     "expected_type":null,
     "unique":null,
     "reverse_property":null,
     "master_property":null}]}],
 "/type/reflect/any_master":[
   {"id":null,
    "link":null,
    "name":null,
    "optional":true,
    "limit":999999}],
 "/type/reflect/any_reverse":[
   {"id":null,
    "link":null,
    "name":null,
    "optional":true,
    "limit":999999}],
 "/type/reflect/any_value":[
   {"link":null,
    "value":null,
    "optional":true,
    "limit":999999}],
 "id":"/en/allium_neapolitanum"}

在查询编辑器中摆弄这个 MQL,我找到了一种方法来简单地获取我的资源的常用名称列表:

[2]pry(#<Ken::Resource>):2> data["/type/reflect/any_value"].map { |h| h }
=> [{"link"=>"/type/object/name", "value"=>"Allium neapolitanum"},
 {"link"=>"/type/object/name", "value"=>"שום משולש"},
 {"link"=>"/type/object/name", "value"=>"Ail blanc"},
 {"link"=>"/biology/organism_classification/scientific_name",
  "value"=>"Allium neapolitanum"},
 {"link"=>"/type/object/name", "value"=>"Neapolitanischer Lauch"}]

[3] pry(#<Ken::Resource>):2> names = data["/type/reflect/any_value"].select { |h| h["link"]=="/type/object/name"}
=> [{"link"=>"/type/object/name", "value"=>"Allium neapolitanum"},
 {"link"=>"/type/object/name", "value"=>"שום משולש"},
 {"link"=>"/type/object/name", "value"=>"Ail blanc"},
 {"link"=>"/type/object/name", "value"=>"Neapolitanischer Lauch"}]

[4] pry(#<Ken::Resource>):2> names.map { |name| name["value"] }
=> ["Allium neapolitanum", "שום משולש", "Ail blanc", "Neapolitanischer Lauch"]

问题是:我需要知道哪种语言(我的意思是一个属性,例如:“lang: '/lang/fr'”)与每个通用名称相关。

有机会,使用 Ken 或通过更改 MQL 查询/提交其他查询/等,还有每个“/type/object/name”的语言是什么?

[编辑]

我找到了一种可能的解决方案,但是,我的目标是让数据直接修改由ken-rb发起的原始查询(..复制到问题的顶部)

MQL 可以是:

[{
  "name": [{
    "lang": null,
    "value": null
  }]
  "id": "/en/allium_neapolitanum"
}]​

给出这个结果

  "result": [{
    "id": "/en/allium_neapolitanum",
    "name": [
      {
        "lang":  "/lang/en",
        "value": "Allium neapolitanum"
      },
      {
        "lang":  "/lang/he",
        "value": "שום משולש"
      },
      {
        "lang":  "/lang/fr",
        "value": "Ail blanc"
      },
      {
        "lang":  "/lang/de",
        "value": "Neapolitanischer Lauch"
      }
    ]
  }]
4

1 回答 1

1

根据文档,除了 Ken.get() 之外,Ken 还支持 Ken.mqlread(),因此您可以将它与您制定的 MQL 查询一起使用。

话虽如此,我认为a)他们在不返回语言信息的情况下查询多种语言是一个错误,并且b)您可能无论如何都不想使用Ken,因为它似乎仍在使用已弃用的旧freebase.com API并且即将关闭。此处记录了新的 googleapis.com/freebase API 。MQL 语法没有改变,但您需要一个 API 密钥并需要使用新的端点。

如果您想修复 Ken 以返回带有文本值的语言,您可以修改查询的 any_value 部分,如下所示:

{
  "/type/reflect/any_value": [{
    "*":     null,
    "link": {
      "master_property": null,
      "target": {
        "id":       null,
        "optional": true
      }
    },
    "limit": 99999
  }],
  "id":   "/en/allium_neapolitanum"
}​

我认为你也应该能够使用

{
  "/type/reflect/any_value": [{}],
  "id":   "/en/allium_neapolitanum"
}​

但这为您提供了语言和价值,但没有链接,因此您无法判断该值与什么属性相关联(不是很有用)。

请注意,您可以从查询中删除顶级name属性,因为它在技术上是多余的。如果您想保留它以便更轻松地访问名称,您可以考虑将其更改"name":null"name":[{}]which 将为您提供所有语言的名称(所有这些信息也可在查询的 /reflect/any_value 部分中获得)。

最后,我不得不指出,在几乎所有情况下,查询所有属性的所有值都将比必要的更昂贵和更慢,因为通常只对少数关键信息感兴趣。它适用于通用浏览器/资源管理器/调试器,但对于其他几乎所有东西来说都是巨大的矫枉过正。

于 2012-11-18T17:31:32.663 回答