ナレッジ グラフを検索して、ナレッジ グラフに含まれるエンティティとリレーションシップのサブセットを見つけて、さまざまなエンティティが接続している状況を示すことができます。 来歴レコードを使用でき、来歴レコードを必要に応じて、検索結果に含めることができます。 以下の例をご参照ください。
- 感染症の拡大を表すナレッジ グラフから、所定の施設とのリレーションシップを通して関連付けられた人間と動物を扱います。
- 製造サプライ チェーンを表すナレッジ グラフから、サプライヤー、配達方法、倉庫などの特定の部分に関連付けられたコンテンツを扱います。
- 組織を表すナレッジ グラフから、所定のタイプのデバイスを扱い、そのプロパティ (担当従業員の名前など) を表示します。
- 亀と亀の生息地を表すナレッジ グラフから、特定の環境上の影響評価の情報を使用して、リスクのレベルが確立された生息地を特定します。
ナレッジ グラフを検索することにより、エンティティとリレーションシップのサブセット、またはそのプロパティのサブセットを特定できます。 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 データ ストアを使用してナレッジ グラフを作成する場合、ArcGIS Enterprise 11.2 以降のバージョンで時系列データを格納できる複数のオプションが用意されています。 時系列データを格納および検索する場合は、イベントの場所とデータにアクセスするユーザーの場所を考慮する必要があります。
ローカル データを格納して同じ地域で使用する場合は、タイム ゾーンを気にせずに日時情報を格納できます。 このデータは、data データ タイプを持つプロパティに格納できます。 データが異なるタイム ゾーンで生成されるか、異なるタイム ゾーンから検索される場合は、場所やタイム ゾーンにかかわらず正しい値が格納および検索されるように注意する必要があります。 timestamp offset データ タイプを持つプロパティでは、イベントが発生したタイム ゾーンとデータが使用されているタイム ゾーンを考慮した日時の値を記録できます。
openCypher 検索式を使用して、ナレッジ グラフに格納されている日時の値にアクセスできます。 正しい結果を得るには、以下の表で説明するように、特定の関数を使用して各データ タイプのプロパティを検索する必要があります。 別の関数を使用すると、エラーまたは予期しない結果が発生することがあります。 時間値が検索式に提供される場合、または検索式によって返される場合は、常に ISO 8601 日時形式が使用されます。
フィールド タイプ | 関数 | 構文 | 例 |
---|---|---|---|
localdatetime() | localdatetime('YYYY-MM-DDThh:mm:ss.sss') | localdatetime('2015-07-24T21:40:53.142') | |
date() | date('YYYY-MM-DD') | date('2015-07-24') | |
localtime() | localtime('hh:mm:ss.sss') | localtime('21:40:53.142') | |
datetime() | datetime('YYYY-MM-DDThh:mm:ss.sssZ') または datetime('YYYY-MM-DDThh:mm:ss.sss+00:00') | datetime('2015-07-24T21:40:53.142Z') または datetime('2015-07-21T21:40:53.142-08:00') |
ナレッジ グラフ プロパティを timestamp offset データ タイプで評価するには、openCypher 検索式で datetime() 関数を使用します。 指定した値が協定世界時 (UTC) である場合、YYYY-MM-DDThh:mm:ss.sssZ 日時形式を使用します。 値が適切なタイム ゾーン オフセットを持つ現地時間の日付である場合、YYYY-MM-DDThh:mm:ss.sss+00:00 形式を使用します。 検索式で値を指定する際に、日時値の重要な部分を省略すると、検索式でエラーが返されます。
たとえば、特定の時刻より後に購入されたすべての車両を見つけるには、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 Enterprise 11.3 以降、openCypher 検索式では、期間を使用してナレッジ グラフ内の時間値を評価できます。 これにより、データ ポイント間の時間差を把握することができます。 プロパティ内でキャプチャされたイベントが一定期間継続しているエンティティとリレーションシップ、またはイベント間で一定期間が経過しているエンティティとリレーションシップを見つけることができます。
期間が検索式に提供される場合、または検索式によって返される場合は、常に ISO 8601 期間形式が使用されます。 たとえば、期間 P1Y2M3DT4H5M6S は、1 年 2 か月 3 日 4 時間 5 分 6 秒の時間間隔を表します。 期間の各部分は、値がゼロであれば省略できます。 たとえば、1 日半の期間は、P1DT12H または PT36H として表すことができます。 期間の文字列に時間コンポーネントが含まれる場合、文字 T は日付コンポーネントの後かつ時間コンポーネントの前に指定する必要があります。
以下に説明するように、複数の期間関数を使用して、2 つの時刻間の期間を計算できます。 必要に応じて、期間を特定の時間単位で計算できます。
- duration.between(a, b) - 時刻 a と時刻 b の間の経過時間。 経過した全時間を年、月、日などの単位で指定する期間が返されます。
- duration.inMonths(a, b) - 時刻 a と時刻 b の間の経過時間が月数として計算され、期間として返されます。 1 か月未満の時間は破棄されます。
- duration.inDays(a, b) - 時刻 a と時刻 b の間の経過時間が日数として計算され、期間として返されます。 1 日未満の時間は破棄されます。
- duration.inSeconds(a, b) - 時刻 a と時刻 b の間の経過時間が秒数として計算され、期間として返されます。 1 秒未満の時間は破棄されます。
たとえば、所有してから 2 年未満の車両を売却した人を見つけるには、MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.endDate < (hv.acquisitionDate + duration('P2Y')) RETURN path, duration.between(hv.acquisitionDate,hv.endDate) as TimeOwned などの検索式を使用します。 HasVehicle リレーションシップに endDate プロパティがあり、endDate プロパティと acquisitionDate プロパティの間の期間が 2 年未満のすべてのパスが返されます。 この検索式は、パスと車両が所有されていた期間の両方を返します。
期間を計算する場合、適切な場所に日時関数を指定することで、2 つの時点のうちの 1 つとして現在の日付または時刻を指定できます。 期間の各部分にアクセスして返したり、検索式で使用したりすることもできます。 次の例では、4 年以上前に車両を購入した人を識別します。MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE duration.between(hv.acquisitionDate, datetime()).years > 4 RETURN path 特定の日付を指定せずに、関数 datetime() を指定することで、検索式で現在の日時が使用されます。 次に、計算した期間の年部分がアクセスされ、適切なパスを見つけるために評価されます。 このようにして、日、時、分など、期間のすべての部分にアクセスすることができます。
期間は、関連当事者間で発生するイベント間でも計算できます。 たとえば、次の検索式はナレッジ グラフを評価して、Phone エンティティと Called リレーションシップ間のリレーションシップと、通話間の時間を特定します。MATCH (:Phone)-[c1:Called]-(:Phone)-[c2:Called]-(:Phone) WHERE duration.between(c1.datecalled, c2.datecalled).minutes < 45 RETURN c1, c2 この検索式では、携帯電話が 1 つの電話を受けてから 2 つ目の電話をかけるまでの期間が計算されます。 期間の分プロパティにアクセスし、通話間の経過時間が 45 分未満である場合、最初の通話と 2 つ目の通話の両方が検索式によって返されます。
検索式での来歴レコードの使用
ホスト グラフ ストア、または ArcGIS が管理するデータがある NoSQL データ ストアを使用してナレッジ グラフを作成する場合、来歴を有効にできます。 来歴レコードによって、ナレッジ グラフのコンテンツの生成元を示すことができます。 エンティティまたはリレーションシップのプロパティに格納されている値が、特定のドキュメントまたは Web サイトから取得されたものになるように指定できます。 この情報は、後でナレッジ グラフを検索するときに使用できます。 特定の情報ソースを生成元とするプロパティ値を持つエンティティおよびリレーションシップを見つけることができます。
デフォルトでは、来歴レコードはすべての検索式から除外されます。 ArcGIS Pro で、来歴レコードに格納された情報を検索式で使用し、来歴レコードを検索結果に含めるには、[来歴を含む] オプションをオンにする必要があります。 利用可能な開発者向け API のいずれかを使用して ArcGIS Knowledge Server サイトと通信するカスタム アプリケーションを作成した場合は、クライアント アプリケーションで、検索結果が来歴レコードを含むように指定する必要があります。
検索式では、グラフ アイテムのインスタンス識別子を来歴レコードに格納されたインスタンス識別子と比較することで、来歴レコードに関連付けられたプロパティを持つエンティティおよびリレーションシップを決定する必要があります。 検索式では、グラフ アイテムと来歴レコードのプロパティを評価して結果を得ることもできます。 来歴レコード自身またはそのプロパティを、必要に応じて検索結果に含めることができます。
たとえば、California Department of Motor Vehicles が、HasVehicle リレーションシップのプロパティに格納された情報のソースになっている、すべての車両の所有者を見つけるには、MATCH (p:Person)-[hv:HasVehicle]->(v:Vehicle), (pr:Provenance) WHERE ID(hv)=pr.instanceID and pr.sourceName ="California Department of Motor Vehicles" RETURN p,hv,v,pr というような検索式を使用します。 この検索式は、リレーションシップのインスタンス識別子を来歴レコードの instanceID プロパティと比較することで、来歴レコードを持つ HasVehicle リレーションシップを評価しています。 評価される来歴レコードは、レコードの sourceName プロパティが該当する値を持つもののみです。 さらに、見つかった HasVehicle リレーションシップに関連付けられている Person および Vehicle エンティティと、来歴レコードそのものも検索結果に含まれます。
検索式での空間演算子の使用
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 Knowledge は、openCypher クエリ言語のすべての部分をサポートしているわけではありません。 たとえば、クエリを使用してナレッジ グラフを更新することはできず、値を返すだけです。
ArcGIS Pro の openCypher については、ヒストグラムを構築するためのデータをナレッジ グラフから取得するクエリをご参照ください。 [検索とフィルター] ウィンドウの [ヒストグラム] タブ で、[設定] ボタン をクリックして、[クエリ タブにクエリを送信] をクリックします。 現在のヒストグラム セットのデータを取得するためのクエリが、[クエリ] テキスト ボックスに表示されます。