Facebookのソーシャルグラフ

まずOpen Graphを理解するには、Facebookがソーシャルグラフと呼ぶものを理解しなくてはなりません。ソーシャルグラフについてWikipediaを見ると、以下のように定義されています。

The social graph in the Internet context is a sociogram, a graph that depicts personal relations of internet users. It has been referred to as "the global mapping of everybody and how they're related".
和訳:インターネット上でsocial graphと呼ばれるものはソシオグラムを指していて、インターネットユーザ同士の繋がりを表現するものである。「人々の繋がりと、どのように繋がっているかを示す世界規模のマッピング」とも表現される。
また、Brad Fitzpatrick氏が自身のサイトで発表したThoughts on the Social Graphでも、人と人の関係に絞って話されています。

ただし、Facebookがソーシャルグラフと呼ぶものは、人と人の関係のみにとどまりません。ドキュメントでは、「人々や人々が周りの物事に対して持つ繋がりを指すもの」と定義されています。ドキュメント中に出てくる以下の画像を見ると分かる通り、人と人の繋がりに限らず、人と物事の繋がり(いいね!した、料理した、視聴した)なども含まれています。

attachment

Open Graphとは

ここまでで紹介したソーシャルグラフを、サードパーティの開発者向けに拡張したものがOpen Graphで、そのOpen Graphへアクセスする手段がGraph APIです。このAPIを利用することで、ユーザやユーザの友だち情報、参加しているグループやイベントの情報、投稿内容など様々な情報を取得できるだけでなく、ユーザに代わって投稿したりイベント作成するなど、Open Graphへ書き込むこともできます。また、ユーザの行動(いいね!した、視聴した、料理したなど)を書き込むことも可能で、これらの行動はOpen Graph Actionと呼ばれています。このOpen Graph Actionは開発者が独自に定義することも可能です。たとえば「走った」「一気した」などの行動を定義して、「Aさんが皇居前を走った」「Bさんがテキーラを一気した」など、人と物事の繋がりを作り出すことができます。

Open Graphにアクセスする

基本

早速、Graph APIを用いてOpen Grpah上の情報にアクセスしてみましょう。一般公開されている情報ならば、アクセストークンなしでも簡単に取得できます。ブラウザのアドレスバーに以下のURLを入力してみてください。
https://graph.facebook.com/4
Facebook創設者であるザッカーバーグ氏の情報が返されます。
{
   "id": "4",
   "name": "Mark Zuckerberg",
   "first_name": "Mark",
   "last_name": "Zuckerberg",
   "link": "https://www.facebook.com/zuck",
   "username": "zuck",
   "gender": "male",
   "locale": "en_US"
}
ユーザ、Facebookページ、アプリ、Open Graph上に存在する全てのオブジェクトには固有のIDが与えられています。先ほどの例だと、https://graph.facebook.com/の後に続く4という数値です。ここを任意のIDに置き換えることで、該当するオブジェクトの情報を取得できます。
例えば、ID: 204277149587596を指定すると、私の運営するOklahomerというFacebookページの情報が返されます。
{
   "about": "http://facebook-docs.oklahome.net/",
   "description": "Facebook\u6280\u8853\u8005\u5411\u3051\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u548c\u8a33\u3084\u3001Facebook\u7d61\u307f\u306e\u30cb\u30e5\u30fc\u30b9\u3092\u7d39\u4ecb\u3057\u3066\u3044\u307e\u3059\u3002",
   "is_published": true,
   "release_date": "2011-02-24",
   "talking_about_count": 14,
   "username": "Oklahomer",
   "website": "http://facebook-docs.oklahome.net/",
   "were_here_count": 0,
   "category": "Reference website",
   "id": "204277149587596",
   "name": "Oklahomer",
   "link": "https://www.facebook.com/Oklahomer",
   "likes": 1039,
   "cover": {
      "cover_id": 500726406609334,
      "source": "http://sphotos-g.ak.fbcdn.net/hphotos-ak-snc6/s720x720/283711_500726406609334_431792850_n.jpg",
      "offset_y": 57
   }
}

メタデータ

IDさえ置き換えれば様々なオブジェクトの情報を取得できるというのは便利ですが、時々不便なときがあります。ただIDだけ与えられていて、それがユーザなのかFacebookページなのか、それとも他の何かなのか分からない場合です。そういった場合、metadata=1を足してあげます。すると対象オブジェクトのメタデータが返され、metadata.typeの値(user、pageなど)を見ることでオブジェクトの型を知ることができます。型だけでなく、返されるフィールドの説明や、そのオブジェクトと紐づくオブジェクト群へのアクセス方法も返されます。ここに貼付けるには情報が多すぎるので、以下のURLにアクセスして試してみてください。
https://graph.facebook.com/204277149587596?metadata=1

コネクション

graph.facebook.com/OBJECT_ID へのアクセスで任意のオブジェクトにアクセスできることは分かりました。ですが、Open Graphは人と人、または人と物事の繋がりを示すものですから、取得したオブジェクトが繋がりを持つオブジェクト群にもアクセスできなくては意味がありません。これはコネクションと呼ばれ、以下の形式で取得することができます。
https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE
たとえば、Oklahomerページに投稿された画像オブジェクト群にアクセスするには、以下のようなURLとなります。
https://graph.facebook.com/204277149587596/photos
返される情報は以下の通りです。data配列の中に、オブジェクトID(id)、投稿者情報(from)、各サイズのURL(images)が入っているのが分かります。また、pagingフィールドのpreviousとnextを見ることで、ページングを行うことができます。ページングについての詳細はGraph API, FQLのページングの罠を参照してください。
{
   "data": [
      {
         "id": "204277402920904",
         "from": {
            "category": "Reference website",
            "name": "Oklahomer",
            "id": "204277149587596"
         },
         "picture": "http://photos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_s.jpg",
         "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_n.jpg",
         "height": 153,
         "width": 158,
         "images": [
            {
               "height": 1983,
               "width": 2048,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/s2048x2048/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 153,
               "width": 158,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 153,
               "width": 158,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 581,
               "width": 600,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/s600x600/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 464,
               "width": 480,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/s480x480/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 309,
               "width": 320,
               "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-snc6/s320x320/181698_204277402920904_249682_n.jpg"
            },
            {
               "height": 153,
               "width": 158,
               "source": "http://photos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_a.jpg"
            },
            {
               "height": 125,
               "width": 130,
               "source": "http://photos-d.ak.fbcdn.net/hphotos-ak-snc6/181698_204277402920904_249682_s.jpg"
            },
            {
               "height": 125,
               "width": 130,
               "source": "http://photos-d.ak.fbcdn.net/hphotos-ak-snc6/s75x225/181698_204277402920904_249682_s.jpg"
            }
         ],
         "link": "https://www.facebook.com/photo.php?fbid=204277402920904&set=a.204277399587571.61963.204277149587596&type=1",
         "icon": "http://static.ak.fbcdn.net/rsrc.php/v2/yz/r/StEh3RhPvjk.gif",
         "created_time": "2011-02-23T17:00:52+0000",
         "updated_time": "2011-02-23T17:00:54+0000",
         "likes": {
            "data": [
               {
                  "id": "100002002178183",
                  "name": "Philipp Kasdorff"
               }
            ],
            "paging": {
               "next": "https://graph.facebook.com/204277402920904/likes?limit=25&offset=25&__after_id=100002002178183"
            }
         }
      }
   ],
   "paging": {
      "previous": "https://graph.facebook.com/204277149587596/photos?limit=25&since=1298480452&__previous=1",
      "next": "https://graph.facebook.com/204277149587596/photos?limit=25&until=1298480451"
   }
}
自分が扱うオブジェクトに何と言うコネクションがあるのかは、先ほど示したmetadata=1を付けてオブジェクトにアクセスしてconnectionsフィールドを見ることで分かります。詳しくは各Open Graphオブジェクトのドキュメント和訳にも書かれていますのでご覧ください。

まとめ

ここまでで、Facebookが持つソーシャルグラフをサードパーティ向けに拡張した物がOpen Graphであること、そのOpen Graphへのアクセス方法を提供するのがGraph APIであること、そしてGraph APIの基本的な使い方を紹介しました。次回は、ユーザの認証と権限の認可について紹介します。