Amazon Neptuneにデータを入れて可視化してみたい① ~準備・データ追加編~

記事タイトルとURLをコピーする

こんにちは、篠﨑です。

Amazon Neptuneについて触ってみました。 最初のとっかかりが分かりにくいなぁと思った方が少しハードルを低くする手助けになれば幸いです。

「ドキュメント通りAmazon Neptune作ってみたけど、実際どうやって使うの??」という方向けです。 クエリの詳細について深くは触れません。 もっと詳しく知りたいと思った方は公式ドキュメントをご確認ください。

tinkerpop.apache.org

docs.aws.amazon.com

目標

基本的なgremlinのクエリを使えるようになることを目標に触っていきます。 ということで、数記事にわたって下記3点に絞っていろいろやってみたいと思います。

  • データの挿入
  • データの取得
  • 可視化

今回はデータの挿入部分とその準備部分をやっていきます。

やること

とはいえ、データとかサンプルで拾ってきてやるのもなぁと思ったので、サーバーワークスの人ってどんなカテゴリーでブログ書いているの??を題材にデータの作成や可視化をやっていきます。 プロフィールがあるので、その名前で書いてみようかと思ったのですが、一応名前は伏せてます。 あれ、このユーザーってあの人では???と予想してみてもいいかもしれないですね、!

データに関して注意点です。 今回、ユーザー同士のつながりがあったほうが、グラフ的に見てて面白そうということで、「フォロー」というSNS的な要素を入れています。 完全にフィクションですので、あまり気にせず、「こういう風にみえるのかぁ」とただのグラフとしてみてください。

また、データは本ブログを書いた時点でカテゴリーのついているブログで最新50件を抽出しています。

ということで、ゴールはサーバーワークスの人がどんなカテゴリーでブログを書いているのか、可視化するです! 今回はその中でも準備部分とデータを入れるところまで行います。 しばらくお付き合いください!

前提条件

今回はAWS Management ConsoleのNotebookからGremlinを利用したコマンドと、AWS CLI (S3のみ) から操作をします。

構成図

今回行った環境は以下の通りです

f:id:swx-shinozaki:20220125150209p:plain
構成図

簡単ですが、設定のご紹介です

  • 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エンドポイントについては公式ドキュメントをご参照ください。

docs.aws.amazon.com

省略するところ

今回はクエリでの操作をするチュートリアルですので、以下の点は省略せていただきます。

  • Amazon Neptuneの構築・起動
  • Notebookの作成・起動
  • EC2やVPC等の構築

Neptuneの構築については弊社ブログにもございますので、ご参照いただければと思います。

Amazon Neptune の構築 - インスタンス

ということで、最初はNotebookを開いたところからスタートします!!

手順

データの準備

今回は、Gremlinのコマンドで入れるパターンとS3からデータを入れるパターンの2パターンから入れます。

コマンドでの入れ方は後ほど解説しますが、S3から入れる場合、下記リンクを参考に準備します。

CSVファイルなので、エクセルで操作する方が多いかと思いますが、 空白のセルがあると入らないことがありました。最後にメモなどで空白のセルがないか確認してからアップロードに挑戦してみてください。

docs.aws.amazon.com

今回は下記のようなデータ (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が作成されます

④ フォルダーに遷移

f:id:swx-shinozaki:20220125113254p:plain

⑤ Newをクリック

⑥ Python3を選択

f:id:swx-shinozaki:20220125113818p:plain

コードを入力できる画面に遷移します。

次に、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

篠﨑 勇輔(書いた記事を見る)

クラウドインテグレーション部 SRE2課

入社4年目