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 は Ken.get() に加えて Ken.mqlread() をサポートしているため、作成した MQL クエリでそれを使用できます。

そうは言っても、a)言語情報を返さずに複数の言語を照会するのはバグであり、b)廃止された古いfreebase.com APIをまだ使用しているように見えるため、Kenを使用したくない場合があると主張しますオフにされようとしています。新しい 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":[{}](この情報はすべて、クエリの /reflect/any_value でも利用できます)。

最後に、すべてのプロパティのすべての値をクエリすることは、ほとんどすべての場合において、必要以上にコストがかかり、必要以上に遅くなることを指摘せざるを得ません。汎用のブラウザー/エクスプローラー/デバッガーでは見つかりますが、他のほとんどすべてでは非常にやり過ぎです。

于 2012-11-18T17:31:32.663 に答える