Arangodb-quick-guide

提供:Dev Guides
移動先:案内検索

ArangoDB-マルチモデルの最初のデータベース

ArangoDBは、開発者によってネイティブのマルチモデルデータベースとして歓迎されています。 これは、他のNoSQLデータベースとは異なります。 このデータベースでは、データをドキュメント、キー/値のペア、またはグラフとして保存できます。 また、単一の宣言クエリ言語を使用して、データの一部またはすべてにアクセスできます。 さらに、異なるモデルを単一のクエリに組み合わせることができます。 また、そのマルチモデルスタイルにより、3つのデータモデルのいずれかまたはすべてで水平方向にスケーラブルなリーンアプリケーションを作成できます。

レイヤードvs. ネイティブマルチモデルデータベース

このセクションでは、ネイティブと多層マルチモデルデータベースの重要な違いを強調します。

多くのデータベースベンダーは製品を「マルチモデル」と呼んでいますが、キー/値またはドキュメントストアにグラフレイヤーを追加しても、ネイティブマルチモデルとしての資格はありません。

前のセクションで既に述べたように、同じクエリ言語と同じコアであるArangoDBを使用すると、1つのクエリで異なるデータモデルと機能をまとめることができます。 ArangoDBでは、データモデル間の「切り替え」はなく、クエリを実行するためにデータをAからBにシフトすることもありません。 「階層化」アプローチと比較して、ArangoDBのパフォーマンスが向上します。

マルチモーダルデータベースの必要性

[ファウラーの]基本的な考え方を解釈すると、より大きなソフトウェアアーキテクチャの一部である永続層のさまざまな部分にさまざまな適切なデータモデルを使用することの利点がわかります。

これによれば、たとえば、リレーショナルデータベースを使用して、構造化された表形式のデータを永続化できます。非構造化されたオブジェクトのようなデータのドキュメントストア。ハッシュテーブルのキー/値ストア。高度にリンクされた参照データのグラフデータベース。

ただし、このアプローチの従来の実装では、同じプロジェクトで複数のデータベースを使用することになります。 データの一貫性と複製の問題だけでなく、運用上の摩擦(より複雑な展開、より頻繁なアップグレード)につながる可能性があります。

3つのデータモデルのデータを統合した後の次の課題は、データ管理者がドキュメントクエリ、キー/値ルックアップ、グラフィクエリ、任意の組み合わせなどのさまざまなクエリを表現できる共通クエリ言語を考案して実装することです。これらの。

グラフィクエリ*とは、グラフ理論的な考慮事項を含むクエリを意味します。 特に、これらには、エッジから来る特定の接続機能が含まれる場合があります。 たとえば、 *ShortestPath、GraphTraversal 、および Neighbors です。

グラフは、関係のデータモデルとして最適です。 ソーシャルネットワーク、レコメンダーシステムなど、現実の多くの場合、非常に自然なデータモデルはグラフです。 関係をキャプチャし、各エッジと各頂点のラベル情報を保持できます。 さらに、JSONドキュメントは、このタイプの頂点データとエッジデータを格納するのに最適です。

ArangoDB─機能

ArangoDBにはさまざまな注目すべき機能があります。 以下の顕著な特徴を強調します-

  • マルチモデルパラダイム
  • ACIDプロパティ
  • HTTP API

ArangoDBは、すべての一般的なデータベースモデルをサポートしています。 以下は、ArangoDBでサポートされているいくつかのモデルです-

  • 文書モデル
  • キー/値モデル
  • グラフモデル

データベースからデータを取得するには、単一のクエリ言語で十分です。

4つのプロパティ Atomicity、Consistency、Isolation 、および Durability (ACID)は、データベーストランザクションの保証を示します。 ArangoDBはACID準拠のトランザクションをサポートしています。

ArangoDBを使用すると、ブラウザなどのクライアントはHTTP APIを使用してデータベースと対話できます。APIはリソース指向であり、JavaScriptで拡張可能です。

ArangoDB-利点

ArangoDBを使用する利点は次のとおりです-

統合

ネイティブのマルチモデルデータベースとして、ArangoDBは複数のデータベースをデプロイする必要をなくし、コンポーネントの数とそのメンテナンスを減らします。 その結果、アプリケーションのテクノロジースタックの複雑さが軽減されます。 全体的な技術的ニーズを統合することに加えて、この簡素化は総所有コストの削減と柔軟性の向上につながります。

簡素化されたパフォーマンススケーリング

時間の経過とともにアプリケーションが成長する中で、ArangoDBはさまざまなデータモデルで個別にスケーリングすることで、パフォーマンスとストレージのニーズの増大に対処できます。 ArangoDBは垂直方向と水平方向の両方にスケーリングできるため、パフォーマンスの低下が必要な場合(意図的なスローダウン)に、バックエンドシステムを簡単にスケールダウンして、ハードウェアと運用コストを節約できます。

運用の複雑さを軽減

Polyglot Persistenceの法令は、引き受けるすべての仕事に最適なツールを採用することです。 特定のタスクにはドキュメントデータベースが必要ですが、他のタスクにはグラフデータベースが必要な場合があります。 単一モデルのデータベースを使用した結果、複数の運用上の課題が生じる可能性があります。 単一モデルのデータベースの統合は、それ自体が難しい仕事です。 しかし、最大の課題は、独立した無関係なデータベースシステム間でデータの一貫性とフォールトトレランスを備えた大規模な凝集構造を構築することです。 それはほとんど不可能であるとわかるかもしれません。

Polyglot Persistenceは、ネイティブのマルチモデルデータベースで処理できます。これは、ポリグロットデータを簡単に保持できると同時に、フォールトトレラントシステムでのデータの一貫性を維持できるためです。 ArangoDBを使用すると、複雑なジョブに適切なデータモデルを使用できます。

強力なデータ一貫性

複数の単一モデルデータベースを使用する場合、データの一貫性が問題になる可能性があります。 これらのデータベースは互いに通信するようには設計されていないため、異なるモデル間でデータの一貫性を保つために、何らかの形式のトランザクション機能を実装する必要があります。

ACIDトランザクションをサポートするArangoDBは、単一のバックエンドでさまざまなデータモデルを管理し、単一インスタンスで強力な一貫性を提供し、クラスターモードで動作する場合のアトミック操作を提供します。

フォールトトレランス

多くの無関係なコンポーネントでフォールトトレラントシステムを構築することは困難です。 クラスターを使用する場合、この課題はより複雑になります。 さまざまなテクノロジーやテクノロジースタックを使用して、そのようなシステムを展開および保守するには専門知識が必要です。 さらに、独立して実行するように設計された複数のサブシステムを統合すると、多大なエンジニアリングおよび運用コストがかかります。

統合されたテクノロジースタックとして、マルチモデルデータベースはエレガントなソリューションを提供します。 ArangoDBは、さまざまなデータモデルを備えた最新のモジュール式アーキテクチャを可能にするように設計されており、クラスターの使用にも対応しています。

総所有コストの削減

各データベーステクノロジーには、ベンダーが提供する継続的なメンテナンス、バグ修正パッチ、およびその他のコード変更が必要です。 マルチモデルデータベースを採用すると、アプリケーションの設計時にデータベーステクノロジーの数を削減するだけで、関連するメンテナンスコストを大幅に削減できます。

トランザクション

複数のマシン全体でトランザクションの保証を提供することは大きな課題であり、これらの保証を提供するNoSQLデータベースはほとんどありません。 ネイティブのマルチモデルであるArangoDBは、データの一貫性を保証するためにトランザクションを課します。

基本的な概念と用語

この章では、ArangoDBの基本的な概念と用語について説明します。 私たちが扱っている技術的なトピックに関連する基礎的な基本用語のノウハウを持つことが非常に重要です。

ArangoDBの用語は以下のとおりです-

  • 資料
  • コレクション
  • コレクション識別子
  • コレクション名
  • データベース
  • データベース名
  • データベース構成

データモデルの観点から、ドキュメントの概念は後者の数学的概念であるため、ArangoDBはドキュメント指向のデータベースと見なされます。 ドキュメント指向データベースは、NoSQLデータベースの主要なカテゴリの1つです。

階層は次のようになります。ドキュメントはコレクションにグループ化され、コレクションはデータベース内に存在します

IdentifierとNameがコレクションとデータベースの2つの属性であることは明らかです。

通常、ドキュメントコレクションに格納されている2つのドキュメント(頂点)は、エッジコレクションに格納されているドキュメント(エッジ)によってリンクされています。 これはArangoDBのグラフデータモデルです。 これは、エッジにラベルが付いているだけでなく、本格的なドキュメントであることを除いて、有向ラベル付きグラフの数学的概念に従います。

このデータベースのコア用語に精通し、ArangoDBのグラフデータモデルを理解し始めました。 このモデルには、ドキュメントコレクションとエッジコレクションの2種類のコレクションがあります。 エッジコレクションにはドキュメントが保存され、2つの特別な属性も含まれます。1つ目は _from 属性で、2つ目は _to 属性です。 これらの属性は、グラフデータベースに不可欠なドキュメント間のエッジ(関係)を作成するために使用されます。 ドキュメントコレクションは、グラフのコンテキストでは頂点コレクションとも呼ばれます(グラフ理論の本を参照してください)。

データベースの重要性を見てみましょう。 コレクションはデータベース内に存在するため、これらは重要です。 ArangoDBの1つのインスタンスには、1つまたは複数のデータベースが存在する場合があります。 データベース内の異なるデータセット(コレクション、ドキュメントなど)が互いに分離されているため、通常、マルチテナントセットアップには異なるデータベースが使用されます。 デフォルトのデータベース _system は、削除できないため特別です。 ユーザーはこのデータベースで管理され、資格情報はサーバーインスタンスのすべてのデータベースに対して有効です。

ArangoDB-システム要件

この章では、ArangoDBのシステム要件について説明します。

ArangoDBのシステム要件は次のとおりです-

  • UbuntuがインストールされたVPSサーバー
  • RAM:1 GB; CPU:2.2 GHz

このチュートリアルのすべてのコマンドでは、処理能力2.2 GHzのCPUを1個搭載したRAM 1GBのUbuntu 16.04(xenial)のインスタンスを使用しました。 そして、このチュートリアルのすべてのarangoshコマンドは、ArangoDBバージョン3.1.27でテストされました。

ArangoDBをインストールする方法は?

このセクションでは、ArangoDBのインストール方法について説明します。 ArangoDBは、多くのオペレーティングシステムとディストリビューション用に事前に構築されています。 詳細については、ArangoDBのドキュメントを参照してください。 すでに述べたように、このチュートリアルではUbuntu 16.04x64を使用します。

最初のステップは、そのリポジトリの公開鍵をダウンロードすることです-

# wget https://www.arangodb.com/repositories/arangodb31/
xUbuntu_16.04/Release.key

出力

--2017-09-03 12:13:24-- https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04/Release.key
Resolving https://www.arangodb.com/
(www.arangodb.com)... 104.25.1 64.21, 104.25.165.21,
2400:cb00:2048:1::6819:a415, ...
Connecting to https://www.arangodb.com/
(www.arangodb.com)|104.25. 164.21|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3924 (3.8K) [application/pgpkeys]
Saving to: ‘Release.key’
Release.key 100%[===================>] 3.83K - .-KB/s in 0.001s
2017-09-03 12:13:25 (2.61 MB/s) - ‘Release.key’ saved [39 24/3924]

重要な点は、出力の最後に Release.key が保存されていることを確認することです。

次のコード行を使用して保存されたキーをインストールしましょう-

# sudo apt-key add Release.key

出力

OK

次のコマンドを実行してaptリポジトリを追加し、インデックスを更新します-

# sudo apt-add-repository 'deb
https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04//'
# sudo apt-get update

最後のステップとして、ArangoDBをインストールできます-

# sudo apt-get install arangodb3

出力

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
grub-pc-bin
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
arangodb3
0 upgraded, 1 newly installed, 0 to remove and 17 not upgraded.
Need to get 55.6 MB of archives.
After this operation, 343 MB of additional disk space will be used.
*Enter* を押します。 今ArangoDBをインストールするプロセスが開始されます-
Get:1 https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04
arangodb3 3.1.27 [55.6 MB]
Fetched 55.6 MB in 59s (942 kB/s)
Preconfiguring packages ...
Selecting previously unselected package arangodb3.
(Reading database ... 54209 files and directories currently installed.)
Preparing to unpack .../arangodb3_3.1.27_amd64.deb ...

Unpacking arangodb3 (3.1.27) ...
Processing triggers for systemd (229-4ubuntu19) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up arangodb3 (3.1.27) ...
Database files are up-to-date.

ArangoDBのインストールが完了しようとすると、次の画面が表示されます-

ArangoDBのインストール

ここでは、ArangoDB root ユーザーのパスワードを入力するよう求められます。 注意して書き留めてください。

次のダイアログボックスが表示されたら、*はい*オプションを選択します-

構成ダイアログボックス

上記のダイアログボックスで[はい]をクリックすると、次のダイアログボックスが表示されます。 ここで[はい]をクリックします。

Configuration Dalog Box 2

また、次のコマンドでArangoDBのステータスを確認できます-

# sudo systemctl status arangodb3

出力

arangodb3.service - LSB: arangodb
Loaded: loaded (/etc/init.d/arangodb3; bad; vendor pre set: enabled)
Active: active (running) since Mon 2017-09-04 05:42:35 UTC;
4min 46s ago
Docs: man:systemd-sysv-generator(8)
Process: 2642 ExecStart=/etc/init.d/arangodb3 start (code = exited,
status = 0/SUC
Tasks: 22
Memory: 158.6M
CPU: 3.117s
CGroup:/system.slice/arangodb3.service
├─2689/usr/sbin/arangod --uid arangodb
--gid arangodb --pid-file/va
└─2690/usr/sbin/arangod --uid arangodb
--gid arangodb --pid-file/va
Sep   04 05:42:33   ubuntu-512  systemd[1]:        Starting LSB:  arangodb...
Sep   04 05:42:33   ubuntu-512  arangodb3[2642]:  * Starting arango database server a
Sep   04 05:42:35   ubuntu-512  arangodb3[2642]:   {startup} starting up in daemon mode
Sep   04 05:42:35   ubuntu-512  arangodb3[2642]:   changed working directory for child
Sep   04 05:42:35   ubuntu-512  arangodb3[2642]:   ...done.
Sep   04 05:42:35   ubuntu-512  systemd[1]:        StartedLSB: arang odb.
Sep   04 05:46:59   ubuntu-512  systemd[1]:        Started LSB: arangodb. lines 1-19/19 (END)

ArangoDBを使用する準備ができました。

arangoshターミナルを呼び出すには、ターミナルで次のコマンドを入力します-

# arangosh

出力

Please specify a password:

インストール時に作成された root パスワードを指定します-

_
__ _ _ __ __ _ _ __ __ _ ___ | |
/| '__/_ | ’ \/` |/_/| ’
| (| | | | (| | | | | (| | () _ \ | | |
_,|| _,|| ||_, |_/|/| ||
|__/
arangosh (ArangoDB 3.1.27 [linux] 64bit, using VPack 0.1.30, ICU 54.1, V8
5.0.71.39, OpenSSL 1.0.2g 1 Mar 2016)

Copyright (c) ArangoDB GmbH

Pretty printing values.
Connected to ArangoDB 'http+tcp://127.0.0.1:8529' version: 3.1.27 [server],
database: '_system', username: 'root'

Please note that a new minor version '3.2.2' is available
Type 'tutorial' for a tutorial or 'help' to see common examples
127.0.0.1:8529@_system> exit

出力ウィンドウのルートパスワード

ArangoDBからログアウトするには、次のコマンドを入力します-

127.0.0.1:8529@_system> exit

出力

Uf wiederluege! Na shledanou! Auf Wiedersehen! Bye Bye! Adiau! ¡Hasta luego!
Εις το επανιδείν!

להתראות ! Arrivederci! Tot ziens! Adjö! Au revoir! さようなら До свидания! Até
Breve! !خداحافظ

ArangoDB-コマンドライン

この章では、ArangoshがArangoDBのコマンドラインとしてどのように機能するかについて説明します。 まず、データベースユーザーを追加する方法を学習します。

-テンキーパッドがArangoshで動作しない可能性があることに注意してください。

ユーザーが「harry」であり、パスワードが「hpwdb」であると仮定しましょう。

127.0.0.1:8529@_system> require("org/arangodb/users").save("harry", "hpwdb");

出力

{
   "user" : "harry",
   "active" : true,
   "extra" : {},
   "changePassword" : false,
   "code" : 201
}

ArangoDB-Webインターフェイス

この章では、認証を有効/無効にする方法、およびArangoDBをパブリックネットワークインターフェイスにバインドする方法を学習します。

# arangosh --server.endpoint tcp://127.0.0.1:8529 --server.database "_system"

以前に保存したパスワードの入力を求められます-

Please specify a password:

構成時にroot用に作成したパスワードを使用します。

また、curlを使用して、認証を必要とする要求に対して実際にHTTP 401(無許可)サーバー応答を取得していることを確認できます-

# curl --dump - http://127.0.0.1:8529/_api/version

出力

HTTP/1.1 401 Unauthorized
X-Content-Type-Options: nosniff
Www-Authenticate: Bearer token_type = "JWT", realm = "ArangoDB"
Server: ArangoDB
Connection: Keep-Alive
Content-Type: text/plain; charset = utf-8
Content-Length: 0

学習プロセス中に毎回パスワードを入力しないように、認証を無効にします。 そのために、構成ファイルを開きます-

# vim/etc/arangodb3/arangod.conf

コードが適切に表示されない場合は、配色を変更する必要があります。

:colorscheme desert

以下のスクリーンショットに示すように、認証をfalseに設定します。

出力ウィンドウのルートパスワード

サービスを再起動します-

# service arangodb3 restart

認証をfalseにすると、(この場合は Harry のようなrootまたは作成されたユーザーで)*パスワードを指定してください*にパスワードを入力せずにログインできます。

認証がオフになっているときに api バージョンを確認しましょう-

# curl --dump - http://127.0.0.1:8529/_api/version

出力

HTTP/1.1 200 OK
X-Content-Type-Options: nosniff
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 60
{"server":"arango","version":"3.1.27","license":"community"}

ArangoDB-事例シナリオの例

この章では、2つのシナリオ例を検討します。 これらの例は理解しやすく、ArangoDBの機能の仕組みを理解するのに役立ちます。

APIを実証するために、ArangoDBには、簡単に理解できる一連のグラフがプリロードされています。 ArangoDBでこれらのグラフのインスタンスを作成するには2つの方法があります-

  • Webインターフェイスのグラフ作成ウィンドウに[サンプル]タブを追加し、
  • または、Arangoshのモジュール @ arangodb/graph-examples/example-graph をロードします。

まず、Webインターフェースを使用してグラフをロードしましょう。 そのためには、Webインターフェースを起動し、*グラフ*タブをクリックします。

Graph Web Interface

[グラフの作成]ダイアログボックスが表示されます。 ウィザードには、 Examples および Graph の2つのタブが含まれています。 [グラフ]タブはデフォルトで開いています。新しいグラフを作成する場合、グラフの名前とその他の定義を要求します。

グラフ作成グラフ

次に、作成済みのグラフをアップロードします。 このために、 Examples タブを選択します。

作成されたグラフのアップロード

3つのグラフの例を見ることができます。 Knows_Graph を選択し、緑色のボタン作成をクリックします。

それらを作成したら、以下の画像の作成に使用されたWebインターフェースでそれらを検査できます。

グラフで画像を作成

Knows_Graph

*Knows_Graph* の仕組みを見てみましょう。 Knows_Graphを選択すると、グラフデータが取得されます。

Knows_Graphは1つの頂点コレクション persons で構成され、1つのエッジコレクション knows を介して接続されています。 アリス、ボブ、チャーリー、デイブ、イブの5人が頂点として含まれます。 以下の有向関係があります

Alice knows Bob
Bob knows Charlie
Bob knows Dave
Eve knows Alice
Eve knows Bob

Knows_Graph

ノード(頂点)、たとえば「bob」をクリックすると、ID(persons/bob)属性名が表示されます。

Knows_Graph Vertex

そして、エッジのいずれかをクリックすると、ID(knows/4590)属性が表示されます。

エッジショーIDをクリック

これが、それを作成し、頂点とエッジを検査する方法です。

今回はArangoshを使用して、別のグラフを追加しましょう。 そのためには、ArangoDB構成ファイルに別のエンドポイントを含める必要があります。

複数のエンドポイントを追加する方法

構成ファイルを開きます-

# vim/etc/arangodb3/arangod.conf

以下の端末のスクリーンショットに示すように、別のエンドポイントを追加します。

エンドポイントターミナルのスクリーンショット

ArangoDBを再起動します-

# service arangodb3 restart

Arangoshを起動します−

# arangosh
Please specify a password:
_
__ _ _ __ __ _ _ __ __ _ ___ ___| |__
/_` | '__/_` | '_ \/_` |/_ \/__| '_ \
| (_| | | | (_| | | | | (_| | (_) \__ \ | | |
\__,_|_| \__,_|_| |_|\__, |\___/|___/_| |_|
|___/
arangosh (ArangoDB 3.1.27 [linux] 64bit, using VPack 0.1.30, ICU 54.1, V8
5.0.71.39, OpenSSL 1.0.2g 1 Mar 2016)
Copyright (c) ArangoDB GmbH
Pretty printing values.
Connected to ArangoDB 'http+tcp://127.0.0.1:8529' version: 3.1.27
[server], database: '_system', username: 'root'
Please note that a new minor version '3.2.2' is available
Type 'tutorial' for a tutorial or 'help' to see common examples
127.0.0.1:8529@_system>

Social_Graph

Social_Graphとは何か、どのように機能するかを理解しましょう。 グラフは、人とその関係のセットを示しています-

この例では、2つの頂点コレクション(女性と男性)の頂点として女性と男性がいます。 エッジは、リレーションエッジコレクション内の接続です。 Arangoshを使用してこのグラフを作成する方法を説明しました。 読者は、Knows_Graphで行ったように、それを回避してその属性を調べることができます。

ArangoDB-データモデルとモデリング

この章では、次のトピックに焦点を当てます-

  • データベースの相互作用
  • データ・モデル
  • データ検索

ArangoDBは、ドキュメントベースのデータモデルとグラフベースのデータモデルをサポートしています。 まず、ドキュメントベースのデータモデルについて説明します。

ArangoDBのドキュメントは、JSON形式によく似ています。 ドキュメントには0個以上の属性が含まれ、各属性に値が付加されます。 値は、数値、ブール値またはヌルなどのアトミックタイプ、リテラル文字列、または埋め込みドキュメント/オブジェクトや配列などの複合データタイプのいずれかです。 配列またはサブオブジェクトは、これらのデータ型で構成されている場合があります。これは、単一のドキュメントが重要なデータ構造を表すことができることを意味します。

さらに階層では、ドキュメントはコレクションに配置されます。コレクションにはドキュメントが含まれない場合があります(理論上)。 ドキュメントを行と比較し、コレクションをテーブルと比較できます(ここで、テーブルと行はリレーショナルデータベース管理システム-RDBMSのものを指します)。

ただし、RDBMSでは、列を定義することは、レコードをテーブルに格納してこれらの定義スキーマを呼び出すための前提条件です。 ただし、新しい機能として、ArangoDBはスキーマレスです。ドキュメントがどの属性を持つかを指定するアプリオリな理由はありません。

また、RDBMSとは異なり、各ドキュメントは別のドキュメントとはまったく異なる方法で構造化できます。 これらのドキュメントは、1つのコレクションにまとめて保存できます。 実際には、コレクション内のドキュメントには共通の特性が存在する場合がありますが、データベースシステム、つまりArangoDB自体は、特定のデータ構造にバインドしません。

次に、2種類のコレクションを必要とするArangoDBの[ graph data model ]を理解しようとします。1つ目はドキュメントコレクション(グループ理論言語では頂点コレクションとして知られています)、2つ目はエッジコレクションです。 これら2つのタイプには微妙な違いがあります。 エッジコレクションにもドキュメントが格納されますが、ドキュメント間の関係を作成するための _from および _to という2つの一意の属性が含まれることが特徴です。 実際には、ドキュメント(読み取りエッジ)は、それぞれのコレクションに格納されている2つのドキュメント(読み取り頂点)をリンクします。 このアーキテクチャは、ラベル付きの有向グラフのグラフ理論的概念から派生し、ラベルだけでなくドキュメント自体のような完全なJSONである可能性のあるエッジを除外します。

新しいデータを計算したり、ドキュメントを削除したり、操作したりするために、クエリが使用されます。クエリは、指定された基準に従ってドキュメントを選択またはフィルタリングします。 「クエリの例」のように単純であるか、「結合」のように複雑であるため、クエリはAQL-ArangoDB Query Languageでコーディングされています。

ArangoDB-データベースメソッド

この章では、ArangoDBのさまざまなデータベースメソッドについて説明します。

まず、データベースのプロパティを取得しましょう-

  • Name
  • ID
  • Path

まず、Arangoshを呼び出します。 Arangoshが呼び出されたら、これまでに作成したデータベースをリストします-

次のコード行を使用して、Arangoshを呼び出します-

127.0.0.1:8529@_system> db._databases()

出力

[
   "_system",
   "song_collection"
]

2つのデータベースがあります。1つはデフォルトで作成された _system で、もう1つは作成した song_collection です。

次のコード行でsong_collectionデータベースに移行しましょう-

127.0.0.1:8529@_system> db._useDatabase("song_collection")

出力

true
127.0.0.1:8529@song_collection>

song_collectionデータベースのプロパティを調べます。

名前を見つけるには

次のコード行を使用して、名前を見つけます。

127.0.0.1:8529@song_collection> db._name()

出力

song_collection

IDを見つけるには-

次のコード行を使用して、IDを見つけます。

song_collection

出力

4838

パスを見つけるには-

次のコード行を使用してパスを見つけます。

127.0.0.1:8529@song_collection> db._path()

出力

/var/lib/arangodb3/databases/database-4838

次のコード行を使用して、システムデータベースにいるかどうかを確認します。

127.0.0.1:8529@song_collection&t; db._isSystem()

出力

false

これは、システムデータベースにないことを意味します(song_collectionに作成して移行したため)。 次のスクリーンショットは、これを理解するのに役立ちます。

シフトされた曲の出力スクリーンショットの作成

特定のコレクションを取得するには、歌を言う-

特定のコレクションを取得するには、次のコード行を使用します。

127.0.0.1:8529@song_collection> db._collection("songs")

出力

[ArangoCollection 4890, "songs" (type document, status loaded)]

コード行は単一のコレクションを返します。

後続の章で、データベース操作の本質に移りましょう。

ArangoDB-Crud Operations

この章では、Arangoshのさまざまな操作について学習します。

以下はArangoshで可能な操作です-

  • ドキュメントコレクションの作成
  • ドキュメントを作成する
  • 文書を読む
  • ドキュメントの更新

新しいデータベースを作成することから始めましょう。 新しいデータベースを作成するには、次のコード行を使用します-

127.0.0.1:8529@_system> db._createDatabase("song_collection")
true

次のコード行は、新しいデータベースへの移行に役立ちます-

127.0.0.1:8529@_system> db._useDatabase("song_collection")
true

プロンプトは「@@ song_collection」に移行します

127.0.0.1:8529@song_collection>

Promt Shift Song Collection

ここから、CRUD操作について学習します。 新しいデータベースにコレクションを作成しましょう-

127.0.0.1:8529@song_collection> db._createDocumentCollection('songs')

出力

[ArangoCollection 4890, "songs" (type document, status loaded)]
127.0.0.1:8529@song_collection>

「songs」コレクションにいくつかのドキュメント(JSONオブジェクト)を追加しましょう。

次の方法で最初のドキュメントを追加します-

127.0.0.1:8529@song_collection> db.songs.save({title: "A Man's Best Friend",
lyricist: "Johnny Mercer", composer: "Johnny Mercer", Year: 1950, _key:
"A_Man"})

出力

{
   "_id" : "songs/A_Man",
   "_key" : "A_Man",
   "_rev" : "_VjVClbW---"
}

データベースに他のドキュメントを追加しましょう。 これは、データを照会するプロセスを学習するのに役立ちます。 あなたはこれらのコードをコピーしてプロセスをエミュレートするためにArangoshに同じものを貼り付けることができます-

127.0.0.1:8529@song_collection> db.songs.save(
   {
      title: "Accentchuate The Politics",
      lyricist: "Johnny Mercer",
      composer: "Harold Arlen", Year: 1944,
      _key: "Accentchuate_The"
   }
)

{
   "_id" : "songs/Accentchuate_The",
   "_key" : "Accentchuate_The",
   "_rev" : "_VjVDnzO---"
}

127.0.0.1:8529@song_collection> db.songs.save(
   {
      title: "Affable Balding Me",
      lyricist: "Johnny Mercer",
      composer: "Robert Emmett Dolan",
      Year: 1950,
      _key: "Affable_Balding"
   }
)
{
   "_id" : "songs/Affable_Balding",
   "_key" : "Affable_Balding",
   "_rev" : "_VjVEFMm---"
}

文書の読み方

*_key* またはドキュメントハンドルを使用して、ドキュメントを取得できます。 コレクション自体を走査する必要がない場合は、ドキュメントハンドルを使用します。 あなたがコレクションを持っている場合、ドキュメント機能は使いやすいです-
127.0.0.1:8529@song_collection> db.songs.document("A_Man");
{
   "_key" : "A_Man",
   "_id" : "songs/A_Man",
   "_rev" : "_VjVClbW---",
   "title" : "A Man's Best Friend",
   "lyricist" : "Johnny Mercer",
   "composer" : "Johnny Mercer",
   "Year" : 1950
}

ドキュメントを更新する方法

保存されたデータを更新するには、 replaceupdate の2つのオプションを使用できます。

更新機能はドキュメントにパッチを適用し、指定された属性とマージします。 一方、置換機能は、以前のドキュメントを新しいドキュメントに置き換えます。 完全に異なる属性が指定されていても、置換は引き続き行われます。 最初に非破壊的な更新を確認し、歌の属性Production`を更新します-

127.0.0.1:8529@song_collection> db.songs.update("songs/A_Man",{production:
"Top Banana"});

出力

{
   "_id" : "songs/A_Man",
   "_key" : "A_Man",
   "_rev" : "_VjVOcqe---",
   "_oldRev" : "_VjVClbW---"
}

今、更新された曲の属性を読んでみましょう-

127.0.0.1:8529@song_collection> db.songs.document('A_Man');

出力

{
   "_key" : "A_Man",
   "_id" : "songs/A_Man",
   "_rev" : "_VjVOcqe---",
   "title" : "A Man's Best Friend",
   "lyricist" : "Johnny Mercer",
   "composer" : "Johnny Mercer",
   "Year" : 1950,
   "production" : "Top Banana"
}

大きな属性のドキュメントは、特に属性が非常に少ない場合、 update 関数を使用して簡単に更新できます。

対照的に、 replace 関数は、同じドキュメントで使用する際のデータを廃止します。

127.0.0.1:8529@song_collection> db.songs.replace("songs/A_Man",{production:
"Top Banana"});

今、次のコード行で更新したばかりの曲をチェックしましょう-

127.0.0.1:8529@song_collection> db.songs.document('A_Man');

出力

{
   "_key" : "A_Man",
   "_id" : "songs/A_Man",
   "_rev" : "_VjVRhOq---",
   "production" : "Top Banana"
}

これで、ドキュメントに元のデータがなくなったことを確認できます。

ドキュメントを削除する方法

削除機能は、コレクションからドキュメントを削除するためにドキュメントハンドルと組み合わせて使用​​されます-

127.0.0.1:8529@song_collection> db.songs.remove('A_Man');

次のコード行を使用して、削除したばかりの曲の属性を確認しましょう-

127.0.0.1:8529@song_collection> db.songs.document('A_Man');

次のような例外エラーが出力として取得されます-

JavaScript exception in file
'/usr/share/arangodb3/js/client/modules/@arangodb/arangosh.js' at 97,7:
ArangoError 1202: document not found
! throw error;
! ^
stacktrace: ArangoError: document not found

at Object.exports.checkRequestResult
(/usr/share/arangodb3/js/client/modules/@arangodb/arangosh.js:95:21)

at ArangoCollection.document
(/usr/share/arangodb3/js/client/modules/@arangodb/arango-collection.js:667:12)
at <shell command>:1:10

例外エラー出力画面

Webインターフェイスを使用したCrud Operations

前の章では、コマンドラインであるArangoshを使用して、ドキュメントに対してさまざまな操作を実行する方法を学びました。 次に、Webインターフェースを使用して同じ操作を実行する方法を学習します。 まず、ブラウザのアドレスバーにhttp://your_server_ip:8529/_db/song_collection/_admin/aardvark/indexl#loginというアドレスを入力します。 次のログインページに移動します。

ログインページ

次に、ユーザー名とパスワードを入力します。

ログインユーザー名パスワード

成功すると、次の画面が表示されます。 データベースが動作するように選択する必要があります。 _ system データベースがデフォルトです。 song_collection データベースを選択し、緑色のタブをクリックします-

曲のコレクション

コレクションを作成する

このセクションでは、コレクションを作成する方法を学びます。 上部のナビゲーションバーの[コレクション]タブを押します。

コマンドラインに追加された曲のコレクションが表示されます。 それをクリックすると、エントリが表示されます。 次に、ウェブインターフェースを使用して「アーティスト」コレクションを追加します。 Arangoshで作成したコレクション*曲*はすでに存在します。 [名前]フィールドに、表示される[新しいコレクション]ダイアログボックスに「アーティスト」と入力します。 詳細オプションは無視しても問題ありません。デフォルトのコレクションタイプ、つまり ドキュメント、結構です。

コレクションの作成

[保存]ボタンをクリックすると、最終的にコレクションが作成され、2つのコレクションがこのページに表示されます。

新しく作成されたコレクションをドキュメントで埋める

*artists* コレクションをクリックすると、空のコレクションが表示されます-

コレクションをドキュメントで埋める

ドキュメントを追加するには、右上隅にある+記号をクリックする必要があります。 _key の入力を求められたら、キーとして Affable_Balding を入力します。

これで、ドキュメントの属性を追加および編集するためのフォームが表示されます。 属性を追加するには、*グラフィック*と*ツリー*の2つの方法があります。 グラフィカルな方法は直感的ですが遅いので、ツリードロップダウンメニューを使用して*コード*ビューに切り替えて選択します-

ツリードロップダウンメニュー

プロセスを簡単にするために、JSON形式のサンプルデータを作成しました。これをコピーして、クエリエディター領域に貼り付けることができます-

\ {"アーティスト": "ジョニーマーサー"、 "タイトル": "Affable Balding Me"、 "作曲家": "ロバートエメットドーラン"、 "年":1950}

(注:中括弧のペアは1つのみ使用してください。下のスクリーンショットを参照してください)

JSON形式で作成されたサンプルデータ

コードビューモードでキーと値を引用していることがわかります。 次に、[保存]をクリックします。 正常に完了すると、ページに緑色のフラッシュが一瞬表示されます。

文書の読み方

ドキュメントを読むには、コレクションページに戻ります。

  • アーティスト*コレクションをクリックすると、新しいエントリが表示されます。

ドキュメントを更新する方法

ドキュメントのエントリを編集するのは簡単です。ドキュメントの概要で編集する行をクリックするだけです。 ここでも、新しいドキュメントを作成するときと同じクエリエディターが表示されます。

ドキュメントを削除する

「-」アイコンを押すと、ドキュメントを削除できます。 すべてのドキュメント行の最後にこの記号があります。 安全でない削除を避けるために確認を求められます。

さらに、特定のコレクションについては、ドキュメントのフィルタリング、インデックスの管理、データのインポートなどの他の操作も[コレクションの概要]ページにあります。

後続の章では、Webインターフェースの重要な機能、つまりAQLクエリエディターについて説明します。

AQLを使用したデータのクエリ

この章では、AQLを使用してデータをクエリする方法について説明します。 前の章で、ArangoDBが独自のクエリ言語を開発し、AQLという名前であることを既に説明しました。

それでは、AQLとの対話を始めましょう。 以下の画像に示すように、Webインターフェースで、ナビゲーションバーの上部にある AQL Editor タブを押します。 空のクエリエディターが表示されます。

必要に応じて、下の画像に示すように右上隅のクエリまたは結果タブをクリックして、結果ビューからエディターに切り替えることができます-

結果ビューからエディターに切り替える

とりわけ、エディタには構文の強調表示、元に戻す/やり直し機能、クエリの保存があります。 詳細なリファレンスについては、公式ドキュメントをご覧ください。 AQLクエリエディタの基本的で一般的に使用されるいくつかの機能を強調します。

AQLの基礎

AQLでは、クエリは達成される最終結果を表しますが、最終結果が達成されるプロセスではありません。 この機能は、一般的に言語の宣言的プロパティとして知られています。 さらに、AQLはデータをクエリすることも変更することもできるため、両方のプロセスを組み合わせて複雑なクエリを作成できます。

AQLは完全にACIDに準拠していることに注意してください。 クエリの読み取りまたは変更は、全体的に完了するか、まったく完了しません。 文書のデータを読んでも、一貫したデータ単位で終了します。

作成済みの曲コレクションに2つの新しい*曲*を追加します。 入力する代わりに、次のクエリをコピーして、AQLエディターに貼り付けることができます-

FOR song IN [
   {
      title: "Air-Minded Executive", lyricist: "Johnny Mercer",
      composer: "Bernie Hanighen", Year: 1940, _key: "Air-Minded"
   },

   {
      title: "All Mucked Up", lyricist: "Johnny Mercer", composer:
      "Andre Previn", Year: 1974, _key: "All_Mucked"
   }
]
INSERT song IN songs

左下の実行ボタンを押します。

*songs* コレクションに2つの新しいドキュメントを書き込みます。

このクエリは、AQLでのFORループの動作を説明しています。 JSONでエンコードされたドキュメントのリストを反復処理し、コレクション内のドキュメントのそれぞれに対してコード化された操作を実行します。 さまざまな操作には、新しい構造の作成、ドキュメントのフィルタリング、選択、変更、データベースへのドキュメントの挿入などがあります(瞬間的な例を参照)。 本質的に、AQLはCRUD操作を効率的に実行できます。

データベース内のすべての曲を検索するには、SQLタイプのデータベースの SELECT FROM曲*に相当する次のクエリをもう一度実行します(エディターは最後のクエリを記憶しているため、* New *ボタンを押しますエディタをきれいにするために)-

FOR song IN songs
RETURN song

結果セットには、以下のスクリーンショットに示すように、 songs コレクションに保存されている曲のリストが表示されます。

曲のリスト

*FILTER、SORT* 、および *LIMIT* などの操作を* Forループ*本体に追加して、結果を絞り込んで順序付けることができます。
FOR song IN songs
FILTER song.Year > 1940
RETURN song

上記のクエリは、[結果]タブで1940年以降に作成された曲を提供します(下の画像を参照)。

1940年以降に作成された曲のクエリ

この例ではドキュメントキーが使用されていますが、その他の属性もフィルタリングの同等物として使用できます。 ドキュメントキーは一意であることが保証されているため、このフィルタに一致するドキュメントは1つだけです。 他の属性の場合、これは当てはまらない場合があります。 名前で昇順でソートされた、アクティブなユーザーのサブセット(ステータスと呼ばれる属性によって決定される)を返すには、次の構文を使用します-

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2

この例を意図的に含めました。 ここでは、AQLによって赤で強調表示されたクエリ構文エラーメッセージを確認します。 この構文はエラーを強調表示し、下のスクリーンショットに示すようにクエリのデバッグに役立ちます。

構文がエラーを強調表示

私たちは今、正しいクエリを実行しましょう(修正に注意してください)-

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song

正しいクエリの実行

AQLの複雑なクエリ

AQLには、サポートされているすべてのデータ型に対して複数の機能が装備されています。 クエリ内の変数の割り当てにより、非常に複雑なネストされた構造を構築できます。 このようにして、データ集約型の操作は、クライアント(ブラウザなど)よりもバックエンドのデータに近づきます。 これを理解するために、最初に任意の長さ(長さ)を曲に追加しましょう。

最初の関数、つまり更新関数から始めましょう-

UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs

AQLの複雑なクエリ

上記のスクリーンショットに示すように、1つのドキュメントが作成されていることがわかります。

他のドキュメント(曲)も更新しましょう。

UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs

これで、すべての曲に length という新しい属性があることを確認できます-

FOR song IN songs
RETURN song

出力

[
   {
      "_key": "Air-Minded",
      "_id": "songs/Air-Minded",
      "_rev": "_VkC5lbS---",
      "title": "Air-Minded Executive",
      "lyricist": "Johnny Mercer",
      "composer": "Bernie Hanighen",
      "Year": 1940,
      "length": 210
   },

   {
      "_key": "Affable_Balding",
      "_id": "songs/Affable_Balding",
      "_rev": "_VkC4eM2---",
      "title": "Affable Balding Me",
      "lyricist": "Johnny Mercer",
      "composer": "Robert Emmett Dolan",
      "Year": 1950,
      "length": 200
   },

   {
      "_key": "All_Mucked",
      "_id": "songs/All_Mucked",
      "_rev": "_Vjah9Pu---",
      "title": "All Mucked Up",
      "lyricist": "Johnny Mercer",
      "composer": "Andre Previn",
      "Year": 1974,
      "length": 180
   },

   {
      "_key": "Accentchuate_The",
      "_id": "songs/Accentchuate_The",
      "_rev": "_VkC3WzW---",
      "title": "Accentchuate The Politics",
      "lyricist": "Johnny Mercer",
      "composer": "Harold Arlen",
      "Year": 1944,
      "length": 190
   }
]

LET、FILTER、SORTなど、AQLの他のキーワードの使用を説明するために、曲の長さを mm:ss 形式でフォーマットします。

問い合わせ

FOR song IN songs
FILTER song.length > 150
LET seconds = song.length % 60
LET minutes = FLOOR(song.length/60)
SORT song.composer
RETURN
{
   Title: song.title,
   Composer: song.composer,
   Duration: CONCAT_SEPARATOR(':',minutes, seconds)
}

AQL 2の複雑なクエリ

今回は、曲のタイトルと長さを返します。 Return 関数を使用すると、入力ドキュメントごとに返す新しいJSONオブジェクトを作成できます。

次に、AQLデータベースの「結合」機能について説明します。

コレクション composer_dob を作成することから始めましょう。 さらに、クエリボックスで次のクエリを実行することにより、作曲家の仮想的な誕生日の4つのドキュメントを作成します-

FOR dob IN [
   {composer: "Bernie Hanighen", Year: 1909}
   ,
   {composer: "Robert Emmett Dolan", Year: 1922}
   ,
   {composer: "Andre Previn", Year: 1943}
   ,
   {composer: "Harold Arlen", Year: 1910}
]
INSERT dob in composer_dob

Composer DOB

SQLとの類似性を強調するために、AQLでネストされたFORループクエリを提示し、REPLACE操作を行います。最初に内側のループで、すべての作曲家のdobで、次に関連するすべての曲で繰り返し、 song 属性の代わりに song_with_composer_key 属性。

ここにクエリがあります-

FOR s IN songs
FOR c IN composer_dob
FILTER s.composer == c.composer

LET song_with_composer_key = MERGE(
   UNSET(s, 'composer'),
   {composer_key:c._key}
)
REPLACE s with song_with_composer_key IN songs

Song Wth Composer Key

ここでクエリ FOR song IN songs RETURN song を再度実行して、曲のコレクションがどのように変更されたかを確認します。

出力

[
   {
      "_key": "Air-Minded",
      "_id": "songs/Air-Minded",
      "_rev": "_Vk8kFoK---",
      "Year": 1940,
      "composer_key": "5501",
      "length": 210,
      "lyricist": "Johnny Mercer",
      "title": "Air-Minded Executive"
   },

   {
      "_key": "Affable_Balding",
      "_id": "songs/Affable_Balding",
      "_rev": "_Vk8kFoK--_",
      "Year": 1950,
      "composer_key": "5505",
      "length": 200,
      "lyricist": "Johnny Mercer",
      "title": "Affable Balding Me"
   },

   {
      "_key": "All_Mucked",
      "_id": "songs/All_Mucked",
      "_rev": "_Vk8kFoK--A",
      "Year": 1974,
      "composer_key": "5507",
      "length": 180,
      "lyricist": "Johnny Mercer",
      "title": "All Mucked Up"
   },

   {
      "_key": "Accentchuate_The",
      "_id": "songs/Accentchuate_The",
      "_rev": "_Vk8kFoK--B",
      "Year": 1944,
      "composer_key": "5509",
      "length": 190,
      "lyricist": "Johnny Mercer",
      "title": "Accentchuate The Politics"
   }
]

上記のクエリはデータ移行プロセスを完了し、各曲に composer_key を追加します。

これで、次のクエリはネストされたFORループクエリになりますが、今度は参加操作につながり、関連する作曲家の名前( `composer_key`の助けを借りて)を各曲に追加します-

FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)

出力

[
   {
      "Year": 1940,
      "_id": "songs/Air-Minded",
      "_key": "Air-Minded",
      "_rev": "_Vk8kFoK---",
      "composer_key": "5501",
      "length": 210,
      "lyricist": "Johnny Mercer",
      "title": "Air-Minded Executive",
      "composer": "Bernie Hanighen"
   },

   {
      "Year": 1950,
      "_id": "songs/Affable_Balding",
      "_key": "Affable_Balding",
      "_rev": "_Vk8kFoK--_",
      "composer_key": "5505",
      "length": 200,
      "lyricist": "Johnny Mercer",
      "title": "Affable Balding Me",
      "composer": "Robert Emmett Dolan"
   },

   {
      "Year": 1974,
      "_id": "songs/All_Mucked",
      "_key": "All_Mucked",
      "_rev": "_Vk8kFoK--A",
      "composer_key": "5507",
      "length": 180,
      "lyricist": "Johnny Mercer",
      "title": "All Mucked Up",
      "composer": "Andre Previn"
   },

   {
      "Year": 1944,
      "_id": "songs/Accentchuate_The",
      "_key": "Accentchuate_The",
      "_rev": "_Vk8kFoK--B",
      "composer_key": "5509",
      "length": 190,
      "lyricist": "Johnny Mercer",
      "title": "Accentchuate The Politics",
      "composer": "Harold Arlen"
   }
]

各曲への作曲者キーの追加

ArangoDB-AQLのクエリ例

この章では、 Actors and Movies データベースでのいくつかのAQLサンプルクエリを検討します。 これらのクエリはグラフに基づいています。

問題

以下に示すように頂点を接続するために、俳優のコレクションと映画のコレクション、およびactInエッジコレクション(年プロパティ付き)を指定します-

*[俳優] <-演技-> [映画]*

どのように取得しますか-

  • 「movie1」または「movie2」で演技したすべての俳優ですか?
  • 「movie1」と「movie2」の両方で演技したすべての俳優は?
  • 「actor1」と「actor2」の間のすべての一般的な映画は?
  • 3本以上の映画に出演したすべての俳優は?
  • ちょうど6人の俳優が出演したすべての映画ですか?
  • 映画による俳優の数は?
  • 俳優による映画の数は?
  • 2005年から2010年の間に俳優が演じた映画の数は?

溶液

上記のクエリに対する解答を取得する過程で、Arangoshを使用してデータセットを作成し、クエリを実行します。 AQLクエリはすべて文字列であり、Arangoshの代わりにお気に入りのドライバーに簡単にコピーできます。

Arangoshでテストデータセットを作成することから始めましょう。 まず、C:%5CApache24%5Chtdocs%5Carangodb%5Cdataset.js [このファイル]をダウンロードします−

# wget -O dataset.js
https://drive.google.com/file/d/0B4WLtBDZu_QWMWZYZ3pYMEdqajA/view?usp=sharing

出力

...
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘dataset.js’
dataset.js [ <=> ] 115.14K --.-KB/s in 0.01s
2017-09-17 14:19:12 (11.1 MB/s) - ‘dataset.js’ saved [117907]

上記の出力から、JavaScriptファイル* dataset.js。がダウンロードされていることがわかります。このファイルには、データベースにデータセットを作成するためのArangoshコマンドが含まれています。 コマンドを1つずつコピーして貼り付ける代わりに、Arangoshで-javascript.execute *オプションを使用して、複数のコマンドを非対話的に実行します。 命の恩人のコマンドと考えてください!

今シェルで次のコマンドを実行します-

$ arangosh --javascript.execute dataset.js

シェルのコマンド

上記のスクリーンショットでわかるように、プロンプトが表示されたらパスワードを入力します。 これでデータが保存されたので、AQLクエリを作成して、この章の最初に挙げた特定の質問に答えます。

最初の質問

最初の質問を見てみましょう:「movie1」または「movie2」で演技したすべての俳優。 「TheMatrix」または「TheDevilsAdvocate」で行動したすべての俳優の名前を見つけたいとします-

私たちは俳優の名前を取得するために一度に1つの映画から始めます-

127.0.0.1:8529@_system> db._query("FOR x IN ANY 'movies/TheMatrix' actsIn
OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN x._id").toArray();

出力

私たちは次の出力を受け取ります-

[
   "actors/Hugo",
   "actors/Emil",
   "actors/Carrie",
   "actors/Keanu",
   "actors/Laurence"
]

最初の質問

今、私たちは解決策になる2つのNEIGHBORSクエリのUNION_DISTINCTを形成し続けます-

127.0.0.1:8529@_system> db._query("FOR x IN UNION_DISTINCT ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();

出力

[
   "actors/Charlize",
   "actors/Al",
   "actors/Laurence",
   "actors/Keanu",
   "actors/Carrie",
   "actors/Emil",
   "actors/Hugo"
]

最初の質問2

二番目の質問

2番目の質問を考えてみましょう:「movie1」と「movie2」の両方で演技したすべての俳優。 これは上記の質問とほとんど同じです。 しかし、今回はUNIONではなくINTERSECTIONに興味があります-

127.0.0.1:8529@_system> db._query("FOR x IN INTERSECTION ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();

出力

私たちは次の出力を受け取ります-

[
   "actors/Keanu"
]

2番目の質問

第三の質問

3番目の質問を考えてみましょう:「actor1」と「actor2」の間のすべての一般的な映画。 これは実際には、movie1とmovie2の一般的な俳優に関する質問と同じです。 開始頂点を変更するだけです。 例として、Hugo Weaving( "Hugo")とKeanu Reevesが共演しているすべての映画を見つけましょう-

127.0.0.1:8529@_system> db._query(
   "FOR x IN INTERSECTION (
      (
         FOR y IN ANY 'actors/Hugo' actsIn OPTIONS
         {bfs: true, uniqueVertices: 'global'}
          RETURN y._id
      ),

      (
         FOR y IN ANY 'actors/Keanu' actsIn OPTIONS
         {bfs: true, uniqueVertices:'global'} RETURN y._id
      )
   )
   RETURN x").toArray();

出力

私たちは次の出力を受け取ります-

[
   "movies/TheMatrixReloaded",
   "movies/TheMatrixRevolutions",
   "movies/TheMatrix"
]

第三の質問

4番目の質問

4番目の質問について考えてみましょう。 * 3本以上の映画に出演したすべての俳優*。 この質問は異なります。ここでは隣接関数を使用できません。 代わりに、エッジインデックスとグループ化にAQLのCOLLECTステートメントを使用します。 基本的な考え方は、 startVertex (このデータセットでは常にアクターです)によってすべてのエッジをグループ化することです。 次に、ここで俳優が演じた映画の数を含めたので、結果から3本未満の映画を持つすべての俳優を削除します-

127.0.0.1:8529@_system> db._query("FOR x IN actsIn COLLECT actor = x._from WITH
COUNT INTO counter FILTER counter >= 3 RETURN {actor: actor, movies:
counter}"). toArray()

出力

[
   {
      "actor" : "actors/Carrie",
      "movies" : 3
   },

   {
      "actor" : "actors/CubaG",
      "movies" : 4
   },

   {
      "actor" : "actors/Hugo",
      "movies" : 3
   },

   {
      "actor" : "actors/Keanu",
      "movies" : 4
   },

   {
      "actor" : "actors/Laurence",
      "movies" : 3
   },

   {
      "actor" : "actors/MegR",
      "movies" : 5
   },

   {
      "actor" : "actors/TomC",
      "movies" : 3
   },

   {
      "actor" : "actors/TomH",
      "movies" : 3
   }
]

第4質問

残りの質問については、クエリの形成について説明し、クエリのみを提供します。 リーダーは、Arangoshターミナルでクエリを実行する必要があります。

5番目の質問

5番目の質問を考えてみましょう:正確に6人の俳優が出演したすべての映画。 前のクエリと同じ考え方ですが、等価フィルタを使用します。 しかし、今では俳優の代わりに映画が必要なので、* _to属性*を返します-

db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter FILTER
counter == 6 RETURN movie").toArray()

映画による俳優の数は?

エッジのデータセット _to で映画に対応しているのを覚えているので、同じ _to が表示される頻度をカウントします。 これはアクターの数です。 クエリは以前のものとほとんど同じですが、COLLECTの後に* FILTERなし*

db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter RETURN
{movie: movie, actors: counter}").toArray()

6番目の質問

6番目の質問:*俳優による映画の数*を考えてみましょう。

上記のクエリの解決策を見つける方法は、このクエリの解決策も見つけるのに役立ちます。

db._query("FOR x IN actsIn COLLECT actor = x._from WITH COUNT INTO counter
RETURN {actor: actor, movies: counter}").toArray()

ArangoDB-デプロイ方法

この章では、ArangoDBをデプロイするさまざまな可能性について説明します。

展開:単一インスタンス

前の章の1つで、Linuxの単一インスタンス(Ubuntu)をデプロイする方法を既に学習しました。 Dockerを使用して展開を行う方法を見てみましょう。

展開:Docker

Dockerを使用してデプロイする場合、Dockerをマシンにインストールします。 Dockerの詳細については、https://www.finddevguides.com/docker/index [Docker]のチュートリアルを参照してください。

Dockerがインストールされると、次のコマンドを使用できます-

docker run -e ARANGO_RANDOM_ROOT_PASSWORD = 1 -d --name agdb-foo -d
arangodb/arangodb

Dockerバックグラウンドプロセスとして識別名 agdbfoo でArangoDBのDockerインスタンスを作成して起動します。

また、端末はプロセス識別子を出力します。

デフォルトでは、ポート8529はリクエストをリッスンするArangoDB用に予約されています。 また、このポートは、リンクしている可能性のあるすべてのDockerアプリケーションコンテナーで自動的に使用できます。