TENAコモンストア:データ構造詳細とAPI例
TENAコモンストアでは、各ノードはどのような種類かを示す「NodeType」を持ち、これを参照することで人かコンテンツなのか判断できます。また、このノードには「ID」、「名前」や「生成日時」などのさまざまな情報を属性(attribute)として付与できます。さらに、コンテンツが本文やタイトルなどのテキスト情報を含んでいる場合、そのテキスト情報から言語処理を用いて抽出した情報(キーワードや嗜好情報など)も同様に属性として付与できます。
「リンク」には前述したように「状態」を表すリンクと「行動」を表すリンクの2種類があります。リンクはどのような関係を示しているかを表す「LinkType」を持っています。また、リンクには方向があり、ノードから出ているリンクをOutlink、ノードに入るリンクをInlinkと呼んでいます。また、「LinkType」によって始点と終点がどのような意味を表すのかを知ることができます。
リンクの具体例として「書いた」という関係を挙げてみましょう。Aという人がBというブログ記事を書いたとき、それを表すリンクは「書いた」というタイプとなり、始点がA、終点がBとなります。友人関係のように双方向の関係を示すときには、AからB、BからAのリンクを2つ用いて表します。また、リンクもノードと同様に属性を付与できます。
これらのノード、リンクに対する「NodeType」「LinkType」とそれぞれのタイプに応じて付与される属性はソーシャル・コンピューティングの種類(ブログ、SNSなど)によって違います。TENAでは一般的なソーシャル・コンピューティングの種類に対して、標準的なデータセットを用意しており、これを拡張して利用できます。
データ構造詳細
ブログデータセットの例
次の表1、表2に、ブログにおけるデータセットの例を示します。データ構造を規定する場合は、標準データセットを一部のみ利用することも、拡張して用いることも可能です。
| ラベル | 名前 | タイプ | 説明 |
| TEXTCONTENT | テキストコンテンツ | NodeType | ブログ、日記などのテキストが主体のコンテンツ |
| COMMENT | コメント | NodeType | ブログや日記などに付与されたコメントなどのテキストを主体としたコンテンツ |
| PERSON | ユーザーノード | NodeType | 行動を起こす人を表すノード |
| WRITE | 書く | LinkType | 行動を表すリンク。テキストを主体としたコンテンツに対して人が「書く」というアクションを起こした時の関係 |
| READ | 読む | LinkType | 行動を表すリンク。テキストを主体としたコンテンツに対して人が「読む」というアクションを起こした時の関係 |
| NOTICE_READ | お知らせ(コンテンツ) | LinkType | 行動を表すリンク。コンテンツに対し、あるユーザーがそのコンテンツを読んだことを明示的に知らせるアクション(ex.拍手ボタンなど)。ユーザーとコンテンツの関係 |
| DIG_PERSON | お知らせ(人) | LinkType | 行動を表すリンク。ユーザーに対し、あるユーザーがそのユーザーのブログやホームなどを訪れたことを明示的に知らせるアクション。ユーザーとユーザーの関係 |
| BOOKMARK | ブックマーク | LinkType | 関係を表すリンク。あるユーザーが、別のユーザーのブログやホームを登録している関係。方向性あり。時刻情報はない |
| FRIEND | 友人 | LinkType | 関係を表すリンク。あるユーザーが、別のユーザーと知り合いである関係。方向性あり。時刻情報はない(相互認証が必要なシステムのときには相互リンクとなる) |
| CMT2BLOG | コメントからブログへのリンク | LinkType | 関係を表すリンク。コメントがブログ(TEXTCONTENT)へのコメントだということを示す |
| ラベル | 名前 | 何の属性か | 説明 |
| .personID | ユーザーID | PERSON | ユーザーを識別するID |
| .textContent | テキストコンテンツ | TEXTCONTENT | テキスト本文 |
| .textContentID | テキストコンテンツID | TEXTCONTENT | テキストコンテンツを識別するID |
| .textContentTitle | テキストコンテンツタイトル | TEXTCONTENT | テキストのタイトル |
| .comment | コメント | COMMENT | コメント本文 |
| .commentID | コメントID | COMMENT | コメントコンテンツを識別するID |
| .commentTitle | コメントタイトル | COMMENT | コメントのタイトル |
| .tkm_ja_base_word .noun.general |
一般名詞 | TEXTCONTENT, COMMENT |
テキストコンテンツ、コメントコンテンツから抽出された一般名詞 |
| .tena.keyword | キーワード | TEXTCONTENT, COMMENT |
テキストコンテンツ、コメントコンテンツから抽出されたキーワード |
| .authorNodeID | ブログを書いたユーザーを表すNodeのID | TEXTCONTENT, COMMENT |
コンテンツを作成したユーザー。コンテンツのOutLinkのうち、「WRITE」タイプがさすPERSONノードの.personIDと同じ |
API例
TENAコモンストアは、データにアクセスするためのJava APIを提供します。基本的なAPIは以下の3つです。
1)条件に合致したノードの取得
IDや日付等で与えられた条件を満たす、ノードの一覧を返します。
2)ノードのOutlink/Inlinkの取得
指定されたノードから出ている/ノードへ入っているリンクの一覧を取得できます。LinkTypeによる絞込条件をつけることもできます。
3)ノードのAttributeの取得
ノードに付与された各種Attributeを返します。
これらのAPIを用いて、さまざまな分析が可能です。例えば、あるユーザーが作成したテキストコンテンツを取得したいときは、まずユーザーノードをIDなどで指定して取得し、そのOutlinkを[LinkType:Write]という条件の下で取得し、その先のコンテンツノードを取得することで実現できます。
このように、ネットワークの情報に自在にアクセスできるTENAコモンストアですが、ブログなど数万人から数百万人のユーザーがいるデータを扱う場合は、その行動履歴まで含んだデータは数十から数百ギガバイトになってしまいます。このようなサイズの場合は、通常データをハードディスク上に設置し、それに対してアクセスします。すると、APIの種類によってはランダムアクセスが大量に生じ、レスポンスタイムが遅くなります。そのため、TENAでは簡潔データ構造(Succinct Data Structure)と呼ばれるデータ構造を用意しています。簡潔データ構造とは、検索に対してなるべく小さい索引で、短い応答時間を実現するためのデータ構造です。この簡潔データ構造は索引データが小さいため、主記憶上でのアクセスが可能となります。
また、このデータへの変換を行っても提供可能なAPIはまったく等価のため、APIにアクセスするユーザーは背後のデータ構造が何であるかを意識する必要はありません。簡潔データ構造のアルゴリズムおよび実装は紙面の都合上詳細は 述べませんが、興味のある方は定兼先生による解説(PDF)を参照ください。
