Hello OrientDB

## Hello OrientDB 

グラフDBを使ったプロダクトを検討していますが、技術検討しておこうということで、OrientDB を使ってみます。
他にも OSS だと Neo4j、Titan といったものが有名なプロダクトですが、OrientDB の特徴として

* スキーマ定義した従来型のデータ、スキーマレスのNoSQL、そしてグラフDBが扱える Multi-Model
* Neo4jのような「Cypher構文」ではなくSQLライクで問合せできる

点が良いかなと考えて。

## インストール

http://orientdb.com/ 公式から Community Edition をダウンロードして、任意のフォルダに展開します。

VisualStudioはNugetでドライバの参照を追加します。Java、node.js など、各種言語用のドライバも用意されていますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114529/249c48ef-7809-eccf-2a36-fa7719aaecf1.png)

## Serverの起動

展開したフォルダの \bin\server.sh(server.bat) を実行すると、 http://localhost:2480/ で「Orient Studio」にアクセスできます。Web上で参照や各種操作と、グラフを見ることが出来ます。初回アクセス時にパスワードを設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114529/a1124363-9c8a-e22b-8e9b-3f3c429cd48c.png)

## APIで操作

### サーバーへの接続と切断

バイナリ接続する場合はPortはデフォルトで 2424 です。

```
    public static class DBConnect
    {
        private static OServer _server = null;
        private static string _hostname = "localhost";
        private static int _port = 2424;
        private static string _root_user = "root";
        private static string _root_passwd = "admin";
        private static string _db_name = "DemoDB";

        public static OServer Connect()
        {
            Disconnect();

            _server = new OServer(_hostname, _port, _root_user, _root_passwd);
            return _server;
        }

        public static void Disconnect()
        {
            if (_server != null)
            {
                _server.Close();
                _server.Dispose();
                _server = null;
            }
        }
    }
```

### サーバー設定の取得、設定

個別設定の取得と更新は OServer.ConfigGet、OServer.ConfigSet を使います。

```
        public static Dictionary<string, string> ServerConfig()
        {
            Dictionary<string, string> srvConfig = _server.ConfigList();

            foreach (KeyValuePair<string, string> entry in srvConfig)
            {
                Logger.Info(string.Format(" - {0}: {1}", entry.Key, entry.Value));
            }

            return srvConfig;
        }
```

### データベースの作成と破棄

ストレージ種別にはオンメモリも選択できます。

```

        public static void CreateDatabase()
        {
            if (!_server.DatabaseExist(_db_name, OStorageType.PLocal))
            {
                _server.CreateDatabase(_db_name, ODatabaseType.Graph, OStorageType.PLocal);
            }
        }

        public static void DropDatabase()
        {
            if (_server.DatabaseExist(_db_name, OStorageType.PLocal))
            {
                _server.DropDatabase(_db_name, OStorageType.PLocal);
            }
        }
```

### グラフの作成

まったく意味のないグラフですが・・・。

```
        public static void CreateData()
        {
            using (ODatabase database = new ODatabase(ConnectionOptions))
            {
                database
                     .Create.Class("ST")
                     .Extends<OVertex>()
                     .Run();

                database
                     .Create.Class("connect")
                     .Extends<OEdge>()
                     .Run();

                OVertex vertex1 = database
                     .Create.Vertex("ST")
                     .Set("name", "ST1")
                     .Run();

                OVertex vertex2 = database
                     .Create.Vertex("ST")
                     .Set("name", "ST2")
                     .Run();

                OEdge edge = database
                    .Create.Edge("connect")
                    .From(vertex1.ORID)
                    .To(vertex2.ORID)
                    .Run();
            }
        }
```

### Studioで確認

Orient Studio のグラフで「select * from V」とするとグラフを確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114529/6789a2ca-5e14-057b-7c44-dee14faebeb4.png)