1. 概要

OrientDB は、グラフドキュメントキー値で動作するように設計されたオープンソースのマルチモデルNoSQLデータベーステクノロジーです。 ]GeoSpatialおよびReactiveモデルで、SQL構文を使用してクエリを管理します。

この記事では、セットアップについて説明し、OrientDBJavaAPIを使用します。

2. インストール

まず、バイナリパッケージをインストールする必要があります。

OrientDB の最新の安定バージョン(この記事の執筆時点では 2.2.x )をダウンロードしましょう。

次に、解凍してコンテンツを便利なディレクトリに移動する必要があります( ORIENTDB_HOME を使用)。 コマンドラインで簡単に使用できるように、必ずbinフォルダーを環境変数に追加してください。

最後に、 $ ORIENTDB_HOME /binにあるorientdb.shファイルを編集する必要があります。ORIENTDB_HOME )の場所を ORIENTDB_DIR および、USER_YOU_WANT_ORIENTDB_RUN_WITHの代わりに使用するシステムユーザー。

これで、完全に機能するOrientDBができました。 使用できます orientdb.sh

  • start :サーバーを起動します
  • 状態:ステータスを確認する

  • 止まる:サーバーを停止します

startアクションとstopアクションの両方で、ユーザーパスワード( orientdb.sh ファイルで設定したもの)が必要であることに注意してください。

サーバーが起動されると、サーバーはポート2480を占有します。 したがって、この URL:を使用してローカルにアクセスできます。

手動インストールの詳細については、こちらをご覧ください。

注:OrientDBには、Javaバージョン1.7以降が必要です。

以前のバージョンはこちらで入手できます。

3. OrientDBJavaAPIのセットアップ

OrientDBを使用すると、Java開発者は次のような3つの異なるAPIを使用できます。

  • グラフAPI–グラフデータベース
  • ドキュメントAPI–ドキュメント指向データベース
  • オブジェクトAPI–OrientDBドキュメントに直接バインドされているオブジェクト

OrientDBを統合して使用するだけで、これらすべてのタイプを単一のコードベース内で使用できます。

プロジェクトのクラスパスに含めることができるいくつかの利用可能なjarを見てみましょう。

  • orientdb-core-*。jar:コアライブラリをもたらします
  • blueprints-core-*。jar:アダプターのコアコンポーネントを提供します
  • orientdb-graphdb-*。jar:グラフデータベースAPIを提供します
  • orientdb-object-*。jar:オブジェクトデータベースAPIを提供します
  • orientdb-distributed-*。jar:サーバークラスターで動作する分散データベースプラグインを提供します
  • orientdb-tools-*。jar:コンソールコマンドを渡します
  • orientdb-client-*。jar:リモートクライアントを提供します
  • orientdb-enterprise-*。jar:クライアントとサーバーが共有するプロトコルとネットワーククラスを有効にします

最後の2つは、リモートサーバーでデータを管理している場合にのみ必要です。

Mavenプロジェクトから始めて、次の依存関係を使用してみましょう。

<dependency>
    <groupId>com.orientechnologies</groupId>
    <artifactId>orientdb-core</artifactId>
    <version>2.2.31</version>
</dependency>
<dependency>
    <groupId>com.orientechnologies</groupId>
    <artifactId>orientdb-graphdb</artifactId>
    <version>2.2.31</version>
</dependency>
<dependency>
    <groupId>com.orientechnologies</groupId>
    <artifactId>orientdb-object</artifactId>
    <version>2.2.31</version>
</dependency>
<dependency>
    <groupId>com.tinkerpop.blueprints</groupId>
    <artifactId>blueprints-core</artifactId>
    <version>2.6.0</version>
</dependency>

OrientDBのCore GraphDB Object API、および Blueprints-Core の最新バージョンについては、MavenCentralリポジトリを確認してください。

4. 使用法

OrientDBは、グラフの操作に TinkerPopBlueprints実装を使用しています。

TinkerPop は、グラフデータベースを構築する多くの方法を提供するグラフコンピューティングフレームワークであり、それぞれに実装があります。

さらに、OrientDBでは、APIのタイプに関係なく、3種類のSchemasを使用できます。

  • Schema-Full – strictモードが有効になっているため、クラスの作成時にすべてのフィールドが指定されます
  • Schema-Less –クラスは特定のプロパティなしで作成されるため、必要に応じて追加できます。 これがデフォルトモードです
  • Schema-Hybrid –スキーマフルとスキーマレスの組み合わせであり、事前定義されたフィールドを使用してクラスを作成できますが、レコードで他のカスタムフィールドを定義できます。

4.1. グラフAPI

これはグラフベースのデータベースであるため、データは Edges (アーク)によって相互接続された頂点(ノード)を含むネットワークとして表されます。

最初のステップとして、UIを使用して、ユーザーadminとパスワードadmin。を使用してBaeldungDBというグラフデータベースを作成しましょう。

次の画像に示すように、データベースタイプとしてグラフが選択されているため、そのデータにはGRAPHタブからアクセスできます。

ORIENTDB_HOMEOrientDBのインストールフォルダーに対応する環境変数であることを知って、目的のデータベースに接続しましょう。

@BeforeClass
public static void setup() {
    String orientDBFolder = System.getenv("ORIENTDB_HOME");
    graph = new OrientGraphNoTx("plocal:" + orientDBFolder + 
      "/databases/BaeldungDB", "admin", "admin");
}

Article Author 、および Editor クラスを開始して、フィールドに検証を追加する方法を示しましょう。

@BeforeClass
public static void init() {
    graph.createVertexType("Article");

    OrientVertexType writerType
      = graph.createVertexType("Writer");
    writerType.setStrictMode(true);
    writerType.createProperty("firstName", OType.STRING);
    // ...

    OrientVertexType authorType 
      = graph.createVertexType("Author", "Writer");
    authorType.createProperty("level", OType.INTEGER).setMax("3");

    OrientVertexType editorType
      = graph.createVertexType("Editor", "Writer");
    editorType.createProperty("level", OType.INTEGER).setMin("3");

    Vertex vEditor = graph.addVertex("class:Editor");
    vEditor.setProperty("firstName", "Maxim");
    // ...

    Vertex vAuthor = graph.addVertex("class:Author");
    vAuthor.setProperty("firstName", "Jerome");
    // ...

    Vertex vArticle = graph.addVertex("class:Article");
    vArticle.setProperty("title", "Introduction to ...");
    // ...

    graph.addEdge(null, vAuthor, vEditor, "has");
    graph.addEdge(null, vAuthor, vArticle, "wrote");
}

上記のコードスニペットでは、単純なデータベースの単純な表現を作成しました。ここで、

  • Article は、記事を含むスキーマレスクラスです。
  • Writer は、必要なライター情報を保持するスキーマフルスーパークラスです。
  • Writer は、 Author のサブタイプであり、詳細を保持しています。
  • Editor は、エディターの詳細を保持するWriterのスキーマレスサブタイプです。
  • lastName フィールドは保存された作成者に入力されていませんが、次のグラフに表示されます
  • すべてのクラス間に関係があります。作成者記事を記述でき、エディターが必要です。
  • Vertex は、いくつかのフィールドを持つエンティティを表します
  • Edge は、2つの頂点をリンクするエンティティです。

フルクラスのオブジェクトに別のプロパティを追加しようとすると、OValidationExceptionが発生することに注意してください。

OrientDB studio を使用してデータベースに接続すると、データのグラフ表現が表示されます。

データベースのすべてのレコード(頂点)の数を取得する方法を見てみましょう。

long size = graph.countVertices();

さて、の数だけを表示しましょうライター(著者&編集者) オブジェクト:

@Test
public void givenBaeldungDB_checkWeHaveTwoWriters() {
    long size = graph.countVertices("Writer");

    assertEquals(2, size);
}

次のステップでは、次のステートメントを使用して、すべてのWriterのデータを見つけることができます。

Iterable<Vertex> writers = graph.getVerticesOfClass("Writer");

最後に、 level7のすべてのEditorをクエリしてみましょう。 ここでは、一致するものが1つだけあります。

@Test
public void givenBaeldungDB_getEditorWithLevelSeven() {
    String onlyEditor = "";
    for(Vertex v : graph.getVertices("Editor.level", 7)) {
        onlyEditor = v.getProperty("firstName").toString();
    }

    assertEquals("Maxim", onlyEditor);
}

クラス名は、要求時に特定の頂点を検索するために常に指定されます。 詳細については、こちらをご覧ください。

4.2. ドキュメントAPI

次のオプションは、OrientDBのドキュメントモデルを使用することです。 これにより、タイプがテキスト、画像、またはバイナリ形式である可能性のあるフィールドに格納された情報を含む単純なレコードを介したデータ操作が公開されます。

もう一度UIを使用して、 BaeldungDBTwo という名前のデータベースを作成しますが、タイプとしてdocumentを使用します。

注:同様に、このAPIは、スキーマフル、スキーマレス、またはスキーマハイブリッドモードのいずれかで使用できます。

ODatabaseDocumentTx オブジェクトをインスタンス化し、データベースURLとデータベースユーザーの資格情報を提供するだけでよいため、データベース接続は単純なままです。

@BeforeClass
public static void setup() {
    String orientDBFolder = System.getenv("ORIENTDB_HOME");
    db = new ODatabaseDocumentTx("plocal:" 
      + orientDBFolder + "/databases/BaeldungDBTwo")
      .open("admin", "admin");
}

作成者情報を保持する簡単なドキュメントを保存することから始めましょう。

ここで、クラスが自動的に作成されたことがわかります。

@Test
public void givenDB_whenSavingDocument_thenClassIsAutoCreated() {
    ODocument doc = new ODocument("Author");
    doc.field("name", "Paul");
    doc.save();

    assertEquals("Author", doc.getSchemaClass().getName());
}

したがって、作成者の数を数えるには、次を使用できます。

long size = db.countClass("Author");

フィールド値を使用してドキュメントを再度クエリし、 level7でAuthorのオブジェクトを検索してみましょう。

@Test
public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() {
    for (ODocument author : db.browseClass("Author")) author.delete();

    ODocument authorOne = new ODocument("Author");
    authorOne.field("firstName", "Leo");
    authorOne.field("level", 7);
    authorOne.save();

    ODocument authorTwo = new ODocument("Author");
    authorTwo.field("firstName", "Lucien");
    authorTwo.field("level", 9);
    authorTwo.save();

    List<ODocument> result = db.query(
      new OSQLSynchQuery<ODocument>("select * from Author where level = 7"));

    assertEquals(1, result.size());
}

同様に、 Author クラスのすべてのレコードを削除するには、次を使用できます。

for (ODocument author : db.browseClass("Author")) {
    author.delete();
}

OrientDBスタジオのBROWSEタブで、すべての作成者のオブジェクトを取得するためのクエリを作成できます。

4.3. オブジェクトAPI

OrientDBにはデータベースのオブジェクトタイプがありません。 したがって、ObjectAPIはドキュメントデータベースに依存しています。

オブジェクトAPIタイプでは、他のすべての概念は同じままですが、POJOへのバインディングが1つ追加されています。

OObjectDatabaseTx クラスを使用して、BaeldungDBThreeに接続することから始めましょう。

@BeforeClass
public static void setup() {
    String orientDBFolder = System.getenv("ORIENTDB_HOME");
    db = new OObjectDatabaseTx("plocal:" 
      + orientDBFolder + "/databases/BaeldungDBThree")
      .open("admin", "admin");
}

次に、 AuthorAuthorデータを保持するために使用されるPOJOであると想定して、それを登録する必要があります。

db.getEntityManager().registerEntityClass(Author.class);

Author には、次のフィールドのゲッターとセッターがあります。

  • ファーストネーム
  • 苗字
  • レベル

引数なしのコンストラクターを確認した場合は、複数行の命令を使用してAuthorを作成しましょう。

Author author = db.newInstance(Author.class);
author.setFirstName("Luke");
author.setLastName("Sky");
author.setLevel(9);
db.save(author);

一方、 AuthorfirstName lastName 、および level をそれぞれ取得する別のコンストラクターがある場合、インスタンス化は1行だけです。

Author author = db.newInstance(Author.class, "Luke", "Sky", 9);
db.save(author);

次の行は、Authorクラスのすべてのレコードを参照および削除するために使用しています。

for (Author author : db.browseClass(Author.class)) {
    db.delete(author);
}

すべての作成者を数えるには、SQLクエリを作成せずに、クラスとデータベースインスタンスを提供する必要があります。

long authorsCount = db.countClass(Author.class);

同様に、次のようにレベル7で作成者にクエリを実行します。

@Test
public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() {
    for (Author author : db.browseClass(Author.class)) {
        db.delete(author);
    }

    Author authorOne 
      = db.newInstance(Author.class, "Leo", "Marta", 7);
    db.save(authorOne);

    Author authorTwo
      = db.newInstance(Author.class, "Lucien", "Aurelien", 9);
    db.save(authorTwo);

    List<Author> result
      = db.query(new OSQLSynchQuery<Author>(
      "select * from Author where level = 7"));

    assertEquals(1, result.size());
}

最後に、これは公式ガイドであり、いくつかの高度なObjectAPIの使用法を紹介しています。

5. 結論

この記事では、OrientDBをJavaAPIを備えたデータベース管理システムとして使用する方法を見てきました。 また、フィールドに検証を追加し、いくつかの簡単なクエリを作成する方法も学びました。

いつものように、この記事のソースコードはGitHubにあります。