Googleは1年以上前に、今後は検索に神秘的なナレッジネットワーク(ナレッジグラフの公式翻訳)を使用すると発表しました。 おそらく、Web上のデータの大部分が誰でも使用可能であり、十分に説明されたAPIを介してアクセスできることを誰もが知っているわけではありません。 この部分は、Googleおよび愛好家によって管理されているFreebaseナレッジベースです。 この記事では、まず少しバカにしてから、MQLで簡単なクエリを作成してみます。
この記事は、ナレッジベースシリーズの2番目です。 お楽しみに。
- パート1-はじめに
- パート2-Freebase:Googleナレッジグラフでクエリを作成する
- パート3-Dbpedia-リンクデータワールドのコア
- パート4-ウィキデータ-セマンティックウィキペディア
一般ユーザーの観点から見たGoogleナレッジグラフ
Googleナレッジグラフの目に見える兆候の1つは、探しているオブジェクトを簡単に説明するダッシュボードです。 パーソナリティを検索する際にしばしば発生しますが、地理的名称は少し少なくなります。 英語のインターフェースで英語で定義されたクエリではより頻繁に発生しますが、可能な場合はロシア語に固執します。
たとえば、Roger Watersによるクエリでは、次の結果が得られます。
情報ボックス内のリンクをクリックし、URLに注意してください-スティックパラメーターを使用します。その内容は、フォームの一部の識別子です
&stick=H4sIAAAAAAAAAONg[VuLQz9U3]< >AAAA
ナレッジグラフが最初に表示されたとき、初心者は小さな通りの魔法を示すことができました。たとえば、マリリンモンローからの&スティックパラメーターをスティーブンキングからのリクエストに追加します。
今、彼らはそのような機会を隠しました、そしてそれは私たちにとってそれは価値がありません-私たちは何か有用なものを見たほうがいいでしょう。 たとえば、最近、vsキーワードを使用して複数のオブジェクトを比較することが可能になりました。
Googleは、スマート検索と質問への回答に関連する多くの利点を追加することを約束します。ナレッジグラフは、この知性が支える柱の1つになります。 私たちにとって特に素晴らしいのは、ナレッジグラフの一部が誰でも使用できるように開かれていることです。
Freebase-GNGサブグラフ
歴史的なツアーから始めましょう。 Metawebは2005年にナレッジベースの作業を開始しました。 データを入力する方法では、FreebaseはDbpediaに最も似ていました。Freebaseで提示された知識の大部分はWikipediaのデータでした。 Dbpediaとの違いは、第1に、入力されたデータを手動で修正する機能であり、第2に、Freebaseは他のデータソースを軽視しなかったことです 。 DBpediaチームとは異なり、Metawebの代表者は科学記事を公開することをあまり気にしませんでした(最近始まったものの興味深いリストです)。グラフ化された主要なコンポーネントのコードが日の目を見ることはほとんどありません。
2010年、MetawebはGoogleに買収されましたが、Freebaseメーリングリストから判断すると、検索大手は新たに買収したチームの業務にあまり介入しませんでした。 Googleが新しいインテリジェントセマンティックテクノロジーを使用して競合他社を先駆的な真実として引き裂くカラフルなビデオのリリース後、Metaweb( およびGoogle )の代表者は、FreebaseがWikipediaおよびCIAファクトベースとともにKnowledge Networkの非常に重要な部分であることを確認しました。 すべてのGoogle APIの統合に関する大規模なサブボットニックの期間中、Freebaseプログラムのインターフェースは大きな変更を受けず、その説明はdevelopers.google.comに単純に転送されました 。 ナレッジベースに何かを尋ねるために、MQLクエリ言語(「mikl」と発音します)を使用します。 原因に!
最初のリクエストと編集者
簡単な質問から始めましょう。Freebaseにいくつかの事実、たとえばレオナルドダヴィンチの生年月日を尋ねます。
www.googleapis.com/freebase/v1/mqlread?query={"/type/object/id":"/en/leonardo_da_vinci","/people/person/date_of_birth":null}
完全に正しい結果が得られます。
{ "result": { "/type/object/id": "/en/leonardo_da_vinci", "/people/person/date_of_birth": "1452-04-15" } }
練習しやすくするために、Freebaseが提供するクエリエディターを使用します 。
このエディターは非常に便利で、要求を自動補完するための優れた機能を備えています-困難な場合は、Ctrl + Enterを押すだけで、優れたコンテキストプロンプトが表示されます。 エディターの下部パネルには、 マニュアルで詳しく説明されている便利なツールがあります 。 自習については、MQLの多くの機能を明らかにするクエリの例を含むサンプルボタンを確認することを特にお勧めします。
さて、ここに私たちのリクエストがあり、それに対する答えがここにあります:
リクエスト | 答え |
---|---|
| |
このリクエストをさらに詳しく分析しましょう。 用語
id
を使用して、Freebaseでオブジェクト識別子を指定しました。 すべてのオブジェクトには識別子があり、
id
という単語は
/type/object/id
略です。 すべてのFreebaseエンティティが持っている他の多くの
/type/object
プロパティがありますが、それらについては後で説明します。
識別子が
/en/leonardo_da_vinci
のオブジェクトには、プロパティ
/people/person/date_of_birth
、その値はわかりません。 代わりに、特別な単語
null
値を配置します。その代わりに、Freebaseはデータベースから値を書き込みます。
簡単にわかるように、要求と応答は対称的です。
複雑なリクエスト
ここで、より多くの質問が発生するように、かなり複雑なMQLクエリを作成し、簡単に説明します。 その後、Freebaseの構造の詳細な調査と言語の機能の概要を開始することができます。
したがって、ここにクエリがあります(MQLマニュアルから引用)。
リクエスト | 答え |
---|---|
| [ { |
このクエリで使用されたMQLツールを簡単に説明してみましょう。
まず、ご覧のとおり、クエリ全体が
[ { } ]
構造にラップされています。つまり、
{ }
場合のように、単一のオブジェクトではなく、結果としてオブジェクトの配列が期待されます。
2行目から4行目までは問題ありません。アルバム(
/music/album
)などのオブジェクトを探しているので、その名前を取得したいのですが、「 Greatest Hits 」というアルバムには興味がありません。
5-8行目と11-15行目にOR演算子が表示されます
|=
-リリース日が1978または1979のアルバムに興味があります。 ジャンルに移りましょう:
「ジャンル」 : [ ] 、
「a:ジャンル」 : 「ニューウェーブ」 、
「b:ジャンル| = " : [
「パンクロック」 、
「ポストパンク」 、
「プログレッシブロック」
] 、
最初の行は、リクエストへの応答でこれらのアルバムのジャンルのリストを取得することを示しています。 これを行うために、空のリスト
[ ]
をリクエストに追加しました。 さらに、 New Waveが示されているジャンルのアルバムと、 「Punk Rock」、「Post-punk」、「Progressive rock」のリストにあるアルバムにのみ興味があると言います。
最後に、行23〜24にはMQLディレクティブが含まれています。2つの結果(
limit
)のみに関心があり、名前で
sort
(
sort
)必要があります。
MQLのJSON
MQLクエリとそれらへの回答はJSONオブジェクトなので、最小の(またはWeb開発者に関係のない)JSONについて説明します。
JSON一般情報
JSON(JavaScript Object Notation)は、キーと値のデータを交換するために作成された言語です。 当初、JSONはJavaScriptオブジェクトのシリアル化に使用されていましたが、すぐに言語に依存しなくなり、そのシンプルさにより、さまざまな言語およびプラットフォームのプログラマーに非常に愛され、尊敬されました。
最も単純なJSONオブジェクトは空のオブジェクトです。 次のように書かれています。
次に、Leonardo da Vinciに関する情報を保存するオブジェクトを作成しましょう。 そもそも、彼の名前だけに制限します。 これを行うには、キーと値を引用符で囲み、コロンで区切ります
Leonardoについていくつかの事実を追加し、それらをコンマで区切ります。
今では、ダヴィンチがどのような職業をしていたかを判断する価値があります。 しかし、これらの職業はたくさんありました。彫刻家、芸術家、建築家など。 単一のキーに複数の値を割り当てるために、JSONは値のリストを使用します-値はコンマで区切られた角括弧で囲まれています:
JSONについて知っておくべきもう1つのことは、ネストされたオブジェクトです。 それらは非常に単純になります。キーの後に、新しいキーと値のペアのセットを中括弧で挿入するだけです。 レオナルドの場合、イタリアにあるアンキアノの村であるレオナルドの出生地に関するデータを表示することができます。 キー「place_of_birth」は、イタリアにあるAnchianoという名前のオブジェクトに対応すると言います。
最も単純なJSONオブジェクトは空のオブジェクトです。 次のように書かれています。
{}
次に、Leonardo da Vinciに関する情報を保存するオブジェクトを作成しましょう。 そもそも、彼の名前だけに制限します。 これを行うには、キーと値を引用符で囲み、コロンで区切ります
{ "name" : "Leonardo di ser Piero da Vinci" }
Leonardoについていくつかの事実を追加し、それらをコンマで区切ります。
{ "name" : "Leonardo di ser Piero da Vinci", "date_of_birth": "1453-04-15", }
今では、ダヴィンチがどのような職業をしていたかを判断する価値があります。 しかし、これらの職業はたくさんありました。彫刻家、芸術家、建築家など。 単一のキーに複数の値を割り当てるために、JSONは値のリストを使用します-値はコンマで区切られた角括弧で囲まれています:
{ "name" : "Leonardo di ser Piero da Vinci", "date_of_birth": "1453-04-15", "profession": [ "Architect", "Engineer", "Anatomist", "Inventor", "Artist", "Sculptor" ], }
JSONについて知っておくべきもう1つのことは、ネストされたオブジェクトです。 それらは非常に単純になります。キーの後に、新しいキーと値のペアのセットを中括弧で挿入するだけです。 レオナルドの場合、イタリアにあるアンキアノの村であるレオナルドの出生地に関するデータを表示することができます。 キー「place_of_birth」は、イタリアにあるAnchianoという名前のオブジェクトに対応すると言います。
{ "name" : "Leonardo di ser Piero da Vinci", "date_of_birth": "1453-04-15", "profession": [ "Architect", "Engineer", "Anatomist", "Inventor", "Artist", "Sculptor" ], "place_of_birth": { "name": "Anchiano", "containedby": "Italy", }, }
本当にjsonではない
一般に、MQLクエリは有効なJSONオブジェクトではありません。 MQLはJSONのスーパーセットであり、あらゆる種類の自由を許可します。 Metaweb製品のアイデアの1つは、プログラムはユーザーが犯すエラーや事務的なエラーを許すことができるということです。 このアイデアは他の言語やプログラムにも存在し、そもそも-World Wide Webでは-htmlの一部がエラーで記述されていても問題ありません。ドキュメントを表示する必要があります。
たとえば、ここに、まれで価値のある職業を持つ人々を探す有効なJSONリクエストがあります。
{ "id": "/en/pope", "/people/profession/people_with_this_profession": [{ "name": null, "limit": 4 }] }
引用符を削除しても、リクエストは引き続き機能します。
{ id: /en/pope, /people/profession/people_with_this_profession: [{ name: null, limit: 4 }] }
括弧を閉じたり、ペアをコロンで区切ったりする必要もありません。そのため、絶対に不名誉な例を次に示します。
id /en/pope /people/profession/people_with_this_profession [{ name null limit 4
Freebaseデバイス
公式ガイドは、Freebase内でのデータの保存方法に関する非常に優れた入門書です。 Freebaseで使用される4つのオブジェクトはオブジェクトパラダイムの背後に完全に隠れているため、これは私たちにとってあまり重要ではありません。 興味がある場合は、 マニュアルの対応するページを参照できます
そのため、Freebaseを使用すると、その中にあるオブジェクトについて考えることができます。 各オブジェクトは中括弧
{ }
によって制限され、コロンで区切られたプロパティと値のペアで構成されます。 FreebaseがMQLクエリへの応答として発行するオブジェクトは有効なJSONオブジェクトですが、OOPパラダイムのオブジェクトとは異なります。 それらを無秩序なペアのセットと考えるのが最善です。
識別子は、MQLでプロパティ(つまり、コロンの前に来るもの)として使用できます。 値には、識別子、リテラル、配列、最後にネストされたオブジェクトを指定できますFreebaseには、識別子を作成するルールがあります。 識別子は、スラッシュ
/
で区切られた名前空間とキーで構成されます。 たとえば、識別子
/people/person/date_of_birth
考えてみてください
date_of_birth
がキーであり、
/people/person
が名前空間です。
識別子は一意です。 セマンティックロードを実行する必要はありませんが、多くの場合、オブジェクトの識別子によって何が問題になっているかを理解するのは簡単です。
オブジェクトのユニバーサルプロパティ
すべてのFreebaseオブジェクトには、次の予約済み(ユニバーサルプロパティ)があります。
- 名前-
/type/object/name
- キー-
/type/object/key
- 識別子-
/type/object/id
- タイプ(通常は複数)-
/type/object/type
- 作成時間-
/type/object/timestamp
- 作成者-
/type/object/creator
- アクセスモード-
/type/object/permission
- グローバル識別子-
/type/object/guid
- マシン識別子-
/type/object/mid
ここでは、MQLクエリで最もよく使用されるプロパティ、名前、識別子、およびタイプを検討します。
識別子
Freebaseには多くの識別子があります。 これらの中で最も重要なのは
/type/object/guid
、これは一度だけ与えられます。 省略形
/type/object/mid
ます。 まあ、彼らは通常リクエストで
/type/object/id
します-それはしばしば人間が読むことができます。 最も重要なことは、同じ識別子を持つ2つのオブジェクトがないことです。 たとえば、アダム・スミスと呼ばれる人の数を見てみましょう。 英語版ウィキペディアの記事です。 道徳哲学者のアダム・スミスだけが、誇り高い識別子
/en/adam_smith
ます。 他のすべてのアダムス
/en/adam_smith_1965
、 政治家 (
/en/adam_smith_1965
)、 サッカー選手 (
/en/adam_smith_huddersfield
)、または他の誰でも、異なる方法で識別されます。
Freebase.comの検索フィールドに識別子を入力して、オブジェクトプロパティページを取得できます。
プロパティ/タイプ/オブジェクト/名前
各オブジェクトには名前があります。 名前は一意のものではなく、オブジェクトには通常、複数の名前があります(言語ごとに1つ)。 最も興味深いのは、これによりクエリがまったく複雑にならないことです。名前を要求すると、現在の名前としてFreebaseにインストールされている言語の名前のみが与えられることに気付くでしょう。 したがって、通常の文字列のようなタイプ名のオブジェクトを処理できます。
プロパティ/タイプ/オブジェクト/タイプ
このプロパティは、オブジェクトのタイプを設定します。 1つのオブジェクトには複数のタイプがあります-これは通常発生します。
リクエストで
type
プロパティを指定した場合、このタイプのネームスペースを省略できます。 タイプ
/film/director
プロパティは何ですか? もちろん、このタイプの名前空間にあるもの、つまり
/film/director
で始まるもの。 たとえば、スタンリーキューブリックが製作したすべての映画のクエリを考えてみましょう。 クエリは左側に省略形で表示されます。これをさらに使用し、右側にMetaweb開発者がそれほど親切ではない場合の外観を示します。
リクエスト | 完全な形のリクエスト |
---|---|
| |
第二に、/ type / object名前空間のすべてのプロパティを省略することができます-そのため、
id
、
name
、
type
などのみを記述する権利があります。 なんで? FreebaseのすべてのオブジェクトはObject型であるためです。
さまざまなタイプのMQLクエリ
すでにかなりの数のクエリを整理していますが、言語自体にはまだ焦点を合わせていません。 まず、MQLで必要な値がどのように要求されるかを見てみましょう。 次の場合が発生します。
- リテラル値を1つ要求する必要があります。 たとえば、人の生年月日
- 値の配列を照会する必要があります。 たとえば、音楽グループのアルバムのリスト。
- 主要なプロパティである1つのオブジェクトをリクエストする必要があります:識別子、主要なタイプ、名前
- オブジェクトの配列をリクエストする必要があります
- オブジェクトに関するすべてを知る必要があります
単一値リクエスト
Freebaseがリクエストオブジェクトと同じ構造のオブジェクトを返すが、不明なフィールドが埋められている場合、リクエストでこのフィールドを
null
に置き換える必要があります。 このような例を見てきましたが、ここにもう1つあります。 ミュージシャンのキース・エマーソンの出身はどこですか?
リクエスト | 答え |
---|---|
|
|
値の配列を照会する
null
を使用して音楽グループのすべてのアルバムを照会しようとすると、エラーが発生します。 オブジェクトの配列が必要な場合は、角括弧
[]
使用します。 Freebaseは、この配列にコンマ区切りの行を挿入します。 音楽グループのアルバムの例も公式ガイドに記載されています。Hawkingによって書かれた本のリストがあります。
リクエスト | 答え |
---|---|
|
もっとたくさんあります
|
逆に、単一の値ではなく配列を要求する場合-これには問題はありません-Freebaseは結果を変換し、単一の値を持つ配列を返します。
オブジェクトのリクエスト
でも、私のアプリケーションでは、ホーキングの本の名前だけでなく、発売日も知りたいと思っています。写真は傷つきません。 これも可能です。 実際、最後のリクエストで受け取った本の配列は、文字列の配列のように見えるだけです。 実際、これはオブジェクトの配列であり、Freebaseはオブジェクトを文字列に折り畳むだけで、
name
プロパティのみを残します。
また、私たちのミュージシャンの出身地であるイングランドは、単なる「イングランド」というラインではなく、本格的なオブジェクトです。 クエリでオブジェクト表現を取得するには、次のように
{ }
コンストラクトが使用されます。
{ "name": "Keith Emerson", "type": "/music/artist", "origin": { } }
その結果、オブジェクトに関する最も重要な情報、その識別子、名前、およびタイプリストが提供されます。
クエリ結果
{ "result": { "origin": { "id": "/en/england", "name": "England", "type": [ "/common/topic", "/location/location", "/film/film_subject", "/book/book_subject", "/location/administrative_division", "/film/film_location", "/location/uk_constituent_country", "/user/xleioo/winning_night/option_list", "/location/statistical_region", "/location/dated_location", "/symbols/name_source", "/m/04kp2w0", "/user/robert/military/military_power", "/symbols/flag_referent", "/user/skud/flags/topic", "/user/skud/names/topic", "/user/robert/military/topic", "/base/petbreeds/topic", "/m/04mp17s", "/user/xleioo/winning_night/topic", "/organization/organization_scope", "/base/charities/geographic_scope", "/sports/sports_team_location", "/base/thoroughbredracing/thoroughbred_racehorse_origin", "/user/tsegaran/random/taxonomy_subject", "/base/authors/country_of_origin", "/base/authors/topic", "/biology/breed_origin", "/fictional_universe/fictional_setting", "/government/political_district", "/olympics/olympic_participating_country", "/base/summermovies2009/topic", "/base/leicester/topic", "/base/popstra/location", "/location/country", "/base/england/topic", "/base/ontologies/ontology_instance", "/event/speech_topic", "/user/skud/legal/treaty_signatory", "/government/governmental_jurisdiction", "/base/masterthesis/topic", "/user/jamie/default_domain/yacht_racing/yacht_racing_country", "/base/horticulture/cultivar_origin", "/base/horticulture/topic", "/base/localfood/food_producing_region", "/base/localfood/topic", "/sports/sport_country", "/base/todolists/topic", "/base/tagit/concept", "/food/beer_country_region", "/periodicals/newspaper_circulation_area", "/location/uk_statistical_location", "/base/biblioness/bibs_location", "/base/biblioness/bibs_topic", "/base/aareas/schema/gb/constituent_country", "/base/aareas/schema/administrative_area", "/base/uncommon/topic", "/base/schemastaging/statistical_region_extra", "/people/place_of_interment", "/base/allthingsnewyork/topic", "/base/events/topic", "/base/events/geographical_scope", "/base/tonyfranksbuckley/topic", "/base/piratesofthewirralpeninsula/topic", "/military/military_combatant", "/military/military_post", "/organization/organization_member" ] }, "name": "Keith Emerson", "type": "/music/artist" } }
ネストされたクエリ
ミュージシャンの出身国に関するその他の情報を入手することができます。これにより、埋め込みリクエストが作成されます。 たとえば、エマーソンの出身国で話されている言語を知りたいです。 クエリエディターからのプロンプトを受信する国のタイプを追加していることに注意してください。
リクエスト | 答え |
---|---|
| |
下に行くことができます:その国で話されている言語はどの言語ファミリーに属しますか、エマーソンはどこから来ますか?
リクエスト | 答え |
---|---|
| |
これらのかなり愚かなクエリは、より有用なものに簡単に一般化されます。たとえば、もともと英語圏の国からのミュージシャンのリストのリクエスト。配列出力をよく使用することに注意してください。さて、
limit
出力を3つの結果に制限する別の言葉:
リクエスト | 答え |
---|---|
| |
すべてのオブジェクトプロパティを要求する
クエリを作成するときに役立つのは、オブジェクトのすべてのプロパティを取得することです。これに使用されるデザインは非常にシンプルで便利です。プロパティの名前としてのアスタリスクと、値で満たされた空の配列
"*" : []
リクエスト | 答え |
---|---|
| イギリスには多くの財産があります |
オブジェクトをより良くリクエストする方法
かっこで混乱した人のために、Freebaseでオブジェクトをリクエストする方法の概要を以下に示します。
建設業 | その意味 |
---|---|
| . default- : value ( ) name ( ). , ! |
| . , , |
| |
| . , |
| . {}, |
| - , |
| . . |
開始するには十分です。MQLには、さまざまなコンパレータ、正規表現、あらゆる種類のAND、OR、およびNOTがあることが明らかです。もう1つの優れた言語はAcreです。これにより、Semantic MediaWikiで行われるのと同様の方法でクエリ結果をフォーマットできます。DbpediaとWikidataの話よりも先に。そもそも何に興味がありますか?