Skip To Content

ナレッジ グラフの検索

ナレッジ グラフを検索して、ナレッジ グラフに含まれるエンティティとリレーションシップのサブセットを見つけて、さまざまなエンティティが接続している状況を示すことができます。 以下の例をご参照ください。

  • 感染症の拡大を表すナレッジ グラフから、所定の施設とのリレーションシップを通して、関連する人間と動物を扱います。
  • 製造サプライ チェーンを表すナレッジ グラフから、サプライヤー、配達方法、倉庫などの特定の部分に関連付けられたコンテンツを扱います。
  • 組織を表すナレッジ グラフから、所定のタイプのデバイスを扱い、そのプロパティ (担当従業員の名前など) を表示します。

ナレッジ グラフを検索することにより、エンティティとリレーションシップのサブセット、またはそのプロパティのサブセットを特定できます。 openCypher クエリ言語を使用して openCypher クエリを作成することで、関連するエンティティとそのプロパティを検出し、ナレッジ グラフ、マップ、またはリンク チャートでこの制限された情報を操作します。

openCypher クエリの作成

SQL がリレーショナル データベースにクエリするように、openCypher はグラフ データベースにクエリします。 このクエリの基本的な構造は、エンティティを検索、照合して、それらのエンティティを返すことです。ここでは、検索するエンティティが括弧内で識別されます。 例として、クエリ MATCH (e) RETURN e は任意のタイプのエンティティを返します。 返されるエンティティの数は、「ナレッジ グラフの構成」によってのみ制限されます。 返されるグラフ アイテムの数を制限するには、LIMIT 式を使用します。 例として、クエリ MATCH (e) RETURN e LIMIT 5 は任意のタイプのエンティティを 5 つ返します。

クエリでは、矢印を作成するシンボルを使用して関連付けられるエンティティを識別できます。 例として、クエリ MATCH (e1)-->(e2) RETURN e1,e2 はエンティティのペア e1 と e2 を返します。ここでは、これら 2 つのエンティティの間に任意のタイプのリレーションシップが存在し、エンティティ e1 からエンティティ e2 までのいずれかのパスがエンティティを接続します。 クエリが反対方向を指す矢印を使用して作成された場合、パスは起点エンティティ e2 から終点エンティティ e1 までと見なされます (MATCH (e1)<--(e2) RETURN e1,e2)。 エンティティが相互に関連する方法は、パターンと呼ばれます。

クエリでは、考慮すべき特定のリレーションシップを角括弧内で識別できます。 例として、クエリ MATCH (e1)-[]->(e2) RETURN e1,e2 はエンティティのペア e1 と e2 を返します。ここでは、任意のタイプの単一のリレーションシップが 2 つのエンティティを接続します。 このクエリは、上に示す同じクエリを別の方法で表しており、推奨されるクエリ構文を示しています。 このクエリは、起点エンティティ e1、リレーションシップ r、終点エンティティ e2 を返すことで、リレーションシップを示すタプル全体を返すように修正できます (MATCH (e1)-[r]->(e2) RETURN e1,r,e2)。 類似のクエリ MATCH (e1)-[ ]->( )-[ ]->(e2) RETURN e1,e2 または MATCH (e1)-[*2]->(e2) RETURN e1,e2 は、同じ方向の 2 つのリレーションシップによって接続されているエンティティのペアを返します。 クエリでは、MATCH (e1)-[ ]->(e2)<-[ ]-(e3) RETURN e1,e2,e3 のように、リレーションシップの方向が異なるパターンも特定できます。

上記のクエリ例は任意のナレッジ グラフで使用できます。

データ モデルに定義されたエンティティ タイプ、リレーションシップ タイプ、およびプロパティの参照によって、クエリを特定のナレッジ グラフに合わせて調整します。 特定のエンティティ タイプの名前をクエリに含めて、考慮されるグラフ アイテムを制限します。 例として、クエリ MATCH (e1:Person)-[r]->(e2) RETURN e1,r,e2 はすべての Person エンティティ e1 を返します。ここでは、任意のリレーションシップ r が Person を別の任意のタイプのエンティティ e2 に接続します。 前の例と比較すると、Pet、Vehicle、または Document エンティティがリレーションシップの起点になるリレーションシップは結果に含まれません。

リレーションシップ タイプとエンティティ タイプをクエリの他のファセットに追加して、特定のリレーションシップ タイプと特定の関連エンティティを考慮するようにクエリを制限できます。 例として、MATCH (p:Person)-[v:HasVehicle]->(e) RETURN p,v,e はすべての Person エンティティ p を返します。ここでは、HasVehicle リレーションシップ v が Person を別の任意のタイプのエンティティ e に接続します。 変数 p と v は、それぞれ Person エンティティと HasVehicle リレーションシップに割り当てられているため、クエリでそれらに関する情報を返すことができます。 前の例と比較すると、Pet または Document エンティティがリレーションシップの終点になるリレーションシップは結果に含まれません。 ナレッジ グラフのデータ モデルに応じて、終点エンティティ e は、一般的な Vehicle エンティティであるか、Automobile、Motorcycle、Boat、Airplane、Commercial Vehicle といった一連の特定のエンティティ タイプの 1 つである可能性があります。

エンティティとリレーションシップの特定のプロパティをクエリ結果に含めることができます。 例として、MATCH (p:Person)-[:HasVehicle]->(e) RETURN p,e.make,e.model,e.year は前に定義したのと同じクエリを実行します。 ただし、結果には、終点エンティティ自体が表示されるのではなく、そのエンティティの複数のプロパティ (その車両の make、model、year) にそれぞれ格納される値が表示されます。 この例では、クエリで考慮される特定のリレーションシップに対して変数が割り当てられませんでした。これは、リレーションシップのデータがクエリ結果に含まれることも、クエリの他の部分で評価されることもないためです。

同様に、対象のエンティティとリレーションシップを定義するプロパティを指定して、評価されるエンティティとリレーションシップを制限できます。 考慮すべきプロパティを定義するには、WHERE 句をクエリに追加します。 上記の例と同様に、WHERE 句でエンティティおよびリレーション シップに関する特定の情報を参照するには、変数を割り当てる必要があります。 例として、クエリ MATCH (p:Person)-[hv:HasVehicle]->(v:Vehicle) WHERE p.lastName = 'Doe' and hv.endDate IS NULL and v.year < 1980 RETURN p,p.firstName,v,v.make,v.year では、特定の lastName プロパティ値を持つ Person エンティティのみが評価されます。HasVehicle リレーションシップは、それらのエンティティの endDate プロパティに NULL 値が含まれている場合のみ考慮されます。関連する Vehicle エンティティは、year プロパティが 1980 より前の値である場合のみ考慮されます。

クエリでは、一連の個別のエンティティおよびリレーションシップを返す代わりに、パターンで表される完全なパスを返すことができます。 これには、MATCH ステートメントで定義されたパターンを変数に割り当て、その変数を返します。 たとえば、クエリ MATCH path = (:Person)-[:HasVehicle]->(:Vehicle) RETURN path は、指定したパターンを満たすすべてのエンティティとリレーションシップの組み合わせのパスのリストを返します。 各パスには、一致したパターンのすべてのパート (Person、HasVehicle リレーションシップ、Vehicle) が含まれます。 このパターンの個別のパートはクエリで返されないため、変数を割り当てる必要はありません。

検索式での日時値の使用

ホスト グラフ ストア、または ArcGIS が管理するデータがある NoSQL データ ストアを使用してナレッジ グラフを作成する場合、日時値を必ず協定世界時 (UTC) で指定する必要があります。 同様に、日時値が検索式から返される場合は、常に UTC 時間になります。 そのため、エンティティかリレーションシップのプロパティに格納されている日時値を特定のタイム ゾーンに関連付けることはできません。 値を入力すると、日時がそのまま格納されます。 そのため、ナレッジ グラフでは現地時間で入力された値が自動的に UTC に変換されません。 変換を手動で実行し、正しい値を格納することで、後からナレッジ グラフを検索する際の問題を回避する必要があります。

たとえば、特定のイベントに関するデータを収集する場合、ナレッジ グラフを編集する全員がそのイベントに関連する日時値を適切な UTC 時間で入力する必要があります。 別のタイム ゾーンにいる編集者は、現地のタイム ゾーンの日時値を入力してはいけません。 同様に、ナレッジ グラフを検索する際は、自身がいるタイム ゾーンの現地時間ではなく、イベントに関連する適切な UTC 時間を検索式で参照する必要があります。 こうすることで、全員が正しい値を格納し、物理的な位置や現地時間に関係なく、正しい値を検索できるようになります。

日付プロパティに格納されている値を使用してナレッジ グラフを検索するには、入力された値を日付として解釈する datetime() ユーティリティを使用する必要があります。 入力した日時が UTC 時間であることを示すには、日時形式 YYYY-MM-DDThh:mm:ss.sssZ を使用して値を指定します。 入力した日付が適切なタイム ゾーン オフセットがある現地時間であることを示すには、日時形式 YYYY-MM-DDThh:mm:ss.sss+00:00 を使用します。 指定したタイム ゾーンで、省略せずに日時値を ISO 形式で入力する必要があります。 日時値の一部かタイム ゾーンを省略すると、検索式でエラーが返されます。

たとえば、特定の日時より後に購入されたすべての車両を見つけるには、MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.acquisitionDate > datetime('2014-10-18T12:36-08:00') RETURN path のような検索式を使用します。 HasVehicle リレーションシップに acquisitionDate プロパティがあり、値が 2014 年 10 月 18 日の午後 12:36 (太平洋標準時) 以降のすべてのパスが返されます。太平洋標準時は UTC の 8 時間遅れです。

1998 年に購入されたすべての車両を見つけるには、MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.acquisitionDate > datetime('1998-01-01T00:00Z') and hv.acquisitionDate < datetime('1998-12-31T23:59Z') RETURN path のような検索式を使用します。 HasVehicle リレーションシップに 1998 年 1 月 1 日から 12 月 31 日午前 0 時 (UTC) までの acquisitionDate プロパティがあるすべてのパスが返されます。

現時点では、時間間隔と期間を使用したナレッジ グラフの検索は ArcGIS Knowledge でサポートされていません。

検索式での空間演算子の使用

ArcGIS Knowledge では、ポイント、マルチポイント、ライン、ポリゴンの各ジオメトリで openCypher 検索式の空間演算子を使用できます。 ホスト グラフ ストア、または ArcGIS 管理のデータを含む NoSQL データ ストアを使用するナレッジ グラフに作成したエンティティ タイプで同じジオメトリ タイプがサポートされます。 ユーザー管理データを含む NoSQL データ ストアがナレッジ グラフで使用されている場合、サポートされるジオメトリ タイプが異なる場合があります。

以下の空間演算子がサポートされています。

  • ST_Equals: 等しいジオメトリがあるエンティティが返されます。 構文は esri.graph.ST_Equals(geometry1, geometry2) です。
  • ST_Intersects: 交差するジオメトリがあるエンティティが返されます。 構文は esri.graph.ST_Intersects(geometry1, geometry2) です。
  • ST_Contains: ジオメトリが指定したジオメトリに含まれるエンティティが返されます。 構文は esri.graph.ST_Contains(geometry1, geometry2) です。

空間演算子は検索式の WHERE 句に組み込むことができます。 ジオメトリ パラメーターでエンティティのジオメトリを参照できます。空間位置を表すジオメトリを指定することも可能です。 演算子 esri.graph.ST_WKTToGeometry(string) を使用して文字列からジオメトリを作成できます。ここで、文字列パラメーターは Well-Known Text テキスト形式で指定された OGC シンプル フィーチャです。 たとえば、座標 117.1964763°W 34.0572046°N を表すジオメトリを作成するには、演算子 esri.graph.ST_WKTToGeometry("POINT (-117.1964763 34.0572046)") を使用します。 この方法で作成したジオメトリは、空間演算子の最初のジオメトリ引数でのみ指定できます。 2 番目のジオメトリ引数では、ナレッジ グラフのエンティティと関連付けられているジオメトリを常に参照する必要があります。

Person タイプのエンティティにポイント ジオメトリを含めることができ、Facility タイプのエンティティにポリゴン ジオメトリを含めることができる、以下の例を検討してください。

  • 検索式 MATCH (p1:Person), (p2:Person) WHERE esri.graph.ST_Equals(p1.shape, p2.shape) RETURN p1, p2 では、形状が等しい Person エンティティ p1 と p2 エンティティが返されます。つまり、両方の Person エンティティで位置ジオメトリが同一です。
  • 検索式 MATCH (e:Employee), (f:Facility) WHERE esri.graph.ST_Intersects(e.shape, f.shape) RETURN e, f では、Employee エンティティ e と Facility エンティティ f が返されます。Employee エンティティと Facility エンティティのジオメトリは交差しています。
  • 検索式 MATCH (f:Facility) WHERE esri.graph.ST_Contains(esri.graph.ST_WKTToGeometry("POINT (-117.1964763 34.0572046)"), f.shape) RETURN f では、ジオメトリに指定したポイントを含む Facility エンティティ f が返されます。

構文が esri.graph.ST_GeoDistance(geometry, geometry) の空間ユーティリティ ST_GeoDistance も利用可能です。 このユーティリティは、2 つのジオメトリ間の距離を返します。 たとえば、検索式 MATCH (n), (e) WHERE esri.graph.ST_GeoDistance(n.shape, e.shape) as distance RETURN n, e では、エンティティ n と e の間で計算された測地線距離が WHERE 句の距離変数に格納されます。

openCypher クエリの詳細

openCypher クエリ言語の詳細については、「openCypher Implementers Group が提供するドキュメント」をご参照ください。 ArcGIS KnowledgeopenCypher クエリ言語のすべての部分をサポートしているわけではありません。 たとえば、クエリを使用してナレッジ グラフを更新することはできず、値を返すだけです。

ArcGIS ProopenCypher については、「ヒストグラムを構築する」ためのデータをナレッジ グラフから取得するクエリをご参照ください。 [検索とフィルター] ウィンドウの [ヒストグラム] タブ ヒストグラム で、[設定] ボタン 設定 をクリックして [クエリ タブにクエリを送信] をクリックします。 現在のヒストグラム セットのデータを取得するためのクエリが [クエリ] テキスト ボックスに表示されます。