Amazon Web Services ブログ

Amazon Neptune、Amazon Comprehend Medical、および Tom Sawyer グラフデータベースブラウザを使用して COVID-19 の科学的研究を探索する

COVID-19 は人類に襲いかかった世界的な危機です。症状、治療法、危険因子など、ウイルスのあらゆる側面に関する識見を高めるために、大規模な研究が行われています。救援活動を支援するために、AWS は一般公開の COVID-19 データレイクを作成しました。これには、パンデミックとの戦いに役立つさまざまなデータセットが含まれています。詳細については、「COVID-19 データの分析用のパブリックデータレイク」と「AWS COVID-19 パブリックデータレイクの探索」を参照してください。

コロナウイルスに関するデータは研究用の出版物で大量に見つけることができます。データレイクのデータセットの 1 つは、このような出版物の大規模なコーパスで、アレン人口知能研究所が集約して更新しています。問題は、必要な情報を見つけて抽出する方法にあります。 この記事では、ナレッジグラフを用いてこの問題を解決する方法について説明します。

Amazon Neptune は、高速で信頼性が高い、完全マネージド型グラフデータベースサービスであり、高度に接続されたデータセットと連携するアプリケーションの構築と実行を容易にします。Neptune の中核にあるのは、何十億もの関係を保存し、ミリ秒単位のレイテンシーでグラフをクエリするために最適化された、専用の高性能グラフデータベースエンジンです。Neptune は、一般的なグラフモデルである Property Graph と W3C の RDF、およびそれぞれのクエリ言語である Apache TinkerPop Gremlin と SPARQL をサポートしています。これにより、高度に接続されたデータセットを効率的にナビゲートするクエリを簡単に構築できます。このチュートリアルでは、プロパティグラフを作成し、Apache TinkerPop Gremlin を使用してデータをクエリします。

高度に接続されたネットワークを評価するには、多くの場合それを見る必要があります。Neptune と合わせて使える優れたアプリケーションが、Tom Sawyer Software です。Tom Sawyer グラフデータベースブラウザでは、グラフデータベースに格納されているデータを簡単に表示して操作できます。これは、Amazon Simple Storage Service (Amazon S3) から Neptune にデータを直接インポートできるエンドツーエンドの視覚化アプリケーションであり、コマンドラインツールが不要になります。データベースに接続してすぐにデータの探索、グラフ要素のプロパティの検査、ノードとエッジの外観の変更をニーズに合わせて行えます。

グラフデータベースは、データを接続するのに優れています。これは、単に研究出版物を保存するだけでなく、意味的に重要なデータをリンクして、興味深い関連情報を明らかにするクエリを作成できます。この記事では COVID-19 Open Research Dataset を使用しています。これには、何万もの論文と、著者、発行日、ジャーナル、デジタルオブジェクト識別子などの関連メタデータが含まれています。一般的な著者や引用に基づいて論文をリンクできるため、このメタデータはグラフに適しています。

ただし、このユースケースでは、内容に基づいて論文をリンクする必要があります。意味的に論文をリンクするのは難がありますが、幸い、必要なものを正確に提供するツールがあります。Amazon Comprehend Medical は、機械学習を使用して非構造化テキストから関連する医療情報を簡単に抽出できる、自然言語処理サービスです。Amazon Comprehend Medical を使用して、Amazon Comprehend Medical 分析エンドポイントを介して各論文のテキストに対する操作を実行することにより、すべての論文から抽出された概念でグラフデータを充実させることができます。グラフデータベースをセットアップしたら、データを使用する準備が整います。

ソリューションのアーキテクチャ

次の表は、グラフスキーマのノードと説明をまとめたものです。

ノード 説明
論文 データセットからの論文。
著者 論文の著者。
機関 著者が所属する機関。
概念 Amazon Comprehend Medical から返されたエンティティ。
トピック マルチラベル分類子を使用して論文に対する操作を実行したことで返される分類。トピックは、10 の潜在的なトピックの事前定義されたオントロジーから割り当てられます。

次の表は、グラフスキーマのエッジ情報をまとめたものです。

エッジ名 ソースノード 宛先ノード エッジの重み
「affiliated_with」 著者 機関
「associated_concept」 論文 概念 Amazon Comprehend Medical 信頼スコア
「authored_by」 論文 著者
「cites」 論文 論文
「associated_topic」 論文 トピック Amazon Comprehend Medical 信頼スコア

このソリューションには、3 つの主要コンポーネントが含まれています。Neptune データベース、データの処理と取り込み、およびナレッジグラフとの 2 つのインターフェイス方法です。

次の図は、ソリューションのアーキテクチャを示しています。

データを処理して取り込むには、次の手順を実行します。

  1. データが S3 バケットに追加されます。
  2. このイベントは、データをロードして処理を開始する AWS Lambda 関数をトリガーします。
  3. データは重複排除され、グラフに追加された PaperAuthor、および Institution ノードの関連メタデータが抽出されます (たとえば、titleauthors、および publish_time)。
  4. すべての論文の全文は Amazon Comprehend Medical に送られます。Amazon Comprehend Medical は一連のエンティティ (グラフでは概念と呼ばれます) を返します。これは、その論文に存在する意味的な情報を表します。
  5. また、データはマルチラベル分類子を介して送信され、各論文の意味情報のリストであるトピックを返します (アーキテクチャには表示されません)。トピックは概念に似ています。
  6. ノードとエッジは、Neptune が使用する形式に従って CSV として保存されます。詳細については、「Gremlin ロードデータ形式」を参照してください。
  7. Lambda 関数はデータを Amazon S3 に戻し、取り込めるようにします。

このデータ処理は非常にコストがかかり、さらに処理されたデータはすでにデータレイクで利用できます。Neptune API エンドポイントの 1 つに対して HTTPS リクエストを使用して、それをグラフに取り込みます。

Neptune データベースは、ライターと一連のリードレプリカで構成されるクラスターです。このユースケースでは、単一の読み取りインスタンスを持つ小さなクラスターを作成しますが、データベースの機能を拡張できます。詳細については、「DB クラスターへの Neptune レプリカの追加」を参照してください。

Neptune は常に VPC 内で起動され、アクセスに AWS Identity and Access Management (IAM) 認証を要求することで、セキュリティをさらに強化できます。

この Neptune グラフとやり取りするには、Tom Sawyer Software のグラフ視覚化ツールと、Amazon SageMaker でホストされている Jupyter ノートブックの 2 つの方法があります。この記事では、両方のインターフェイスについて見ていきます。

AWS CloudFormation を使用して Neptune グラフをデプロイする

最初に、ナレッジグラフを作成するために必要なデータベース (および関連するネットワークインフラストラクチャ) を作成します。また、後でクエリするために使用する Amazon SageMaker ノートブックインスタンスも同時に作成します。これは、この記事が提供する AWS CloudFormation テンプレートで実現します (起動テンプレート)。

この記事の執筆時点では、スタックは us-east-2 でのみ起動できます。

CloudFormation スタックは次のアクションを実行します。

  • Neptune DB クラスターを作成します。
  • プライベートおよびパブリックサブネットを持つ VPC をセットアップします。これにより、Neptune がインターネットにアクセスできるようになり、不正アクセスから保護されます。
  • Amazon SageMaker ノートブックインスタンスを作成し、VPC 内の Neptune クラスターにアクセスする権限を付与します。スタックが完了すると、Amazon SageMaker コンソールの [ライフサイクル設定] セクションでライブラリを確認できます。これにより、グラフを簡単に操作できます。

スタックのデプロイには最大 10 分かかります。完了したら、AWS CloudFormation コンソールの [出力] タブで、ベーススタックを選択します。このタブの情報の一部は、チュートリアルの後半で必要になります。

これで、グラフデータを取り込む準備ができました。

Python および Amazon SageMaker ノートブックを使用してデータをグラフに取り込む

これらと同じ手順を使って、将来のデータセットを取り込むことができます。次の手順を実行します。

  1. Amazon SageMaker コンソールで、[ノートブックインスタンス] を選択します。
  2. 名前に「Neptune」を含むノートブックインスタンスを選択します。
  3. [Jupyter を開く] を選択します。
    読み込まれると、メニューバーにいくつかのノートブックが表示されます。
  4. ノートブックの [データの取り込み] を選択します。

最初のいくつかのセルでは、WebSocket を使用してグラフへの接続を作成する方法を確認できます。次のセルは、bulkLoad() という関数を実行します。この関数は、Neptune グラフに Amazon S3 の場所からデータをプルするように指示し、データをグラフにロードする最も速い方法です。このグラフのすべてのデータは、一般公開の COVID-19 データレイクに保存されています。

バルクロードセルを実行すると、ノートブックは HTTPS リクエストを Neptune クラスターに送信して、指定した Amazon S3 の場所に到達します。そしてそこに存在する適切にフォーマットされたデータをプルします。

リクエストが完了したら、ノートブックの下部までスクロールし、graph_status 関数を定義して実行する 2 つのセルを実行します。グラフ内のすべてのノードとエッジの数とタイプを確認します。

これらのノートブックを別のタブで開いたままにし、後でこのチュートリアルで使用します。これで、視覚化データを作成する準備が整いました。

Tom Sawyer Software で視覚化する

Tom Sawyer Graph データベースブラウザは、5 日間の無料トライアルから始まり、その後料金が発生します。詳細については、「Tom Sawyer Graph Database Browser for Amazon Neptune, Neo4j, & TinkerPop」を参照してください。登録解除はいつでも行えます。登録を解除すると、視覚化インスタンスは機能しなくなりますが、ノートブックからデータにアクセスすることはできます。

Tom Sawyer Graph データベースブラウザの設定

Tom Sawyer Graph データベースブラウザを設定するには、次の手順を実行します。

  1. AWS Marketplace の [Tom Sawyer Graph Database Browser for Amazon Neptune, Neo4j, & TinkerPop] に移動します。
  2. [Additional Resources] ペインで、[Graph Database Browser AIM Deployment Guide] を選択します。
  3. [Quick Start Instructions] の指示に従ってください
    • [Instance type] では、グラフに適したサイズを、希望するコストウィンドウ内で選択してください。
    • この記事では m5.4xlarge を使用していますが、t3.* ではクエリを実行することもできます。
    • インスタンスを起動するときは、インスタンスを起動する必要がある VPC とサブネットの CloudFormation スタックの [Outputs] タブを参照してください。
  1. アプリケーションに初めてアクセスしてサインインするには、[Using the Application] の手順に従ってください

データの接続

データを視覚化する前に、Neptune エンドポイント接続の詳細を指定する必要があります。次の手順を実行します。

  1. [Graph Database Browser Databases] ページから、[Add Database] を選択します。
  2. [Vendor] では、[Amazon] を選択します。
    Neptune は、[Database] フィールドに自動的に入力されます。
  3. データベースの名前を入力します (例: Covid19)。
  4. [Save] をクリックします。
  5. [Databases] ページで、Covid19 データベースを選択します。
  6. [Actions] ドロップダウンメニューから、[Connections] を選択します。
  7. [Add connections] を選択します。
  8. [New connection] ページで、データベースの次の接続の詳細を入力します。
    クエリ言語 Gremlin
    プロトコル ウェブソケット
    クラスターエンドポイント AWS CloudFormation コンソールでベーススタックを選択し、[Outputs] タブを選択します。[DBClusterEndpoint] の値をコピーして、ここに入力します。
    ポート番号 8182
    IAM DB 認証 この記事では、この選択を解除したままにします。IAM 認証を使用する場合、特定の AWS アクセスキー ID、AWS シークレットアクセスキー、およびサービスリージョンへのアクセスを制限できます。
    SSL このチェックボックスを選択します。
  9. [Save] をクリックします。
  10. データベースに接続してデータの閲覧を開始するには、[Actions] と [Connect] を選択します。
    次のスクリーンショットは、Gremlin クエリを実行した後の Tom Sawyer Graph データベースブラウザを示しています。
    Query ビューを使用してクエリを入力し、実行してデータを視覚化できるようになりました。

Gremlin トラバーサル言語を使用する

Gremlin はグラフデータベースのクエリ言語です。これにより、グラフを横断するクエリを作成し、必要に応じてエッジとノードをフィルタリングおよびソートできます。クエリの作成の詳細については、「PRACTICAL GREMLIN: An Apache TinkerPop Tutorial」を参照してください。Gremlin の使用を開始するには、以下の手順を実行します。

  1. [Settings] ツリービューで、[Result Limit Per Loading] を選択します。
  2. 500」と入力します。
    この手順により、クエリが十分な結果を返すことが保証されます。
  3. 次のコードを入力します。
    g.V().hasLabel('Topic').in('associated_topic').bothE()

    このクエリは、Topic というラベルの付いたすべてのノードを探し、接続されているすべての Paper ノードを見つけて、その Paper ノードにアタッチされているエッジを探します。

  4. [Load Data] を選択します。
    次のスクリーンショットは、出力を視覚化したものです。グラフデータは継続的に更新されるため、このスクリーンショットは実際の結果と異なる場合があります。

Tom Sawyer ソフトウェアを使用するためのヒント

Tom Sawyer ソフトウェアを使用する場合、次のヒントが役立つかもしれません。

  • 新しいクエリをそれぞれ実行する前に、[Clear All] を選択して、前のクエリからグラフビューのすべての要素をクリアします。
  • クエリは、bothEinE、または outE などのエッジコンポーネントで終了するときに最適に機能します。
  • クエリエディタは構文の強調表示を提供し、クエリの読み書きを容易にします。Gremlin クエリの場合は、Ctrl + Space またはピリオドキーを使用して、式のオートコンプリートリストにアクセスします。各式にカーソルを合わせると、各式に関するツールチップが表示されます。式を選択するには、式を決めて入力された文字列の最後に () を入力します。
  • デフォルトのノード制限を変更するには、[General] で、グラフをクリアして現在のデフォルト数を選択し、変更します。開始するときは、制限を 500 に変更することをお勧めします。
  • デフォルトのテンプレートはグラフ要素の外観を設定しますが、ノードを選択 (右クリック) し、[Edit Appearance Rule] を選択することで、テキストの色、フォント、タイプ (ノードの形状)、色などの設定を変更できます。上記のグラフの視覚化では、ノードタイプが変更されています。
  • ズームオプションを使用して著者の詳細を表示し、特定の著者に関連付けられた教育機関を確認するには、(右クリックで) 著者を選択して、[Load Neighbors] をクリックします。他のノードの近傍をロードして、グラフを段階的に展開し、データを調べてみましょう。

追加のクエリ

事前定義されたセットから引き出された関連する概念を持つすべての Paper ノードを検索するには、次のコードを入力します。

g.V().hasLabel('Paper').outE('associated_concept').inV().has('concept', within('infection', 'strain', 'IL-6', 'hiv', 'death', 'died', 'coronavirus', 'respiratory syndrome', 'viral infection', 'lung', 'infect', 'fever')).inE('associated_concept')

すべての Institution ノードとそれらに関連する Author ノードを見つけるには、次のコードを入力します。

g.V().hasLabel('Institution').in().outE()

Paper ノードが 20 未満のすべての Concept ノードを検索し、接続されているすべての論文を表示するには、次のコードを入力します。

g.V().hasLabel('Concept').where(in().count().is(lt(20))).limit(50).inE('associated_concept')

データ探索のためのノートブックからの Gremlin クエリ

ノートブックから Gremlin を使用するのは、Tom Sawyer Graph データベースブラウザで使用するのとは少し異なります。すべてのクエリは、bothE または inE ではなく、terminal step で終了する必要があります。最終ステップのリストには、.next().iterate().toList()、および .toSet() が含まれます。完全なリストについては、「PRACTICAL GREMLIN: An Apache TinkerPop Tutorial」を参照してください。

ノートブックから Gremlin クエリを使用するには、メニュー [Gremlin Queries] からノートブックを開きます。ノートブックでクエリを試して、グラフで何ができるかをよりよく理解することができます。

Gremlin は、プロファイリングツールを使用してクエリのパフォーマンスを測定する方法も提供します。プロファイリングツールを使用するには、クエリを起動する前に %%gremlin profile マジックを呼び出します。次のコード例を参照してください。

%%gremlin profile

g.V().hasLabel('Paper').filter(__.and_(
    __.out().has('Concept', 'concept', within('COVID-19', 'coronavirus', 'Coronaviridae', 'coronaviridae', 'Coronavirus', 'covid-19')),
    __.out().has('Concept', 'concept', within('highrisk groups', 'high-risk groups', 'biorisk management', 'control of metabolic risk factors', 'high risk groups', 'elderly', 'infected elderly',
    'smoking-related illnesses', 'type-2 diabetes', 'type I diabetes', 'type II diabetes', 'respiratory disease',
    'diabetes', 'diabetes-like syndrome', 'hepatitis', 'Hepatitis', 'Hepatitis C virus', 'respiratory syndrome', 'gastrointeritis virus'))
    )).order().by(__.out().hasLabel('Author').in_().hasLabel('Paper').out().has('Concept', 'concept', within('COVID-19', 'coronavirus', 'Coronaviridae', 'coronaviridae', 'Coronavirus', 'covid-19')).count(), decr).limit(10).values('title').toList()

上記のコードは、COVID-19 とリスク要因に関連する論文を見つけ、著者のプロフィールのランクに基づいて論文を順序付ける複雑なクエリです。プロファイリングツールを使用すると、Neptune がクエリを処理する際に最も時間が費やされる場所を確認できます。[Gremlin Profile] を選択して別の例を試し、クエリの最適化によってどれほど多くの時間を節約できるかを確認できます。

Amazon Comprehend Medical による分析

中間コネクタと同じ概念を使用することにより、ナレッジグラフ内で論文を相互に関連付けることができます。同じ概念の多くを共有する論文は互いに関連している可能性があります。次の図は、2 つの論文間の関係を示しています。

論文は類似関係のネットワークを形成します。これを使用して、適切に定式化されたクエリを使ってお勧めの論文を知ることができます。前の図に示すように、Gremlin を使用して論文をリンクしてみることができます (これは、このトピックに関する今後の記事で扱います)。

クリーンアップ

完了したら、追加料金が発生しないように、作成したリソースを削除する必要があります。

  1. AWS CloudFormation コンソールで、ベーススタックを削除します (これにより、ネストされたスタックとリソースが自動的に削除されます)。
  2. Tom Sawyer Graph データベースブラウザインスタンスを削除するには、AWS Marketplace ウェブサイトで、Tom Sawyer Graph データベースブラウザへのサブスクリプションをキャンセルします。
  3. Amazon Elastic Compute Cloud (Amazon EC2) コンソールで、[Actions] を選択します。
  4. Tom Sawyer Graph データベースブラウザが実行されたインスタンスを選択します。
  5. [Terminate] を選択します。

まとめ

この記事では、グラフデータベースと高度に接続されたデータの使用法について説明しました。この記事で CloudFormation スタックを起動し、クエリを作成することでどのような回答が得られるかを確認できます。

Neptune での Gremlin の使用に関する詳細については、「Accessing the Neptune Graph with Gremlin」を参照してください。Covid ナレッジグラフを使用した分析の詳細については、「AWS COVID-19 ナレッジグラフの作成とクエリ」を参照してください。Amazon SageMaker ノートブックでの Neptune の使用の詳細については、「Amazon SageMaker Jupyter Notebooks を使用して Amazon Neptune グラフを分析する」を参照してください。

この記事についてのご質問やご意見は、コメント欄にお寄せください。

 


著者について

 

George Price は、Amazon Machine Learning Solutions Lab の深層学習アーキテクトで、AWS のお客様のためにモデルとアーキテクチャの構築を支援しています。以前は、Amazon Alexa のソフトウェアエンジニアでした。

 

 

 

Colby Wise は、Amazon Machine Learning Solutions Lab のデータサイエンティスト兼マネージャーで、さまざまな業界の AWS のお客様が AI とクラウドの導入を加速するのを支援しています。

 

 

 

Miguel Romero は、Amazon Machine Learning Lab のデータサイエンティストで、AWS のお客様が AI とクラウド機能を使用してビジネス上の問題に対処するのを支援しています。最近では、スポーツとヘルスケア業界向けの CV と NLP ソリューションを構築しました。

 

 

 

Ninad Kulkarni は、Amazon Machine Learning Solutions Lab のデータサイエンティストです。ビジネス問題に対処するためのソリューションを構築することにより、お客様が機械学習および AI ソリューションを採用するのを支援しています。最近では、ファンのエンゲージメントを向上させるために、画面上の使用量に関してスポーツ業界のお客様向けの予測モデルを構築しました。