ナレッジグラフのRDFデータベースとSPARQLでの検索方法を解説

SCSK株式会社
R&Dセンター 技術開発部
中本 裕大 Yudai Nakamoto

本記事では、前回の『ナレッジグラフにアクセスする言語「SPARQL」とその使用例を解説』に引き続き、ナレッジグラフ(知識グラフ)を扱う上で必要となるデータベースと検索エンドポイントに焦点を当てて紹介します。前回の記事は、こちらをご参照ください。

ナレッジグラフの形式

ナレッジグラフは「RDF」形式と「プロパティグラフ」形式の2つで表現されます。
RDFは、エンティティに関する概念情報(オントロジー)を追加することによる意味情報の整理や、推論処理によるエンティティ・プロパティの予測・補完を容易に行うことができます。
一方、プロパティグラフは、プロパティに値を持たせエンティティ間の関係の強さを表現できます。例えば、プロパティグラフでは「△△太郎 ー 親密度(9) ー ○○花子」のような表現が可能となります。

RDF形式で表現されたナレッジグラフでは推論処理が可能となるという説明をしました。次節では、ナレッジグラフの推論機能を備えたRDFデータベースのオープンソースソフトウェアである「Virtuoso」について紹介します。

RDFデータベース ~Virtuoso~

RDFデータベースとは、RDF形式のナレッジグラフを格納し、検索クエリ言語SPARQLによるデータ処理機能を提供するデータベースであり、トリプルストア、RDFストアとも呼ばれています。代表例としてVirtuosoがあり、その他にもAllegro GraphやStardogなど様々なストアが存在します。
代表的なナレッジグラフを提供している各サイトでは、publicの検索エンドポイントも併せて公開されています。しかし、これらのサイトには検索上限をはじめ多くの制約があり、大規模ナレッジグラフを自由に検索するには適しません。
したがって、大規模ナレッジグラフを自由自在に扱う際には、RDFデータベースをローカル環境に導入し、ナレッジグラフを格納することを推奨します。

Virtuoso SPARQL Endpoint Quickstart は代表的なナレッジグラフの1つである「DBpedia」のコピーと検索環境をDocker上に簡単に用意できます。

virtuosoトップ画面

Virtuosoトップ画面のメニューバーから「sparql endpoint」を選択すると、検索画面が表示されます。検索画面において作成したナレッジグラフに対して問い合わせたい処理内容を記述します。
今回は、SCSKのURIである「http:ja.dbpedia.org/resource/SCSK」に対し、ナレッジグラフ上でどのようなラベル名が付与されているのかを調べます。

virtuosoでの検索

where句の一行目に検索したいトリプルパターンの基本構成を記述します。今回は、scskを主語としたトリプル(※1)を見つけたいので、「scsk ?p ?o」の構成になります。
続いて基本パターンに対して制約を設けます。基本パターンの状態では、scskを主語としたトリプルがすべて検索結果として取得されます。例えば、「scsk ー 所在地 ー 東京」、「scsk ー 親会社 ー 住友商事」などです。
今回はscskのラベル名を取得したいので、FILTERを使用し「?p」の候補からラベル名を表すURI以外を検索結果から除外します。
「rdfs:label」「foaf:name」はPREFIXを使用したURIの簡易記述になります。ナレッジグラフを構成する際に多用されるURIなどは、PREFIXを使用した短縮形のURIが用意されています。

上記を踏まえたうえで、SPARQLを実行した結果は次のようになります。
URIに対するラベル名の一覧が取得できていることが分かります。

virtuosoでの検索結果

RDFデータベースの手動での検索は、検索内容が少量であれば便利ですが、大量の問い合わせを処理する場合には適していません。例えば、上記の例においてラベル名を取得したいURIが1万件ある場合などです。
このような場合、プログラム側で検索エンドポイントを呼び出し、検索を自動化することができます。次節では、Pythonでの検索自動化について紹介します。

※1 トリプル: ナレッジグラフの表現に用いられる「RDF(Resource Description Framework)」形式では、主語、述語、目的語の3つの要素の関係を表現したものを「トリプル(triple)」と呼び、複数のトリプルを定義することでナレッジグラフを表現することが可能です。

プログラム処理によるSPARQL検索の自動化

Pythonで特定の検索エンドポイントに対してSPARQLを実行するには、SPARQLWrapperを使用します。
SPARQLWrapperを使用する際の基本的な流れは次のようになります。

  1. SPARQLWrapperに検索対象のエンドポイントを指定しインスタンス化する
  2. インスタンスに対してSPARQLクエリを設定する
  3. 検索を実行し、所望のフォーマットに変換する

Virtuosoで行った検索をSPARQLWrapperで実行する例は以下のようになります。

SPARQLWrapperを用いた検索コード
クエリ作成部分のコード

クエリ作成コードではuriを引数として渡し、「VALUES ?s {<uri>}」で主語を表す?sに対してuriの設定をしています。上記コードを実行した結果は以下のようになります。

SPARQLWrapperを使用した検索結果

上記結果から、JSON出力に変換した検索結果から一件ごとに結果を抽出できていることが分かります。
検索に使用したいURIのリストをfor文で回し上記コードを実行することで、容易に大量の問い合わせを自動化することができます。

最後に

今回はナレッジグラフの形式に加え、SPARQLでの検索方法としてRDFストアを利用する方法とプログラムからエンドポイントを呼び出す方法について紹介しました。ナレッジグラフやSPARQLの概要につきましては以下の記事をご参照ください。


■ナレッジグラフ技術解説
1)ナレッジグラフ~ナレッジグラフの作成方法とビジネスへの応用~
2)ナレッジグラフにアクセスする言語「SPARQL」とその使用例を解説
3)ナレッジグラフのRDFデータベースとSPARQLでの検索方法を解説

Right Menu Icon