こんにちは、篠﨑です。
Amazon Neptuneについて触ってみました。 最初のとっかかりが分かりにくいなぁと思った方が少しハードルを低くする手助けになれば幸いです。
「ドキュメント通りAmazon Neptune作ってみたけど、実際どうやって使うの??」という方向けです。 クエリの詳細について深くは触れません。 もっと詳しく知りたいと思った方は公式ドキュメントをご確認ください。
目標
基本的なgremlinのクエリを使えるようになることを目標に触っていきます。 ということで、数記事にわたって下記3点に絞っていろいろやってみたいと思います。
- データの挿入
- データの取得
- 可視化
今回はデータの挿入部分とその準備部分をやっていきます。
やること
とはいえ、データとかサンプルで拾ってきてやるのもなぁと思ったので、サーバーワークスの人ってどんなカテゴリーでブログ書いているの??を題材にデータの作成や可視化をやっていきます。 プロフィールがあるので、その名前で書いてみようかと思ったのですが、一応名前は伏せてます。 あれ、このユーザーってあの人では???と予想してみてもいいかもしれないですね、!
データに関して注意点です。 今回、ユーザー同士のつながりがあったほうが、グラフ的に見てて面白そうということで、「フォロー」というSNS的な要素を入れています。 完全にフィクションですので、あまり気にせず、「こういう風にみえるのかぁ」とただのグラフとしてみてください。
また、データは本ブログを書いた時点でカテゴリーのついているブログで最新50件を抽出しています。
ということで、ゴールはサーバーワークスの人がどんなカテゴリーでブログを書いているのか、可視化するです! 今回はその中でも準備部分とデータを入れるところまで行います。 しばらくお付き合いください!
前提条件
今回はAWS Management ConsoleのNotebookからGremlinを利用したコマンドと、AWS CLI (S3のみ) から操作をします。
構成図
今回行った環境は以下の通りです
簡単ですが、設定のご紹介です
- Amazon Neptune
- DB Instance Size: db.t3.medium
- Engine Version: 1.0.5.1
- IAM Role : AmazonS3ReadOnlyAccess ポリシー (AWS Managerd Policy)を付与したロール
- Jupyter Notebook
- 上記Amazon Neptuneに紐づいたNotebook
- ロールはデフォルトのまま
- EC2
- Amazon Linux2
- S3の操作 (cp)・Neptuneのエンドポイントへデータの転送を行います
- AWS Management Console
- AWSのブラウザから開くコンソールです。
- [Amazon Neptune] > [Notebooks] > 対象のNotebookを選択 > [ノートブックを開く] と遷移できれば前提条件完了です。
※ Amazon Neptuneに関連付けられているIAM RoleとS3エンドポイントについては公式ドキュメントをご参照ください。
省略するところ
今回はクエリでの操作をするチュートリアルですので、以下の点は省略せていただきます。
- Amazon Neptuneの構築・起動
- Notebookの作成・起動
- EC2やVPC等の構築
Neptuneの構築については弊社ブログにもございますので、ご参照いただければと思います。
ということで、最初はNotebookを開いたところからスタートします!!
手順
データの準備
今回は、Gremlinのコマンドで入れるパターンとS3からデータを入れるパターンの2パターンから入れます。
コマンドでの入れ方は後ほど解説しますが、S3から入れる場合、下記リンクを参考に準備します。
CSVファイルなので、エクセルで操作する方が多いかと思いますが、 空白のセルがあると入らないことがありました。最後にメモなどで空白のセルがないか確認してからアップロードに挑戦してみてください。
今回は下記のようなデータ (CSVファイル) を準備しました。
Followの関係を表すデータ
~id,~label,~from,~to 15to12,Follow,15,12 5to8,Follow,5,8 4to8,Follow,4,8 5to2,Follow,5,2 ...
カテゴリー一覧
~id,~label,name:string interest1,Interest,AWS Lambda interest2,Interest,Amazon RDS interest3,Interest,RDS Proxy interest4,Interest,AWS Cost Explorer ...
サーバーワークスの人同士の関連付け
~id,~label,~from,~to interest1135,Interest,1,interest79 interest1272,Interest,1,interest80 interest1370,Interest,1,interest24 interest131,Interest,1,interest34 ...
※ 完全なデータはこのブログの最後に載せます
Notebookで前準備
まず初めに、対象のノートブックを開き、新しくフォルダの作成・実行ファイルの作成を行います。
① Newをクリック
② Folderをクリック
③ Untitled Folderが作成されます
④ フォルダーに遷移
⑤ Newをクリック
⑥ Python3を選択
コードを入力できる画面に遷移します。
次に、Amazon Neptuneと正常に紐づいているかや、ステータスの確認を行います。
⑦下記コマンドを入力画面に入力してください。
%status
セルの左にある再生ボタンのようなマークをクリックすると実行することができます。
'status': 'healthy'
と出てくればOKです。
⑧上のほうにある+をクリックしてセルの追加をします。
⑨次に、下記コマンドを入力し、接続しているNeptuneの確認を行います
%%bash cat ~/graph_notebook_config.json
出力されたホストが作成しているAmaozn Neptuneの書き込みエンドポイントと一致することを確認してください。
"host": "{identifier}.cluster-**********.{region_id}.neptune.amazonaws.com",
念のためデータのクリアをします。
⑩ 下記コマンドを入力します
%%gremlin g.V().drop()
データの追加
今回追加するデータの種類は以下4種類を準備しました。
- User (サーバーワークスの人)
- Interest (カテゴリー)
- UserとInterestの関係 (何のカテゴリーで書いたか)
- User同士のフォロー (フォロー (フィクション))
初めにUserの追加をします。 便宜上、IDもこちらで指定してます。
下記コマンドを入れると21人分の情報が入ります。
%%gremlin g. addV('User').property('name', 'User1').property(id, '1'). addV('User').property('name', 'User2').property(id, '2'). addV('User').property('name', 'User3').property(id, '3'). addV('User').property('name', 'User4').property(id, '4'). addV('User').property('name', 'User5').property(id, '5'). addV('User').property('name', 'User6').property(id, '6'). addV('User').property('name', 'User7').property(id, '7'). addV('User').property('name', 'User8').property(id, '8'). addV('User').property('name', 'User9').property(id, '9'). addV('User').property('name', 'User10').property(id, '10'). addV('User').property('name', 'User11').property(id, '11'). addV('User').property('name', 'User12').property(id, '12'). addV('User').property('name', 'User13').property(id, '13'). addV('User').property('name', 'User14').property(id, '14'). addV('User').property('name', 'User15').property(id, '15'). addV('User').property('name', 'User16').property(id, '16'). addV('User').property('name', 'User17').property(id, '17'). addV('User').property('name', 'User18').property(id, '18'). addV('User').property('name', 'User19').property(id, '19'). addV('User').property('name', 'User20').property(id, '20'). addV('User').property('name', 'User21').property(id, '21'). next()
ちゃんと入ったのか確認してみましょう。
%%gremlin g.V()
下記のように21件でてくればOKです。
v[1] v[2] ...
名前も出るか見てみましょう
%%gremlin g.V().valueMap()
下のようにでればOKです。ちゃんと入ってそうですね
{'name': ['User1']} {'name': ['User2']} {'name': ['User3']}
今度はS3からデータを入れてみましょう
EC2には3つのファイルが入っています
- Follow.csv
- Interest.csv
- UserInterest.csv
EC2にデータを準備し、対象のS3バケットにコピーします
aws s3 cp ./Follow.csv s3://bucket-name/sample/ aws s3 cp ./Interest.csv s3://bucket-name/sample/ aws s3 cp ./UserInterest.csv s3://bucket-name/sample/
その後、EC2から下記コマンドを打ちます
※ URI部分にはAmazon Neptuneのエンドポイント、SourceはS3の場所等適宜埋めてお使いください。
このコマンドをsourceファイル部分を変えての個数分行います。
- UserInterest.csv
- Follow.csv
- Interest.csv
curl -X POST \ -H 'Content-Type: application/json' \ https://{database_identifier}-instance-1.*********.{region_id}.neptune.amazonaws.com:8182/loader -d ' { "source" : "s3://{bucket_name}/sample/UserInterest.csv", "format" : "csv", "iamRoleArn" : "arn:aws:iam::999999999999:role/RoleArn", "region" : "{region_id}", "failOnError" : "FALSE", "parallelism" : "MEDIUM", "updateSingleCardinalityProperties" : "FALSE", "queueRequest" : "TRUE" }'
その後、ノートブックに戻り、データが入っていることを確認します
%%gremlin g.V().valueMap()
個数が増えていればOKです。 次にFollowなどの辺の部分も確認します
%%gremlin g.E()
Consoleで出力が出ていればOKです。
ということで、今回はデータを追加するところまでやりましたので、終わりたいと思います。 サンプルのデータをCSV形式で(べた書きで申し訳ないですが)付録としていれてみましたので、 興味のある方は触ってみてください。
付録
Follow.csv
~id,~label,~from,~to 15to12,Follow,15,12 5to8,Follow,5,8 4to8,Follow,4,8 5to2,Follow,5,2 2to21,Follow,2,21 16to6,Follow,16,6 2to8,Follow,2,8 8to10,Follow,8,10 7to5,Follow,7,5 9to2,Follow,9,2 8to5,Follow,8,5 15to1,Follow,15,1 9to21,Follow,9,21 19to9,Follow,19,9 4to11,Follow,4,11 14to8,Follow,14,8 12to13,Follow,12,13 3to19,Follow,3,19 11to3,Follow,11,3 8to11,Follow,8,11 21to19,Follow,21,19 19to21,Follow,19,21 4to1,Follow,4,1 10to6,Follow,10,6 3to18,Follow,3,18 21to14,Follow,21,14 13to21,Follow,13,21 8to1,Follow,8,1 1to12,Follow,1,12 19to1,Follow,19,1 20to12,Follow,20,12 10to18,Follow,10,18 19to15,Follow,19,15 10to4,Follow,10,4 11to10,Follow,11,10 4to19,Follow,4,19 7to1,Follow,7,1 3to1,Follow,3,1 18to20,Follow,18,20 8to4,Follow,8,4 16to9,Follow,16,9 3to12,Follow,3,12 14to15,Follow,14,15 21to6,Follow,21,6 5to19,Follow,5,19 20to14,Follow,20,14 20to1,Follow,20,1 3to9,Follow,3,9 9to14,Follow,9,14 20to8,Follow,20,8 9to15,Follow,9,15 9to12,Follow,9,12 16to4,Follow,16,4 9to1,Follow,9,1 14to19,Follow,14,19 1to14,Follow,1,14 19to14,Follow,19,14 6to7,Follow,6,7 4to21,Follow,4,21
Interest.csv
~id,~label,name:string interest1,Interest,AWS Lambda interest2,Interest,Amazon RDS interest3,Interest,RDS Proxy interest4,Interest,AWS Cost Explorer interest5,Interest,コスト削減 interest6,Interest,Amazon RDSOracle interest7,Interest,AWS Network Firewall interest8,Interest,AWS Amplify interest9,Interest,GitHub interest10,Interest,Amplify Hosting interest11,Interest,CI/CD interest12,Interest,AWS interest13,Interest,Amazon Athena interest14,Interest,PCI DSS interest15,Interest,DNS interest16,Interest,EC2 interest17,Interest,セキュリティ interest18,Interest,Amazon GuardDuty interest19,Interest,AWS Budgets interest20,Interest,AWS Systems Manager interest21,Interest,初心者向け interest22,Interest,プログラミング interest23,Interest,読書感想文 interest24,Interest,AWS Site-to-Site VPN interest25,Interest,AWS Compute Optimizer interest26,Interest,AWS CLI interest27,Interest,Amazon EventBridge interest28,Interest,Serverless Framework interest29,Interest,資格試験 interest30,Interest,メール interest31,Interest,基礎から学ぶ interest32,Interest,IAM interest33,Interest,環境構築 interest34,Interest,Amazon WorkSpaces interest35,Interest,認証・認可 interest36,Interest,Active Directory interest37,Interest,LINE interest38,Interest,pytest interest39,Interest,python interest40,Interest,s3 interest41,Interest,Amazon S3 interest42,Interest,Amazon QuickSight interest43,Interest,ログ管理 interest44,Interest,Amazon Linux interest45,Interest,Amazon Linux2 interest46,Interest,AWS Transit Gateway interest47,Interest,AWS Resource Access Manager interest48,Interest,Amazon ECS interest49,Interest,AWS CloudFormation interest50,Interest,AWS Chatbot interest51,Interest,AWS Security Hub interest52,Interest,Amazon SNS interest53,Interest,re:Invent 2021 interest54,Interest,ログ管理s3 interest55,Interest,Amazon API Gateway interest56,Interest,Amazon Cognito interest57,Interest,Amazon DynamoDB interest58,Interest,負荷テスト interest59,Interest,Windows interest60,Interest,AWS Direct Connect interest61,Interest,Cloud Automator interest62,Interest,Amazon VPC interest63,Interest,Amazon VPC Network Access Analyzer interest64,Interest,構築可能なインスタンスタイプ interest65,Interest,アップデート interest66,Interest,Amazon Redshift interest67,Interest,トラブルシューティング interest68,Interest,WafCharm interest69,Interest,AWS WAF interest70,Interest,AWSALBAWS interest71,Interest,AWS AppSync interest72,Interest,AWS Shield interest73,Interest,Amazon OpenSearch interest74,Interest,Amazon CloudHSM interest75,Interest,翻訳 interest76,Interest,AI interest77,Interest,Amazon SageMaker interest78,Interest,機械学習
UserInterest.csv
~id,~label,~from,~to interest1255,InterestedIn,1,interest59 interest1132,InterestedIn,1,interest58 interest139,InterestedIn,1,interest36 interest131,InterestedIn,1,interest34 interest1370,InterestedIn,1,interest24 interest1566,InterestedIn,1,interest16 interest1271,InterestedIn,1,interest12 interest2485,InterestedIn,2,interest14 interest2539,InterestedIn,2,interest13 interest220,InterestedIn,2,interest12 interest2880,InterestedIn,2,interest1 interest3953,InterestedIn,3,interest49 interest390,InterestedIn,3,interest48 interest333,InterestedIn,3,interest3 interest3340,InterestedIn,3,interest2 interest3413,InterestedIn,3,interest1 interest4703,InterestedIn,4,interest69 interest454,InterestedIn,4,interest68 interest4804,InterestedIn,4,interest67 interest4204,InterestedIn,4,interest66 interest4416,InterestedIn,4,interest65 interest4207,InterestedIn,4,interest64 interest4351,InterestedIn,4,interest6 interest4623,InterestedIn,4,interest53 interest4685,InterestedIn,4,interest41 interest4585,InterestedIn,4,interest4 interest4264,InterestedIn,4,interest29 interest4446,InterestedIn,4,interest25 interest437,InterestedIn,4,interest20 interest4659,InterestedIn,4,interest19 interest4883,InterestedIn,4,interest18 interest4138,InterestedIn,4,interest17 interest424,InterestedIn,4,interest16 interest4603,InterestedIn,4,interest12 interest5784,InterestedIn,5,interest7 interest5175,InterestedIn,5,interest47 interest5289,InterestedIn,5,interest46 interest5688,InterestedIn,5,interest4 interest569,InterestedIn,5,interest12 interest6941,InterestedIn,6,interest9 interest6338,InterestedIn,6,interest8 interest6323,InterestedIn,6,interest43 interest6362,InterestedIn,6,interest41 interest6710,InterestedIn,6,interest11 interest6809,InterestedIn,6,interest10 interest7957,InterestedIn,7,interest17 interest7881,InterestedIn,7,interest16 interest7448,InterestedIn,7,interest15 interest7454,InterestedIn,7,interest12 interest8986,InterestedIn,8,interest63 interest8374,InterestedIn,8,interest62 interest8278,InterestedIn,8,interest53 interest8727,InterestedIn,8,interest23 interest8622,InterestedIn,8,interest22 interest8816,InterestedIn,8,interest21 interest8631,InterestedIn,8,interest12 interest9196,InterestedIn,9,interest26 interest10465,InterestedIn,10,interest28 interest10540,InterestedIn,10,interest27 interest10439,InterestedIn,10,interest1 interest11726,InterestedIn,11,interest60 interest11377,InterestedIn,11,interest33 interest11461,InterestedIn,11,interest32 interest11745,InterestedIn,11,interest31 interest11467,InterestedIn,11,interest30 interest11113,InterestedIn,11,interest21 interest12486,InterestedIn,12,interest39 interest12534,InterestedIn,12,interest38 interest12105,InterestedIn,12,interest37 interest13591,InterestedIn,13,interest45 interest13977,InterestedIn,13,interest44 interest14878,InterestedIn,14,interest8 interest1572,InterestedIn,15,interest52 interest15641,InterestedIn,15,interest51 interest15528,InterestedIn,15,interest50 interest15921,InterestedIn,15,interest27 interest15306,InterestedIn,15,interest17 interest15298,InterestedIn,15,interest12 interest16389,InterestedIn,16,interest57 interest16382,InterestedIn,16,interest56 interest16826,InterestedIn,16,interest55 interest16511,InterestedIn,16,interest35 interest16490,InterestedIn,16,interest28 interest16197,InterestedIn,16,interest26 interest16976,InterestedIn,16,interest1 interest17173,InterestedIn,17,interest53 interest1779,InterestedIn,17,interest41 interest17988,InterestedIn,17,interest12 interest17410,InterestedIn,17,interest12 interest18371,InterestedIn,18,interest61 interest19763,InterestedIn,19,interest75 interest19824,InterestedIn,19,interest74 interest19996,InterestedIn,19,interest73 interest19633,InterestedIn,19,interest72 interest19418,InterestedIn,19,interest71 interest19751,InterestedIn,19,interest70 interest19747,InterestedIn,19,interest69 interest19893,InterestedIn,19,interest55 interest19997,InterestedIn,19,interest17 interest19695,InterestedIn,19,interest12 interest19846,InterestedIn,19,interest1 interest19414,InterestedIn,19,interest1 interest20658,InterestedIn,20,interest65 interest2064,InterestedIn,20,interest29 interest20611,InterestedIn,20,interest12 interest21533,InterestedIn,21,interest78 interest21876,InterestedIn,21,interest77 interest21247,InterestedIn,21,interest76 interest21649,InterestedIn,21,interest53 interest2161,InterestedIn,21,interest12