2010年9月23日木曜日

うれしかったので貼ってみた

前回で2回分 OrientDB について紹介するエントリを書いたところ、開発者の Luca に Tweet いただきました


まだまださわりすら書けていないので、これからも頑張って OrientDB の魅力を書いていけたらなと思います
前回分までのエントリは以下になります

オープンソース NoSQL データベース OrientDB を使ってみる #1
オープンソース NoSQL データベース OrientDB を使ってみる #2

OrientDB に興味をもたれた方、ぜひダウンロードして使ってみてください

2010年9月22日水曜日

オープンソース NoSQL データベース OrientDB を使ってみる #2

前回に引き続き、 OrientDB の紹介です
今回は Java API を使用したデータの操作について紹介します
OrientDB では使用する API によりドキュメント指向データベース、オブジェクトデータベース、グラフデータベースとしての特性を利用することができます
(実際はドキュメント指向データベースをベースに、各データベースの特性のラップを通して利用するという実装です)
以降の説明では基本となるドキュメント指向データベースとしての操作について説明しています

操作の対象は、今回もサーバーとして起動している OrientDB とします
OrientDB のインストール、設定、起動については下記のエントリを参照ください

オープンソース NoSQL データベース OrientDB を使ってみる #1

使用する環境は以下のとおりです

・Mac OS X 10.6.4
・Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
・OrientDB 0.9.22
・NetBeans 6.9.1
※以降の説明はお使いの環境に合わせて、適時読み替えてください

まず、 NetBeans にて Java アプリケーションの新規プロジェクトを作成します
プロジェクト名は任意で構いませんが、ここでは説明のため "OrientDBSample" とします
「主クラスを作成」チェックボックスもチェックしていて下さい

プロジェクト作成後、必要なライブラリの追加を行ないます
"OrientDBSample" プロジェクト内の「ライブラリ」フォルダを右クリックし、表示されたコンテキストメニューより「JAR/フォルダを追加...」をクリックします

ファイル選択ダイアログが表示されるので、 OrientDB を展開したフォルダ内の "lib" フォルダにある、 "orientdb-client-0.9.22.jar" 、及び "orientdb-core-0.9.22.jar" を選択し、「選択」ボタンをクリックします
ダイアログが閉じると、「ライブラリ」フォルダ内に上記2つの JAR ファイルが追加されていることが確認できるかと思います

まず、データベースへ接続を行ないます
接続は前回同様 demo データベースを使用します
プロジェクト作成時に自動生成された Main クラスの main メソッド内に以下のようにコードを追加します
(「主クラスを作成」オプションを選択していなかった場合は、 main メソッドをもつ適当なクラスを作成してください)
package orientdbsample;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;

public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        // 接続の解除
        database.close();
    }
}
以降は上記のソースを基本に処理のコードを追加していきます
(import 文、パッケージ名は省略しますのでご注意下さい)

まずは、登録処理を行うコードです
入力後、正常に動作が完了することを確認してください
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコードを作成
        // ※指定したクラスがデータベースに存在しない場合、自動的に作成してくれます
        ODocument document = new ODocument(database, "Rebellion");
        document.field("name", "Luke");
        document.field("surname", "Skywalker");
        document.save();

        // メソッドチェーンを利用して、 Rebellion クラスのレコードを作成
        new ODocument(database, "Rebellion").field("name", "Han").field("surname", "Solo").save();

        // 接続の解除
        database.close();
    }
}
ORientDB ではドキュメントは ODocument クラスを使用して表します
上記例では、 "Rebellion" クラスのドキュメントを作成しています
"Console" アプリケーションを使用した際には事前にクラスの作成が必要でしたが、 Java API を利用する際にはクラスが存在しない場合は自動的に作成してくれます
フィールドメソッドを使用し、指定したフィールド名にフィールド値を設定します
クラスに指定したフィールドが存在しない場合、新たに追加されます
フィールド値に指定可能な型は以下のようになっています

・文字列型 (java.lang.String)
・ Byte 型 (java.lang.Byte または byte)
・ Short 型 (java.lang.Short または short)
・ Integer 型 (java.lang.Integer または int)
・ Long 型 (java.lang.Long または long)
・ Float 型 (java.lang.Float または float)
・ Double 型 (java.lang.Double または double)
・ Boolean 型 (java.lang.Boolean または boolean)
・日付型 (java.util.Date)
・バイナリ (byte[])
・リスト型 (java.util.Set)
・セット型 (java.util.Set)
・マップ型 (java.util.Map)

上記に加えて、レコード間の関連を表す Link とそれに関係する型が OrientDB にてサポートされている型となります
( Link に関しては別エントリにて説明したいと思います)
例ではシンプルに文字列のみをフィールド値に設定しています
フィールドに値を設定した後、 save() メソッドでデータベースへの登録を行ないます

また、OrientDB ではデータ操作に対して( "Console" アプリケーションと同様に) SQLライクなクエリ(以降は SQL と記述します)を使用することができます
Java API を利用した SQL の実行は OSQLQuery クラスのサブクラス(下記例では OCommandSQL クラス)を使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // INSERT 文を作成する
        String insertQuery = "insert into Rebellion (name) values ('Chewbacca')";

        // クエリを実行します
        database.command(new OCommandSQL(insertQuery)).execute();

        // 接続の解除
        database.close();
    }
}
次に browseClass メソッドを使用して、先ほど登録した Rebellion クラスの全レコードを表示します
("Console" アプリケーションの "browseClass" コマンドと同様の結果となります)
取得できたレコードの getIdentity() メソッドを呼びだすと、データベースにてユニークなキーとなる、レコード IDが取得できます
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコードのリストを取得
        Iterable<ODocument> documents = database.browseClass("Rebellion");

        // レコードのリストから各レコードを取得します
        for (ODocument person : documents) {
            // レコードの各フィールドを取得
            // レコード ID を取得
            System.out.println("Rec ID : " + person.getIdentity());
            System.out.println("Name   : " + person.field("name"));
            System.out.println("Surname: " + person.field("surname"));
        }

        // 接続の解除
        database.close();
    }
}

実行後、以下のように出力されるかと思います
Rec ID : 19:0
Name : Luke
Surname: Skywalker
Rec ID : 19:1
Name : Han
Surname: Solo
Name : Chewbacca
Surname: null

クラスのレコード件数を取得するには countClass() メソッドを使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコード件数を取得します
        long count = database.countClass("Rebellion");

        System.out.println("Count: " + count);

        // 接続の解除
        database.close();
    }
}
また、個別のレコードを抽出するにはクエリを使用します
OrientDB では先の SQL とは別に Native クエリを使用することができますが、現在 Native クエリは local データベースに接続した場合のみ使用可能という制限があります
今回は remote データベースを前提としていますので、 Native クエリに関しては説明を省略します
Java API を利用したレコード抽出には OSQLQuery クラスのサブクラス(下記例では OSQLSynchQuery クラス)を使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        // クエリ文字列を作成する
        // name フィールドのフィールド値が "L" で始まるもののみ抽出する
        String query = "select from Rebellion where name like 'L%' ";

        // クエリを実行し、結果のリストを取得します
        List<ODocument> documents = database.query(new OSQLSynchQuery<ODocument>(query));

        // レコードのリストから各レコードを取得します
        for (ODocument person : documents) {
            // レコードの各フィールドを取得
            // レコード ID を取得
            System.out.println("Rec ID : " + person.getIdentity());
            System.out.println("Name   : " + person.field("name"));
            System.out.println("Surname: " + person.field("surname"));
        }

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Luke
Surname: Skywalker

次にレコードの更新を行ないます
対象となるレコードを抽出し、値を更新後、 save() メソッドを実行して反映します
対象レコード抽出には "@rid" という特別なフィールド(属性値) とレコードIDを使用しています
また、INSERT 文と同様に command() メソッドと OCommandSQL クラスを使用して UPDATE 文を実行することができます
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        ODocument person = null;

        // SELECT 文を作成する
        String selectQuery = "select from Rebellion where @rid = 19:0";

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // "name" フィールドのフィールド値を "" 更新する
        person.field("name", "Ben");
        person.save();

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // UPDATE 文を作成する
        String updateQuery = "update Rebellion set name = 'Anakin' where @rid = 19:0";

        // クエリを実行します
        database.command(new OCommandSQL(updateQuery)).execute();

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Luke
Surname: Skywalker
----------
Rec ID : 19:0
Name : Ben
Surname: Skywalker
----------
Rec ID : 19:0
Name : Anakin
Surname: Skywalker
----------

最後にレコードの削除を行ないます
対象となるレコードを抽出し、 delete() メソッドを実行して削除します
また、 command() メソッドと OCommandSQL クラスを使用して、 DELETE 文を実行することも可能です
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // SELECT 文を作成する
        String selectQuery = "select from Rebellion where @rid = 19:0 ";

        // レコードのリストから各レコードを取得します
        for (ODocument document : database.browseClass("Rebellion")) {
            // レコードの各フィールドを取得
            System.out.println("Rec ID : " + document.getIdentity());
            System.out.println("Name   : " + document.field("name"));
            System.out.println("Surname: " + document.field("surname"));
        }

        System.out.println("----------");

        // クエリを実行し、その結果を取得します
        ODocument person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // 取得したレコードの delete() メソッドを実行し、レコードを削除
        person.delete();

        // DELETE 文を作成する(全件削除)
        String deleteQuery = "delete from Rebellion";

        // クエリを実行します
        database.command(new OCommandSQL(deleteQuery)).execute();

        // Rebellion クラスの件数取得(レコード有無判定)
        if(database.countClass("Rebellion") > 0) {
            // レコードのリストから各レコードを取得します
            for (ODocument document : database.browseClass("Rebellion")) {
                // レコードの各フィールドを取得
                System.out.println("Rec ID : " + document.getIdentity());
                System.out.println("Name   : " + document.field("name"));
                System.out.println("Surname: " + document.field("surname"));
            }
        } else {
            System.out.println("Rebellion クラスにはレコードは存在しません");
        }

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Anakin
Surname: Skywalker
Rec ID : 19:1
Name : Han
Surname: Solo
Rec ID : 19:2
Name : Chewbacca
Surname: null
----------
Rebellion クラスにはレコードは存在しません

以上で、Java API を利用した OrientDB の操作方法になります
今回説明はしませんでしたが、 OrientDB にはトランザクションも利用できます
しかし、最新リリース版として使用している 0.9.22 ではバグがあり、正しく利用できないという状態です
開発版ではこの問題は修正されているので、次回リリース版である 0.9.23 (10月中旬リリース予定)では問題なく利用出来るかと思います

次回はデータ間の関連(リレーション)について紹介したいと思います

2010年9月17日金曜日

オープンソース NoSQL データベース OrientDB を使ってみる #1

今回は OrientDB という オープンソースの NoSQL データベースを紹介致します
※OrientDB は開発が活発なプロジェクトであるため、記載した機能等が将来変更される可能性があります
 (実際、このエントリ書いてる最中にバージョン上がるし、実行ファイル名変わるし…)

OrientDB は今年(2010年)5月に公開された、新しいプロダクトです
(なお、ベースとなった Orient ODBMS ( C++ にて実装) は1999年にリリースされており、これは10年近くの実績があります)
開発者は Luca Garulli というイタリアの方で、 JDO 1.0 、 2.0 のエキスパートメンバーのひとりです
現在のところ Luca 1人で開発していますが、将来的にはコミュニテイとして開発者を増やしたいとのことです
(そのため、 Wiki のドキュメント整備まで手が回らないのか、情報が最新版と一致していない箇所があります)

OrientDB は DBMS の分類では CouchDB や MongoDB と同じ、ドキュメント指向データベースですが、データ間の関連(リレーション)はグラフデータベースのように扱うといった、複数の DBMS の特徴を備えたものとなっています
この他にも OrientDB には以下のような特徴があります

・100% Java にて記述されている
・軽量である(本体のみで約1MB)
・高速である(一般的なコンピュータ(※1)にて200,000件/秒の登録が可能(※2))
・グラフデータベースのスタックとして Tinkerpop を採用
 (Gremlin などの対応プロダクトが利用可能)
・データ操作には、Java API 、HTTP Restful API、 SQL ライクな構文をサポート
・スキーマレス、スキーマフル、複合の複数のスキーマタイプを選択可能
・ACIDトランザクションのサポート
・組込モード、サーバーモードの2つの動作モードをサポート
・ライセンスは Apache License 2.0
※1 … DELL Notebook model XPS M1530 with Intel(r) Core Duo T7700 2.40Ghz, 3 GB RAM and HD 5.400rpm, O.S. MS Windows Vista, JRE 1.6.0_20
※2 … インメモリでの処理時

また、 OrientDB を基盤とした OrientKV というキー・バリューストアのプロダクトがあります
(OrientDB、OrientKV(Key/Value Server) とは別に Orient Object(Object Database) というプロダクトもあるのですが、 OrientDB のコア機能として含まれているようなのでここでの説明は割愛しています)
OrientKV は本体が軽量、データ処理が高速であるという OrientDB の良い部分を引き継ぎ、且つ複数ノードにデータを分散させて格納する、分散キー・バリューストアとしての運用が設定にて簡単に実現できるという特徴があります
OrientKV の詳細に関しては別エントリにてご紹介したいと思います

次に OrientDB のインストールと、実際の動作についてです
以下の説明は下記環境にて行っています
Windows、Linux をご利用の方は、各環境に合わせて読み替えていただければと思います
(Windows 環境では .sh ファイルを .bat ファイルと読み替えるなど)

・Mac OS X 10.6.4
・Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)

OrientDB のインストールはパッケージのダウンロード、及び展開のみで完了します
コチラのリストより最新版(2010年09月17日現在)である "orientdb-0.9.22.zip" をダウンロードし、適当な場所に展開します

展開後、 "config" ディレクトリ内にある "orient-server-config.xml" ファイルを開き、9行目、10行目ほどにあるリスナのポート番号をご使用の環境に合わせ、変更します
(デフォルト値として設定されている、"2424-2430"(9行目)、"2480-2490"(10行目)の範囲内のポート番号が使用可であれば、特に変更は必要ありません)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<orient-server>
<network>
<protocols>
<protocol implementation="com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary" name="binary"/>
<protocol implementation="com.orientechnologies.orient.server.network.protocol.http.ONetworkProtocolHttpDb" name="http"/>
</protocols>
<listeners>
<listener protocol="binary" port-range="2424-2430" ip-address="127.0.0.1"/>
<listener protocol="http" port-range="2480-2490" ip-address="127.0.0.1">
<!-- 〜中略〜 -->
</orient-server>

また、 "bin" ディレクトリ内に移動し、下記ファイルに実行権限を付与します

$ cd ./bin
$ chmod +x ./server.sh ./console.sh

以上でインストール、及び初期設定は完了です

("bin" ディレクトリ内に移動したままの状態で)下記コマンドを実行し、サーバの起動を行ないます
(サーバを停止する場合は Ctrl + C にて停止します)

$ ./server.sh

最後に実際にデータの登録、参照、更新、削除を行ないたいと思います
OrientDB のデータに対しては、 Java API 、REST API 、同梱のクライアントアプリケーションの "Console" 、そして Web ベースのクライアントアプリケーションである "OrientDB Studio" から操作可能となっています
上記の中ではJava API の動作が一番安定していますが、使いやすさから今回は "Console" での操作を紹介します
(Java API での動作は次回紹介したいと思います)
なお、 "OrientDB Studio" はバグや未実装の機能が多く、 orientdb-0.9.22 のバージョンでは実用するには厳しい状態です

("bin" ディレクトリ内に移動したままの状態で)下記コマンドを実行し、"Console" の起動を行ないます
(起動後はプロンプトの入力待ち状態が ">" となります)

$ ./console.sh

起動後、まず "help" と入力します
下記のように各コマンドとその説明が表示されます

> help

AVAILABLE COMMANDS:

* get Return the value of a property
* classes Display all the configured classes
* set Change the value of a property
* delete Delete records from the database
* insert Insert a new record into the database
* connect Connect to a database
* update Update records in the database
* info Display information about current status
* properties Return all the configured properties
* disconnect Disconnect from the current database
* create database Create a new database
* create cluster Create a new cluster in the current database. The cluster can be physical or logical.
* remove cluster Remove a cluster in the current database. The cluster can be physical or logical.
* load record Load a record in memory and set it as the current one
* display record Display current record's attributes
* grant Grant privileges to a role
* revoke Revoke privileges to a role
* create link Create a link from a JOIN
* create class Create a class
* create property Create a property
* select Execute a query against the database and display the results
* script Execute a script against the current database. If the database is remote, then the script will be executed remotely.
* create index Create an index on a property
* create index Create an index on a property
* browse class Browse all the records of a class
* browse cluster Browse all the records of a cluster
* clusters Display all the configured clusters
* dictionary keys Display all the keys in the database dictionary
* dictionary get Loookup for a record using the dictionary. If found set it as the current record
* dictionary put Insert or modify an entry in the database dictionary. The entry is composed by key=String, value=record-id
* dictionary remove Remove the association in the dictionary
* export database Export a database
* compare databases Compare two databases
* import database Import a database into the current one
* export record Export the current record in the requested format
* help Print this help
* exit Close the console

コマンドの最後にある通り、 "exit" コマンドを使用すると、"Console" アプリケーションを終了することができます

次に "connect" コマンドを実行し、データベースに接続します
"connect" コマンドは以下のように入力します

connect <接続モード>:<データベースパス> <ユーザー名> <ユーザーパスワード>
・"接続モード" には "local" と "remote" があり、ローカルデータベースへの接続は "local" 、ローカル、またはリモートにて起動しているサーバーへの接続には "remote" を使用してください
・"データベースパス" はデータベースまでのパスとなります
 接続モードによりパスの指定が異なり、 "local" ではデータベースまでのファイルパス、 "remote" ではサーバーのアドレスとデータベース名となります
・"ユーザー名" 、 "ユーザーパスワード" はデータベースに設定されているユーザー名、パスワードとなります
 データベース作成時、デフォルトで下記ユーザーが作成されます

  ・ユーザー名:admin / パスワード : admin … データベースに対して、書き込み、読み込み権限を持ちます
  ・ユーザー名:writer / パスワード : writer … データベースに対して、書き込み限を持ちます
  ・ユーザー名:reader / パスワード : reader … データベースに対して、読み込み権限を持ちます

今回はユーザーは "admin" 、データベースは、デフォルトで作成されている "demo" データベースを利用します
使用するコマンドは下記のようになります

> connect remote:localhost/demo admin admin

"Connecting to database [remote:localhost/demo] with user 'admin'...OK" と表示され、入力待ち状態となったら接続成功です
接続に失敗する場合は、ポート番号が衝突していないか、確認してみてください

次にデータを登録しますが、その前にまずクラスの作成を行う必要があります
クラスは RDBMS の表と似た概念になり、データ集合のモデルとなるものです
なお、 OrientDB のクラスは、(上記特徴にも書いたとおり)スキーマレス、スキーマフル、両者の混在という設定が可能です
クラスの作成には "create class" コマンドを使います
"create class" コマンドは以下のように入力します

create class <クラス名>
・"クラス名" は作成するクラス名を指定します
 (クラスの識別として大文字小文字は区別されます)

使用するコマンドは下記のようになります

> create class Person

"Class created successfully with id=xx"(xx はユニークな ID、データベース上にあるクラスの ID が表示されます) と表示されれば、クラスの作成は完了です。
ここで、大きなバグがあるのですが、クラスを作成しても即時反映がされません
"exit" コマンドで接続解除をして、 "console.sh" でコンソールを再起動し、 "connect" コマンドで接続しなおしてください
再接続後、"classes" コマンドを実行すると、既存のクラスに加えて、先程作成したクラス名が表示されるのがわかります

> classes
CLASSES:
--------------------+------+------------------------------------------+-----------+
NAME    | ID | CLUSTERS         | ELEMENTS |
--------------------+------+------------------------------------------+-----------+
ORole    |  0| orole         |   3 |
OUser    |  1| ouser         |   3 |
Account    |  2| account         |  1005 |
Company    |  3| company         |   9 |
Profile    |  4| profile         |   9 |
Whiz    |  5| whiz          |  1000 |
Address    |  6| address         |  164 |
City    |  7| city          |  55 |
Country    |  8| country         |  55 |
Animal    |  9| animal         |   0 |
AnimalRace   | 10| animalrace        |   3 |
OGraphVertex  | 11| ographvertex        |  102 |
OGraphEdge   | 12| ographedge        |  101 |
Person    | 13| person         |   0 |
--------------------+------+------------------------------------------+-----------+
TOTAL                  2509 |
----------------------------------------------------------------------------------+

作成したクラスにスキーマを定義することが可能ですが、今回はスキーマレスで使用します

OrientDB ではデータ操作に、 RDBMS のように SQL に似た構文を使用することができます
データの登録には "INSERT" 文を使います

INSERT INTO <クラス名>|cluster:<クラスタ名> (<フィールド名>[,]*) VALUES (<フィールド値>[,]*)
・"クラス名"にはデータを登録するクラスの名前を記述します
・"クラスタ名" にはデータを格納するクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"フィールド名"をキーに"フィールド値"が登録されます

以下のデータを登録してみます

> insert into Person (name, surname) values ('Marty', 'McFly')

実行後、 "Inserted record Person@19:0{name:Marty,surname:McFly} in X sec(s)."(Xは秒数(環境により異なります)) のように表示されたら登録成功です
登録されたデータを確認する簡単な方法は "browse class" コマンドを使用することです

> browse class Person

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|Marty    |McFly   
---+--------+--------------------+--------------------

また、 SQL のように "SELECT" 文を使用することもできます
("browse class" コマンドと異なり、抽出する条件や並び順などを指定できます)

SELECT FROM <対象> [WHERE <条件>*] [ORDER BY <フィールド名>* [ASC|DESC]*]
・"対象"には検索する"クラス名"、"クラスタ名"、及び"レコードID"が指定可能です
 ("クラスタ名"、"レコードID"については今回使用しませんので、説明は省略します)
・"条件"には、データを抽出する条件を指定します(省略可能です)
・ORDER BY 句を使用した場合、指定した "フィールド名" 順に昇順( "ASC" )、降順( "DESC" )に並べ替えます

先程登録したデータを検索します

> select from Person where name = 'Marty' order by surname

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|Marty    |McFly   
---+--------+--------------------+--------------------

次はデータの変更(更新)を行ないます

update <クラス名>|cluster:<クラスタ名> set [[,] <フィールド名> = <フィールド値>]* [where <条件>]
・"クラス名"にはデータを更新するクラスの名前を記述します
・"クラスタ名" には更新するデータが格納されたクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"フィールド名"の値を"フィールド値"にて更新します
・"条件"には、更新対象となるデータの条件を指定します(省略可能ですが、対象が全件となります)

登録したデータを更新します

> update Person set name = 'George' where name = 'Marty'

実行後、 "Updated 1 record(s) in X sec(s)." (Xは秒数(環境により異なります))のように表示されたら更新成功です
"browse class" コマンドを使用すると、変更が確認できます

> browse class Person

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|George    |McFly   
---+--------+--------------------+--------------------

最後にデータの削除を行ないます

DELETE FROM <クラス>|cluster:<クラスタ> [WHERE <条件>]
・"クラス名"にはデータを削除するクラスの名前を記述します
・"クラスタ名" には削除するデータが格納されたクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"条件"には、削除対象となるデータの条件を指定します(省略可能ですが、対象が全件となります)

更新したデータを削除します

> delete from Person where surname = 'McFly'

実行後、 "Delete 1 record(s) in X sec(s)."(Xは秒数(環境により異なります)) のように表示されたら削除成功です
"browse class" コマンドを使用すると、データが存在しないことが確認できます

> browse class Person

以上で、"Console" アプリケーションを使用した OrientDB の操作方法になります
次回は、 Java API を利用した OrientDB の操作方法を紹介したいと思います

2010年8月17日火曜日

NetBeans IDE 6.9.1 リリース

随分遅くなりましたが、 NetBeans IDE 6.9 がリリースされました
ダウンロードはコチラです
Java FX の更新とバグフィックスが主な変更点となります

また、次期バージョン候補の 6.10 についての情報もコチラにあがっています
Oracle 製品(Weblogic や Oracle DB)と Glassfish 3.1 サポートがメインになりそうです
あとはパフォーマンスの見直しも計られるようです
また、確度は不明ですが、追加機能として GIT サポートもあがっています

6.10 についてまた何かわかりましたら、紹介したいと思います

2010年7月19日月曜日

Scala 2.8.0 リリース

Scala 2.8.0 正式版がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL

ようやく正式版が出ました
NetBeans 用プラグインも早くから 2.8 対応が行われていますので、すでに移行済みの方も多いかと思います
時間を見つけて、Wiki のほうも最新に差し替えたいと思います

2010年7月2日金曜日

Scala 2.8.0.RC7 リリース

Scala 2.8.0.RC7 がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.RC7 -- Copyright 2002-2010, LAMP/EPFL

とうとう、RC7まできました
RC10までいくのか、それとも正式リリースされるのか…

2010年6月19日土曜日

Scala 2.8.0.RC6 リリース

Scala 2.8.0.RC6 がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.RC6 -- Copyright 2002-2010, LAMP/EPFL


2.8 の正式版いつでるのやら…