Freebase MQL语法规则还提取每个“/ type / object / name”的语言?

时间:2012-11-17 18:11:31

标签: ruby freebase mql

我是MQL的绝对初学者,试图以Freebase方式访问ken-rb

[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"}

query editor中摆弄这个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"
      }
    ]
  }]

1 个答案:

答案 0 :(得分:1)

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

话虽如此,我认为a)这是一个错误,他们在不返回语言信息的情况下查询多种语言而b)你可能不想使用Ken,因为它似乎仍在使用旧的freebase.com API已弃用且即将关闭。新的googleapis.com/freebase API已记录在案here。 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":[{}],这将为您提供所有语言的名称(所有这些信息也可在/ reflect中找到/ any_value)查询的一部分。

最后,我觉得有必要指出,在几乎所有情况下查询所有属性的所有值都会更加昂贵且速度慢,因为人们通常只对几个关键信息感兴趣。它适用于通用浏览器/资源管理器/调试器,但几乎所有其他东西都具有极大的功能。