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+000
SQLプロパティ・グラフ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
親トピック: グラフ・パターンについて