Amazon Web Services ブログ

完全に自動化されたユーティリティを使用した Neo4j グラフデータベースの Amazon Neptune への移行



Amazon Neptune は、完全マネージド型グラフデータベースサービスであり、高度に接続されたデータセットと連携するアプリケーションの構築と実行を容易にします。Neo4j などの既存のセルフマネージドのグラフデータベースからデータを移行する場合、サービス専用の高性能で、高速かつスケーラブルな、信頼性の高いグラフデータベースエンジンのメリットを享受できます。

この投稿では、Neptune ツールの GitHub リポジトリから neo4j-to-neptune コマンドラインユーティリティを利用するサンプル AWS CDK アプリを使用して、Neo4j から Amazon Neptune に移行する方法を示します。サンプルアプリは次のタスクを完了します。

  • Neo4j および Amazon Neptune データベースをセットアップおよび設定する
  • Neo4j のウェブサイトのサンプルプロジェクトから映画のグラフを CSV ファイルとしてエクスポートする
  • neo4j-to-neptune ユーティリティを使用して、エクスポートされたデータを Amazon Neptune のバルクロード用 CSV 形式に変換する
  • 変換されたデータを Amazon Neptune にインポートする

アーキテクチャ

次のアーキテクチャは、疎結合アプリを構築して移行するために必要な構成要素を示しています。アプリは、次のリソースの作成を自動化します。

  • Neo4j グラフデータベースをダウンロードしてインストールするための Amazon EC2 インスタンス、および Amazon Neptune にクエリを実行するための Apache TinkerPop Gremlin コンソール。このインスタンスは、移行元としても、エクスポートされたファイルを Amazon S3 バケットにコピーして Amazon Neptune にデータをロードするなどの AWS CLI コマンドを実行するクライアントとしても機能します。
  • Neptune にデータをロードするための Amazon S3 バケット。
  • 1 つのグラフデータベースインスタンスを持つAmazon Neptune DB クラスター

移行の実行

Git は、GitHub リポジトリから AWS CDK アプリのクローンを作成します。前提条件を満たしていることを確認したら、そこに記載されている手順に従って移行を実行します。

アプリは、Neo4j の映画のグラフデータベースの Amazon Neptune への移行を自動化します。アプリを正常に実行すると、端末に次のスクリーンショットのような出力が表示されます。

後のステップで使用するために、NeptuneEndpoint などの値を記録します。

アプリは Neo4j および Amazon Neptune データベースをプロビジョニングし、移行を実行します。次のセクションでは、アプリが移行をプロビジョニングして実行する方法について説明し、移行を検証するために、EC2 インスタンスで Gremlin コンソールを使用して Neptune にクエリを実行する方法を示します。

移行の概要

AWS CDK アプリは、移行の 3 つの重要なフェーズを自動化します。

  1. AWS インフラストラクチャをプロビジョニングする
  2. 移行の準備をする
  3. 移行を実行する

AWS インフラストラクチャをプロビジョニングする

アプリを実行すると、AWS アカウントに次のリソースが作成されます。

Amazon VPC およびサブネット

アプリは VPCID で示される Amazon VPC を作成します。VPC で Neptune クラスターを作成する必要があり、その VPC 内のエンドポイントにのみアクセスできます。Neptune データベースにアクセスするために、アプリは、同じ VPC で実行される EC2 インスタンスを使用してデータをロードし、クエリを実行します。2 つの /24 パブリックサブネットを、2 つのアベイラビリティーゾーンのそれぞれに 1 つずつ作成します。

EC2 インスタンス

EC2Instance で示される単一の EC2 インスタンスは、次の機能を実行します。

  • Neo4j コミュニティ版グラフデータベース (バージョン `4.0.0`) をダウンロードしてインストールする
  • AWS CLI コマンドを実行して、ローカルファイルを Amazon S3 にコピーする
  • AWS CLI コマンドを実行して、データを Neptune にロードする
  • Apache TinkerPop Gremlin コマンドを実行して、Neptune へのデータ移行に対してクエリを実行し、検証する

S3 バケット

アプリは、S3BucketName で示される単一の S3 バケットを作成し、Neo4j からエクスポートされたデータを保持します。アプリは、バケットから Neptune へのこのデータのバルクロードをトリガーします。

Amazon S3 ゲートウェイ VPC エンドポイント

アプリは、VPC 内のパブリックサブネットに Neptune データベースクラスターを作成します。Neptune が Amazon S3 からデータにアクセスしてダウンロードできることを確認するために、アプリは、Amazon S3 のゲートウェイタイプの VPC エンドポイントも作成します。詳細については、「ゲートウェイ VPC エンドポイント」を参照してください。

単一ノードの Neptune クラスター

これは、この移行の移行先、つまり NeptuneEndpoint で示されるターゲットの Neptune グラフデータベースです。アプリは、エクスポートされたデータをこのデータベースにロードします。EC2 インスタンスで Gremlin コンソールを使用して、データをクエリできます。

必要な AWS IAM ロールおよびポリシー

AWS リソースへのアクセスを許可するために、アプリは、移行の実行に必要なすべての必要なロールおよびポリシーを作成します。

移行の準備

インフラストラクチャをプロビジョニングした後、アプリは、次の図に示す手順を自動化します。

Neo4j で映画のグラフを作成する

アプリは、ブートストラップシェルスクリプトを使用して、Neo4j コミュニティ版 4.0 を EC2 インスタンスにインストールおよび設定します。スクリプトは、Neo4j の映画のグラフをこのデータベースにロードします。

グラフデータを CSV ファイルにエクスポートする

アプリは、次の Neo4j Cypher スクリプトを使用して、すべてのノードおよび関係をカンマ区切りファイルにエクスポートします。

CALL apoc.export.csv.all('neo4j-export.csv', {d:','});

次のコードは、保存されたエクスポートファイルの場所を示しています。

/var/lib/neo4j/import/neo4j-export.csv

Neo4j 設定の自動化の一環として、アプリは、Neo4j からデータをエクスポートする手順を含む APOC ライブラリをインストールし、ディスク上のファイルに書き込むことができるように、次のコードで neo4j.conf ファイルを編集します。

apoc.export.file.enabled=true

また、アプリは、neo4j.conf ファイルにある Neo4j の APOC API をホワイトリストに登録して、それらを使用します。次のコードを参照してください。

dbms.security.procedures.unrestricted=apoc.*

移行の実行

このフェーズでは、アプリがデータを Neptune に移行します。これには、次の自動化された手順が含まれます。

Neo4j エクスポートデータを Gremlin ロードデータ形式に変換する

アプリは、neo4j-to-neptune コマンドラインユーティリティを使用して、エクスポートされたデータを単一のコマンドで Gremlin ロードデータ形式に変換します。次のコードを参照してください。

$ java -jar neo4j-to-neptune.jar convert-csv -i /var/lib/neo4j/import/neo4j-export.csv -d output --infer-types

neo4j-to-neptune ユーティリティは、出力フォルダを作成し、その結果を別々のファイルにコピーします。すなわち、頂点とエッジに 1 つずつです。ユーティリティには 2 つの必須パラメータがあります。すなわち、Neo4j エクスポートファイルへのパス (/var/lib/neo4j/import/neo4j-export.csv) と、変換された CSV ファイルが書き込まれるディレクトリの名前 (output) です。ノードと関係の複数値プロパティポリシーを指定し、データ型の推論をオンにすることができるオプションのパラメーターもあります。たとえば、--infer-types フラグは、各プロパティのデータ型を指定する代わりに、出力 CSV の各列でサポートされる最も狭い型を推測するようにユーティリティに指示します。詳細については、「Gremlin ロードデータ形式」を参照してください。

neo4j-to-neptune ユーティリティは、Neo4j および Neptune プロパティグラフデータモデルの違いに対処します。Neptune のプロパティグラフは、Neo4j のプロパティグラフと非常によく似ており、頂点の複数のラベルや複数値プロパティ (リストではなくセット) のサポートが含まれます。Neo4j では、重複する値を含む単純なタイプの同種リストがノードとエッジの両方のプロパティとして保存することを可能にします。他方で、Neptune は、頂点プロパティにセットおよび単一のカーディナリティを、エッジプロパティに単一のカーディナリティを、それぞれ提供します。neo4j-to-neptune ユーティリティは、重複する値を含む Neo4j ノードリストプロパティを Neptune 頂点プロパティに、Neo4j 関係リストプロパティを Neptune エッジプロパティに、それぞれ移行するポリシーを提供します。詳細については、GitHub リポジトリをご覧ください。

出力データを Amazon S3 にコピーする

エクスポートにより、edges.csv と vertices.csv の 2 つのファイルが作成されます。これらのファイルは、出力フォルダに格納されています。アプリは、これらのファイルを、この目的のために特別に作成された S3 バケットにコピーします。次のコードを参照してください。

$ aws s3 cp /output/ s3://<S3BucketName>/neo4j-data --recursive

Neptune へのデータのロード

自動化された移行の最後のステップでは、Neptune のバルクロード用 AWS CLI コマンドを使用して、エッジと頂点を Neptune にロードします。次のコードを参照してください。

curl -X POST \
    -H 'Content-Type: application/json' \
    <NeptuneLoaderEndpoint> -d '
    { 
      "source": "s3://<S3BucketName>/neo4j-data",
      "format": "csv", 
      "iamRoleArn": "arn:aws:iam::<AWSAccount>:role/<NeptuneTrustedS3Role>",
      "region": "<AWSRegion>",
      "failOnError": "FALSE"
    }'

詳細については、「Amazon Neptune へのデータのロード」を参照してください。

移行の検証

自動化された手順が完了すると、移行が成功したことを検証する準備が整います。

Amazon Neptune は、Apache TinkerPop3 および Gremlin 3.4.5 と互換性があります。これは、Neptune DB インスタンスに接続し、Gremlin トラバーサル言語を使用してグラフをクエリできることを意味します。

移行を検証するには、次の手順を実行します。

  1. 両方のステータスチェックに合格したら、EC2 インスタンスに接続します。
    詳細については、「ステータスチェックのタイプ」を参照してください。
  1. NeptuneEndpoint の値を使用して、次のコマンドを実行します。
    $ docker run -it -e NEPTUNE_HOST=<NeptuneEndpoint> sanjeets/neptune-gremlinc-345:latest
  2. プロンプトで次のコマンドを実行して、すべてのクエリを Amazon Neptune に送信します。
    :remote console
  3. 次のコマンドを実行して、移行された頂点の数を表示します。
    g.v() .count()

    次のスクリーンショットは、コマンド g.V().count() の出力を示しています。
    これで、トムクルーズが出演したすべての映画を提供する簡単なクエリなどを実行できます。次のスクリーンショットは、意図された出力を示しています。

クリーンアップ

移行を実行した後、次のコードでアプリが作成したすべてのリソースをクリーンアップします。

npm run destroy

まとめ

Neptune は、完全マネージド型グラフデータベースサービスです。これを利用することで、ハードウェアのプロビジョニング、ソフトウェアのパッチ、セットアップ、設定、バックアップなどのデータベース管理タスクについて心配することなく、お客様のための優れたアプリケーションの構築に集中することが容易になります。この投稿では、いくつかの簡単な手順で Neo4j データを Neptune に移行する方法を示しました。

 


著者について

 

Sanjeet Sahay 氏は、アマゾン ウェブ サービスのシニアパートナーソリューションズアーキテクトです。