5.1 グラフ・パターンについて
SQLグラフ問合せのGRAPH_TABLE演算子には、グラフ・パターンが含まれます。
グラフ・パターンは、入力グラフ名とGRAPH_TABLE演算子内のCOLUMNS句の間に表されます。
グラフ・パターンには、頂点パターンおよびエッジ・パターンで構成される1つ以上のカンマ区切りのパス・パターンが含まれます。たとえば、次のパス・パターンには2つの頂点パターンと1つのエッジ・パターンがあります。
(v1) -[e]-> (v2)
頂点パターンはカッコで囲まれ、単一の頂点との照合方法を指定します。エッジ・パターンは大カッコで囲まれ、これがエッジ・パターンの左側と右側でデリミタになり、単一のエッジの照合方法を指定します。
また、エッジ・パターンで使用可能な矢印トークンを次の表にまとめています:
表5-1 エッジ・パターンの矢印トークン
| 方向性 | 大カッコ付き構文 | 省略形構文脚注1 |
|---|---|---|
| 右方向 | -[ ]-> |
-> |
| 左方向 | <-[ ]- |
-> |
| 任意の方向のエッジ(右または左) | <-[ ]-> or -[ ]- |
- |
脚注1
- 「省略形構文」列に矢印用のカッコはありません。
- エッジ・ラベルが指定されていないため、すべてのエッジ・ラベルが考慮されます。したがって、特定のエッジでのフィルタリングはサポートされていません。
- 要素変数。
- キーワード
ISで始まり、1つ以上のラベル名のリストが続く要素パターンのその部分であるラベル式。複数のラベル名がある場合、これらは縦棒で区切られます。 - 要素パターンによって宣言された要素変数の検索条件を表す要素パターン
WHERE句。
次の各項では、グラフ・パターンの概念について詳細に説明します:
- グラフ要素変数
頂点およびエッジ・パターンの変数は、それぞれ頂点およびエッジの範囲に及んでいます。 - ラベル式
頂点またはエッジ要素パターンのラベル式が、キーワードISによって導入されています。 - ラベル・プロパティへのアクセス
グラフ要素パターン内のプロパティには、表外のWHERE句またはCOLUMNS句でアクセスできます。
親トピック: SQLグラフ問合せ
5.1.1 グラフ要素変数
頂点およびエッジ・パターンの変数は、それぞれ頂点およびエッジの範囲に及んでいます。
たとえば、3つのグラフ要素変数を含む次のグラフ・パターンを考えてみます。
(v1)–[e]->(v2)
前述のグラフ・パターンでは、v1およびv2は2つの頂点パターン変数で、eはエッジ・パターン変数です。
グラフ・パターン変数に次のルールを適用してください:
- 頂点とエッジの両方に同じ変数名を使用することはできません。
- 次に示すように、2つの異なる頂点パターンで同じ変数名を使用できます:
MATCH (a IS person) -> (a IS person)前述の例では、頂点変数
aが2つの頂点パターン((a IS person)および(a IS person))で使用されています。これは、同じ頂点変数を宣言する2つの頂点パターンが同じ頂点にバインドする必要があることを意味します。したがって、頂点変数は一意の頂点にバインドされますが、頂点パターンが同じグラフ・パターンで複数回出現する可能性があります。 - 2つの異なるエッジ・パターンで同じ変数名を使用できます。
- 匿名(つまり省略)の頂点およびエッジ変数がサポートされています。例5-8を参照してください。
親トピック: グラフ・パターンについて
5.1.2 ラベル式
頂点またはエッジ要素パターンのラベル式が、キーワードISによって導入されています。
たとえば、次のグラフ・パターンでは、グラフ要素変数v1に関連付けられた頂点パターンのラベルはpersonです。また、グラフ要素変数eに関連付けられたエッジ・パターンには、ラベルfriendOfが含まれています:
(v1 IS person) –[e IS friendOf]-> (v2)
グラフ要素パターンでラベルが省略された場合、要素変数の型に応じて、グラフ内のすべての頂点プロパティまたはすべてのエッジ・プロパティを参照できます。それ以外の場合で、ラベル式が指定された場合、参照可能なプロパティのセットは、ラベル式を満たすラベルが1つ以上含まれている頂点(またはエッジ)表に属しているラベルのプロパティの結合です。
ラベル式には、一致した任意の変数にアクセスできるオプションのインラインSQL検索条件を含めることもできます。プロパティにアクセスする場合は、グラフ・パターン変数を指定する必要があります。
サポートされている頂点およびエッジ・ラベル式を次の表で説明します:
表5-2 サポートされている頂点およびエッジ・ラベル式
| 頂点ラベル式 | エッジ・ラベル式 | 説明 |
|---|---|---|
(a) |
[e] |
|
() |
[] |
グラフ・パターン変数が指定されていない場合、一意の頂点またはエッジ変数名がシステムによって内部的に生成されます。したがって、問合せの他の場所で頂点またはエッジを参照することはできません(不明なため)。 |
(IS person) |
[IS friend_of] |
グラフ・パターン変数が指定されていない場合、一意の頂点またはエッジ変数名がシステムによって内部的に生成されます。したがって、問合せの他の場所で頂点またはエッジを参照することはできません(不明なため)。 |
(IS person|place|thing) |
[IS friend_of|student_of] |
頂点パターンまたはエッジ・パターンに明示的なグラフ・パターン変数がないため、問合せの他の場所ではこの頂点またはエッジを参照できません。 |
(a IS person|place|thing) |
[e IS friend_of|student_of] |
前述の表エントリと同じです。ただし、頂点パターンおよびエッジ・パターンには、頂点およびエッジ・グラフ・パターン変数としてそれぞれaおよびeが含まれています。そのため、問合せの他の場所にあるグラフ・パターン変数を使用して、それぞれ頂点またはエッジを参照できます。
例5-12を参照してください。 |
(a IS person),
|
(a)–[e IS L1]->(b),
|
例5-13を参照してください。 |
(a IS person WHERE a.name = 'Fred') |
[e IS student_of WHERE e.subject = 'Arts'] |
要素パターン内で表示される唯一のグラフ・パターン変数は、要素パターンによってローカルに定義されたグラフ・パターン変数です。別の要素パターンのグラフ・パターン変数にはアクセスできません。例5-5を参照してください。 |
親トピック: グラフ・パターンについて
5.1.3 ラベル・プロパティへのアクセス
グラフ要素パターン内のプロパティには、表外のWHERE句またはCOLUMNS句でアクセスできます。
次のグラフ要素パターンについて考えてみます。aはグラフ要素変数で、nameはプロパティ名です:
(a IS person WHERE a.name='John')
その後、グラフ要素パターン内のWHERE句のプロパティをa.nameとして参照できます。これは、a.nameがグラフ・パターン変数aにバインドされたグラフ要素のプロパティnameを参照することを意味します。
また、プロパティへのアクセス時には次の条件が適用されます:
- プロパティ
nameは、ラベル式を満たす1つ以上の表の一部です。 - プロパティにアクセスするには、常にグラフ変数名を使用する必要があります。
- 問合せのコンパイル時に、特定のタイプ・チェック・ルールが頂点またはエッジ表のプロパティに適用されます。詳細は、「プロパティ・タイプを決定するためのタイプ互換性ルール」を参照してください。
次の例では、SQLプロパティ・グラフの問合せ時にプロパティ・タイプを決定するいくつかのシナリオを示します。例5-1から例5-3は、様々なラベルの共有プロパティとしてheightを含むSQLプロパティのg1のグラフ定義を参照していることに注意してください。
例5-1 単一ラベルのプロパティ・タイプの決定
次の問合せのa.heightのデータ型はFLOATです:
SELECT * FROM GRAPH_TABLE (g1
MATCH
(a IS person)
COLUMNS (a.height)
);
HEIGHT
----------
1.8
1.65
1.75
1.7例5-2 2つの異なるラベルの論理和互換プロパティ・タイプの決定
次の問合せのa.heightのデータ型は、FLOATとBINARY_DOUBLEの間の論理和互換型です:
SELECT * FROM GRAPH_TABLE (g1
MATCH
(a IS person|t3)
COLUMNS (a.height)
);
HEIGHT
----------
1.8E+000
1.65E+000
1.75E+000
1.7E+000
1.8E+000
1.65E+000SQLプロパティ・グラフg1では、ラベルpersonおよびt3に関連付けられたheightのプロパティ・タイプはそれぞれFLOATおよびBINARY_DOUBLEです。BINARY_DOUBLEはFLOATより優先されるため、a.heightの出力プロパティ・タイプはBINARY_DOUBLEになります。
例5-3 2つの異なるラベルの論理和互換プロパティ・タイプがない場合
a.heightのデータ型が表person (FLOAT)およびt2 (VARCHAR)間で論理和互換ではないため、次の問合せに対してエラーがスローされます:
SELECT * FROM GRAPH_TABLE (g1
MATCH
(a IS person|t2)
COLUMNS (a.height)
);
実行時に、前述の問合せはエラーORA-01790:「式には対応する式と同じデータ型を持つ必要があります」をスローします
例5-4 共有ラベルの論理和互換プロパティ・タイプの決定
共有プロパティ名(height)に関連付けられた共有ラベル(t)を使用するg3のSQLプロパティ・グラフ定義について考えてみます。
g3を問い合せる場合、次のSQLグラフ問合せのa.heightのデータ型はBINARY_DOUBLEです。
SELECT * FROM GRAPH_TABLE (g3
MATCH
(a IS t)
COLUMNS (a.height)
);
BINARY_DOUBLEになります: HEIGHT
----------
1.8E+000
1.65E+000
1.75E+000
1.7E+000
1.8E+000
1.65E+000親トピック: グラフ・パターンについて