フリーキーズ | 独学プログラミング

InfiniteGraphとは

最終更新日

InfiniteGraphは、ビッグデータにおける複雑な関係を扱い、ナビゲートするために設計された分散グラフデータベースです。Objectivity社によって開発されました。グラフデータベースはグラフ構造(ノード、エッジ、プロパティ)を使用してデータを表現し保存します。相互接続されたデータや複雑な関係性を扱う場合に特に有効です。

グラフデータベースでは、ノードはエンティティを表し、エッジはエンティティ間の関係を表します。例えば、ソーシャルネットワークアプリケーションでは、各ユーザーはノードとして表現され、他のユーザーとの交友関係はノード間のエッジとして表現されます。

InfiniteGraphの特徴

InfiniteGraphは複雑なマルチホップ(中継機を用いた大規模ネットワークを可能にする仕組み)の関係を効率的に保存・検索できることで知られています。水平方向に拡張できるように設計されているため、データのサイズが大きくなってもクラスターにマシンを追加することでパフォーマンスを維持できます。

InfiniteGraphの使用例

例で説明しましょう。例えば、ソーシャルネットワークのアプリケーションでデータの保存と分析にInfiniteGraphを使用したいとします。スキーマをどのように定義するか(InfiniteGraphのAPIはJavaをサポートしているため、Javaを使用します)を以下に示します。

// ユーザーを示すPersonクラスを定義
@Vertex
public class Person extends Entity {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

// 2人のユーザーの関係性を示すFriendshipクラスを定義
@Edge
public class Friendship extends Entity {
    Date startDate;

    public Friendship(Date startDate) {
        this.startDate = startDate;
    }
}

このような交友関係のグラフを作成できます。

GraphFactory factory = GraphFactory.getInstance();
GraphDatabase graphDB = factory.getGraphDatabase("myGraphDB");

Transaction tx = graphDB.beginTransaction(AccessMode.READ_WRITE);

// Personノードを作成
Person hanako = new Person("Hanako");
Person taro = new Person("Taro");
Person bob = new Person("Bob");

// Friendshipエッジを作成
Friendship aliceBob = new Friendship(new Date());
Friendship bobCharlie = new Friendship(new Date());

// エッジにノードを接続
aliceBob.connect(hanako, taro);
bobCharlie.connect(taro, bob);

tx.commit();

このようにグラフをナビゲートできます。

// トランザクションを開始
Transaction tx = graphDB.beginTransaction(AccessMode.READ_ONLY);

// Hanakoから交友関係を探索
Navigator navigator = hanako.navigate().depthFirst().adjacentVertices();

while (navigator.hasNext()) {
    Person friend = (Person) navigator.next();
    System.out.println("Hanako is friends with: " + friend.name);
}

tx.commit();

これはInfiniteGraphでできることの非常に基本的な例です。InfiniteGraph(そしてグラフデータベース全般)の本当の強みは、従来の表形式データベースモデルにうまく収まらない、複雑で相互接続されたデータを扱うときに発揮されます。