5 SQL GRAPH_TABLE問合せ
GRAPH_TABLE
演算子を使用してSQLプロパティ・グラフを問い合せると、グラフ・パターン一致問合せを表現できます。
グラフ・パターン一致を使用すると、パス・パターンを定義し、それをグラフと照合して一連の解決策を取得できます。次に示すように、GRAPH_TABLE
演算子への入力として問い合せるグラフを、検索するグラフ・パターンを含むMATCH
句とともに指定する必要があります:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[e IS friends]-> (b IS person WHERE b.name = 'Mary')
WHERE a.name='John'
COLUMNS (a.name AS person_a, b.name AS person_b)
);
基本的なGRAPH_TABLE
問合せは、次のコンポーネントで構成されます:
FROM
句: 入力グラフ名を最初のパラメータとして使用するGRAPH_TABLE
演算子が含まれています。MATCH
句: SQLプロパティ・グラフで検索されるグラフ要素パターン(頂点またはエッジ・パターン)を表します。オプションで、前述の例((b IS person WHERE b.name = 'Mary')
)問合せに示すように、要素パターンWHERE
句を含めることができます。このインラインWHERE
句は、一致した任意の変数にアクセスできます。WHERE
句: これはオプションの表外のWHERE
句です。要素パターンWHERE
句と同様に、すべてのグラフ・パターン変数にアクセスでき、MATCH
句のパターン全体に適用される述語を表現します。COLUMNS
句: 問合せ出力列が含まれています。
関連項目:
『Oracle Database SQL言語リファレンス』のGRAPH_TABLE演算子次の項では、GRAPH_TABLE
問合せについて詳しく説明します:
- グラフ・パターンについて
SQLGRAPH_TABLE
問合せは、グラフ・パターンで構成されます。 - 可変長パス・パターン
可変長グラフ・パターンは、SQLプロパティ・グラフに対する高度な問合せサポートを提供します。 - 複雑なパス・パターン
複雑なパス・パターンを使用してSQLプロパティ・グラフを問い合せることができます。 - 頂点およびエッジ識別子
GRAPH_TABLE
問合せでは、VERTEX_ID
およびEDGE_ID
演算子を使用して、SQLプロパティ・グラフの各頂点およびエッジを一意に識別できます。 - 特定のSCNでのGRAPH_TABLE問合せの実行
GRAPH_TABLE
問合せは、特定のシステム変更番号(SCN)またはタイムスタンプ値で実行できます。 - SQLプロパティ・グラフを問い合せる権限
SQLプロパティ・グラフを問い合せるには、READ
またはSELECT
オブジェクト権限が必要です。 - SQLプロパティ・グラフ問合せの例
この項では、固定長および可変長のグラフ・パターン一致問合せを使用したSQLプロパティ・グラフの問合せの例をいくつか示します。 - SQLプロパティ・グラフの問合せでサポートされている機能および制限事項
この項では、SQLプロパティ・グラフの問合せでサポートされている機能およびサポートされていない機能のリストを示します。 - SQLプロパティ・グラフ問合せのチューニング
EXPLAIN PLAN
文を使用して、SQLGRAPH_TABLE
問合せをチューニングできます。 - プロパティ・タイプを決定するためのタイプ互換性ルール
論理和互換の共有プロパティ名を使用する場合、プロパティ・タイプは特定のタイプ互換性ルールによって決定されます。 - SQL Developerを使用したSQLプロパティ・グラフの表示および問合せ
SQL Developer 23.1を使用すると、「接続」ナビゲータの「プロパティ・グラフ」ノードの下にある「SQLプロパティ・グラフ」を展開して、データベース・スキーマに存在するすべてのSQLプロパティ・グラフを表示できます。
親トピック: SQLプロパティ・グラフ
5.1 グラフ・パターンについて
SQL GRAPH_TABLE
問合せは、グラフ・パターンで構成されます。
グラフ・パターンは、GRAPH-TABLE
問合せの入力グラフ名とCOLUMNS
句の間に表されます。
グラフ・パターンは、1つまたは複数の頂点とエッジ・パターンで構成されます。たとえば、次のグラフ・パターンには2つの頂点パターンと1つのエッジ・パターンがあります:
(v1) -[e]-> (v2)
頂点パターンはカッコで囲まれ、単一の頂点との照合方法を指定します。エッジ・パターンは大カッコで囲まれ、これがエッジ・パターンの左側と右側でデリミタになり、単一のエッジの照合方法を指定します。
また、エッジ・パターンで使用可能な矢印トークンを次の表にまとめています:
表5-1 エッジ・パターンの矢印トークン
方向性 | 大カッコ付き構文 | 省略形構文脚注1 |
---|---|---|
右方向 | -[ ]-> |
-> |
左方向 | <-[ ]- |
-> |
任意の方向のエッジ(右または左) | <-[ ]-> または-[ ]- |
- |
脚注1
- 「省略形構文」列に矢印用のカッコはありません。
- エッジ・ラベルが指定されていないため、すべてのエッジ・ラベルが考慮されます。したがって、特定のエッジでのフィルタリングはサポートされていません。
- 要素変数。
- キーワード
IS
で始まり、1つ以上のラベル名のリストが続く要素パターンのその部分であるラベル式。複数のラベル名がある場合、これらは縦棒で区切られます。 - 要素パターンによって宣言された要素変数の検索条件を表す要素パターン
WHERE
句。
次の各項では、グラフ・パターンの概念について詳細に説明します:
- グラフ要素変数
頂点およびエッジ・パターンの変数は、それぞれ頂点およびエッジの範囲に及んでいます。 - ラベル式
頂点またはエッジ要素パターンのラベル式が、キーワードIS
によって導入されています。 - ラベル・プロパティへのアクセス
グラフ要素パターン内のプロパティには、表外のWHERE
句またはCOLUMNS
句でアクセスできます。
親トピック: SQL GRAPH_TABLE問合せ
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)
グラフ要素パターンでラベルを省略した場合、デフォルトではすべての頂点またはエッジを問い合せます。
ラベル式には、一致した任意の変数にアクセスできるオプションのインライン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 が含まれています。そのため、問合せの他の場所にあるグラフ・パターン変数を使用して、それぞれ頂点またはエッジを参照できます。
頂点パターンでラベルの論理和を使用する |
(a IS person),
|
(a)–[e IS L1]->(b),
|
頂点パターンでラベルの論理積を使用する |
(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つ以上の表の一部です。 - プロパティにアクセスするには、常にグラフ変数名を使用する必要があります。
GRAPH_TABLE
問合せのコンパイル時に、特定のタイプ・チェック・ルールが頂点またはエッジ表のプロパティに適用されます。詳細は、「プロパティ・タイプを決定するためのタイプ互換性ルール」を参照してください。
次の例では、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
を問い合せる場合、次のGRAPH_TABLE
問合せの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
親トピック: グラフ・パターンについて
5.2 可変長パス・パターン
可変長グラフ・パターンは、SQLプロパティ・グラフに対する高度な問合せサポートを提供します。
可変長グラフ・パターンでは、リレーショナル問合せに変換されるときに可変数の結合が存在するような反復が必要です。
次の数量詞の1つ以上を含む制限付き反復パス・パターンがサポートされています:
表5-3 可変長グラフ・パターンの数量詞のサポート
数量詞 | 説明 |
---|---|
{n} |
n に等しい |
{n, m} |
n とm の間(両端を含む)
|
{, m}
|
0 とm の間(両端を含む)
|
? |
0 または1 |
前の表の数量詞の最大上限は10です。
前述の表で説明されている数量詞を使用したGRAPH_TABLE
問合せの例については、例5-14を参照してください。
親トピック: SQL GRAPH_TABLE問合せ
5.3 複雑なパス・パターン
複雑なパス・パターンを使用してSQLプロパティ・グラフを問い合せることができます。
循環パス・パターン
頂点およびエッジ・パス・パターンは循環を形成できます。たとえば、次のグラフ・パターンについて考えてみます:
MATCH (a IS person) -[IS friends]-> (a IS person)
前述のグラフ・パターンは単一のパス・パターンを示し、頂点変数a
が2回含まれています。したがって、これによって、a
がfriends
エッジを持つperson
にバインドされるように、グラフ内の循環が検索されます。
また、次の点にも注意してください。
- 頂点変数
a
のラベルperson
を2回繰り返す必要はありません。結果は、そのラベル式の繰返しの有無にかかわらず同じです。 - 複数のインライン
WHERE
句を使用すると、同じパターン変数に条件を追加できます。 - パス・パターンで同じエッジ変数を2回使用することは、エッジが同じである必要があるというセマンティクスもあるということです。
循環は単一のエッジより長くなる可能性があります。例5-11を参照してください。
複数のパス・パターン
MATCH
句は、カンマ区切りのリストで複数のパス・パターンを含めることができます。たとえば、次の例では2つのパス・パターンを示します:
MATCH (a IS person WHERE a.name='John') -[IS student_of]-> (b IS university),
(a IS person WHERE a.name='John') -[IS friends]-> (c IS person)
2つのパス・パターンに共通するグラフ・パターン変数は、パス・パターン間の重複を示します。前述の例では、頂点変数a
が共有されています。変数a
は、グラフ・パターンの各要素パターンの同じグラフ要素表にバインドする必要があるため、このような繰返しグラフ・パターン変数には暗黙的で自然な内部結合が存在することに注意してください。
2つのパス・パターン間に共有の変数がない場合、結果の出力セットは個別のパス・パターンの出力のクロス積になります。例5-9および例5-10を参照してください。
親トピック: SQL GRAPH_TABLE問合せ
5.4 頂点およびエッジ識別子
GRAPH_TABLE
問合せでは、VERTEX_ID
およびEDGE_ID
演算子を使用して、SQLプロパティ・グラフの各頂点およびエッジを一意に識別できます。
グラフ要素識別子は、グラフ要素表に定義されたキー値に基づいています。したがって、次の点に注意してください:
- 一部のキー列に
UNIQUE
制約がない場合、TRUSTED
モードのグラフでは、異なる頂点に対して重複する識別子が生成されることがあります。 ENFORCED
モードのグラフは、常に一意の識別子を生成することが保証されます。
VERTEX_ID
およびEDGE_ID
演算子は、GRAPH_TABLE
問合せのCOLUMNS
またはWHERE
句に表示される任意の式で使用できます。
ノート:
VERTEX_ID
およびEDGE_ID
演算子を使用するには、プロパティ・グラフ・オブジェクトとその基礎となるデータベース表の両方に対するREAD
またはSELECT
権限があることを確認する必要があります。
VERTEX_ID
演算子への入力は、次に示すように、一致した頂点パターンから取得される単一の頂点グラフ・パターン変数です:
MATCH (v) COLUMNS(VERTEX_ID(v) AS v_id)
同様に、EDGE_ID
演算子は、次のように一致したエッジ・パターンからの単一エッジ・グラフ・パターン変数を入力として取得します:
MATCH (v1)-[e]->(v2) COLUMNS(EDGE_ID(e) AS e_id)
これらの演算子の出力は、JSONデータ型の頂点またはエッジ識別子です。次に、頂点識別子を記述するJSON出力の例を示します:
{
"GRAPH_OWNER": "GRAPHUSER",
"GRAPH_NAME": "STUDENTS_GRAPH",
"ELEM_TABLE": "PERSONS",
"KEY_VALUE": {
"PERSON_ID": 1
}
}
前述のJSON出力では、次のとおりです:
GRAPH_OWNER
: プロパティ・グラフ・オブジェクトの所有者GRAPH_NAME
: プロパティ・グラフ・オブジェクトの名前ELEM_TABLE
: 頂点表の名前KEY_VALUE
: キー列の名前と値
JSON出力フィールドの同じリストがエッジ識別子にも適用されます。ただし、ELEM_TABLE
フィールドはエッジ表の名前を表します。また、JSONデータ型で実行できるすべての操作は、頂点およびエッジ識別子に対して実行できます。
詳細は、例5-19を参照してください。
VERTEX_EQUAL
およびEDGE_EQUAL
述語
VERTEX_EQUAL
述語とEDGE_EQUAL
述語は、それぞれ2つの頂点識別子とエッジ識別子を比較するために使用でき、等しい場合はTRUE
を返します。
VERTEX_EQUAL
述語への入力は、2つの頂点グラフ・パターン変数です。同様に、EDGE_EQUAL
の場合、両方の入力はエッジ・グラフ・パターン変数である必要があります。これらの述語は、GRAPH_TABLE
問合せのWHERE
句で使用できます。
詳細は、例5-20を参照してください。
親トピック: SQL GRAPH_TABLE問合せ
5.5 特定のSCNでのGRAPH_TABLE問合せの実行
特定のシステム変更番号(SCN)またはタイムスタンプ値でGRAPH_TABLE
問合せを実行できます。
GRAPH_TABLE
問合せの最初のオペランドであるグラフ名は、次のいずれかの句に関連付けることができます:
親トピック: SQL GRAPH_TABLE問合せ
5.6 SQLプロパティ・グラフを問い合せる権限
SQLプロパティ・グラフを問い合せるには、READ
またはSELECT
オブジェクト権限が必要です。
グラフ作成者は、次のいずれかの権限を付与することによって、他のグラフ・ユーザーにグラフの問合せを許可できます:
GRANT READ ON PROPERTY GRAPH <graph_name> TO <schema_user>;
GRANT SELECT ON PROPERTY GRAPH <graph_name> TO <schema_user>;
前述の権限を付与すると、プロパティ・グラフ・オブジェクトへのアクセスのみが許可され、基礎となるデータベース表へのアクセスは許可されないことに注意してください。
これにより、グラフ・ユーザーは、基礎となる表にアクセスすることなく、グラフに対してGRAPH_TABLE
問合せを正常に実行できます。たとえば:
GRANT READ ON PROPERTY GRAPH students_graph TO hr;
SQL> conn hr/<password_for_hr>;
Connected.
SQL> SELECT * FROM GRAPH_TABLE (graphuser.students_graph MATCH (a IS person) COLUMNS (a.name AS person_a));
PERSON_A
----------
John
Mary
Bob
Alice
ただし、VERTEX_ID
およびEDGE_ID
演算子を使用してGRAPH_TABLE
問合せを実行するには、さらにグラフ・ユーザーは基礎となるデータベース表に対してREAD
またはSELECT
権限が必要です。
親トピック: SQL GRAPH_TABLE問合せ
5.7 SQLプロパティ・グラフ問合せの例
この項では、固定長および可変長のグラフ・パターン一致問合せを使用したSQLプロパティ・グラフの問合せの例をいくつか示します。
例に示されているすべての問合せは、例4-1で作成されたSQLプロパティ・グラフstudents_graph
で実行されます:
例5-5 左から右へのエッジ・パターンを使用したGRAPH_TABLE
問合せ
次の例では、左から右へのエッジ・パターン(-[e IS friends]->
)を含むGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[e IS friends]-> (b IS person WHERE b.name='Alice')
WHERE a.name='Mary'
COLUMNS (a.name AS person_a, b.name AS person_b)
);
このコードによって、次の出力が生成されます。
PERSON_A PERSON_B
---------- ----------
Mary Alice
例5-6 右から左へのエッジ・パターンを使用したGRAPH_TABLE
問合せ
次の例では、右から左へのエッジ・パターン(<-[e IS friends]-
)を含むGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) <-[e IS friends]- (b IS person WHERE b.name='Mary')
WHERE a.name='Alice'
COLUMNS (a.name AS person_a, b.name AS person_b)
);
このコードによって、次の出力が生成されます。
PERSON_A PERSON_B
---------- ----------
Alice Mary
例5-7 任意の方向のエッジ・パターンを使用したGRAPH_TABLE
問合せ
次の例では、任意の方向のエッジ・パターン(-[e IS friends]-
)を含むGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[e IS friends] - (b IS person WHERE b.name='Alice' OR b.name='Mary')
WHERE (a.name='Alice' OR a.name='Mary')
COLUMNS (a.name AS person_a, b.name AS person_b)
);
このコードによって、次の出力が生成されます。
PERSON_A PERSON_B
---------- ----------
Mary Alice
Alice Mary
例5-8 匿名エッジ変数を使用したGRAPH_TABLE
問合せ
次の例では、エッジ要素変数が省略されているGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[]-> (b IS person)
COLUMNS (a.name AS person_a, b.name AS person_b)
);
または、前述の問合せのエッジ・パターン(-[]->
)のカッコで囲まれた構文を、省略した構文->
に置き換えることができます。
このコードによって、次の出力が生成されます。
PERSON_A PERSON_B
---------- ----------
Mary John
Bob Mary
John Bob
Mary Alice
例5-9 複数のパス・パターンを使用したGRAPH_TABLE
問合せ
次の例では、共通の頂点を持つ2つのパス・パターン(a)->(b)
, (a)->(c)
)を含むGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person WHERE a.name = 'John') -> (b IS person),(a IS person WHERE a.name = 'John') -> (c IS university)
COLUMNS (a.name AS person_a, b.name AS person_b,c.name as university)
);
このコードによって生成される出力は、次のとおりです。
PERSON_A PERSON_B UNIVERSITY
---------- ---------- ----------
John Bob ABC
例5-10 非結合パス・パターンを使用したGRAPH_TABLE
問合せ
次の例では、2つの非結合パス・パターンを含むGRAPH_TABLE
問合せを示します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH (a IS person WHERE a.name='John') -[IS student_of]-> (b IS university),
(x IS person) -[IS friends]-> (y IS person)
COLUMNS (a.name AS a, b.name as university, x.name AS x, y.name as y)
);
結果の出力は次のようになります。
A UNIVERSITY X Y
---------- ---------- ---------- ----------
John ABC Mary John
John ABC Bob Mary
John ABC John Bob
John ABC Mary Alice
例5-11 循環パス・パターンを使用したGRAPH_TABLE
問合せ
次の例では、循環パス・パターン(MATCH (a)-[]->(b)-[]->(c)-[]->(a)
)を使用します。この例では、同じ頂点パターン変数名a
(person
にバインドされているもの)が2回使用されています。そのため、最終的にa
自体にバインドされる3つのエッジを含むグラフの循環が検索されます。
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[IS friends]-> (b IS person) -[IS friends]->
(c IS person) -[IS friends]-> (a)
COLUMNS (a.name AS person_a, b.name AS person_b, c.name AS person_c)
);
このコードによって生成される出力は、次のとおりです。
PERSON_A PERSON_B PERSON_C
---------- ---------- ----------
Bob Mary John
John Bob Mary
Mary John Bob
例5-12 ラベル論理和を使用したGRAPH_TABLE
問合せ
次の例では、頂点ラベル式でラベルの論理和を使用します。
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a is person|university)
COLUMNS (a.name, a.dob)
);
このコードによって、次の出力が生成されます。
NAME DOB
---------- ---------
John 13-JUN-63
Mary 25-SEP-82
Bob 11-MAR-66
Alice 01-FEB-87
ABC NULL
XYZ NULL
6 rows selected.
例5-13 ラベル論理積を使用したGRAPH_TABLE
問合せ
次の例では、頂点ラベル式でラベルの論理積を使用します。
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person), (a IS person_ht)
COLUMNS (a.name as name, a.dob as dob, a.height as height )
);
このコードによって、次の出力が生成されます。
NAME DOB HEIGHT
---------- --------- ----------
John 13-JUN-63 1.8
Mary 25-SEP-82 1.65
Bob 11-MAR-66 1.75
Alice 01-FEB-87 1.7
例5-14 バインドされた数量詞による再帰パス・パターンを使用したGRAPH_TABLE
問合せ
次の例では、再帰パス・パターンを使用して、2ホップ内のすべての友人を取得します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH (a is person WHERE a.name='Mary') -[is friends]->{2} (b is person)
COLUMNS (a.name AS a , b.name AS b)
);
このコードによって生成される出力は、次のとおりです。
A B
---------- ----------
Mary Bob
次の例では、再帰パス・パターンを使用して、1から2ホップ内(両端を含む)のすべての友人を取得します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH (a is person WHERE a.name='Mary') -[is friends]->{1, 2} (b is person)
COLUMNS (a.name AS a , b.name AS b)
);
このコードによって生成される出力は、次のとおりです。
A B
---------- ----------
Mary Alice
Mary John
Mary Bob
次の例では、再帰パス・パターンを使用して、0から2の反復を実行することですべての友人を取得します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH (a is person WHERE a.name='Mary') -[is friends]->{,2} (b is person)
COLUMNS (a.name AS a , b.name AS b)
);
このコードによって生成される出力は、次のとおりです。
A B
---------- ----------
Mary Mary
Mary Alice
Mary John
Mary Bob
前述の出力の最初の行では、Mary
は要素パターン変数a
とb
の両方にバインドされています。これは、GRAPH_TABLE
問合せにゼロ・ホップ反復が含まれているため、左側の頂点パターンと右側の頂点パターンが同じグラフ要素にバインドする必要があるためです。
例5-15 バインド変数を使用したGRAPH_TABLE
問合せ
この例では、バインド変数name
を宣言し、次のように値を割り当てます:
SQL> variable name VARCHAR2(10);
SQL> BEGIN
2 :name := 'Bob';
3 END;
4 /
PL/SQL procedure successfully completed.
このバインド変数を使用して、次のGRAPH_TABLE
問合せが実行されます:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[e IS friends]-> (b IS person WHERE b.name=:name)
WHERE a.name='John'
COLUMNS (a.name AS person_a,
b.name AS person_b,
e.meeting_date AS met_on)
);
このコードによって、次の出力が生成されます。
A B MET_ON
---------- ---------- ---------
John Bob 01-SEP-00
例5-16 式およびCOLUMNS
句内でPL/SQL関数を呼び出すGRAPH_TABLE
問合せ
この例では、ユーザー定義関数(UDF)を次のように宣言します:
CREATE OR REPLACE FUNCTION get_age(
id NUMBER
)
RETURN NUMBER
AS
age NUMBER := 0;
BEGIN
-- get age
SELECT (EXTRACT(YEAR from SYSDATE) - EXTRACT(YEAR from birthdate))
INTO age
FROM persons
WHERE person_id=id;
-- return age
RETURN age;
END;
/
Function created.
次のGRAPH_TABLE
問合せは、WHERE
句の式内でUDFを呼び出し、COLUMNS
句内で再度呼び出します:
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person) -[e IS friends]-> (b IS person)
WHERE (get_age(a.person_id) > 50)
COLUMNS (a.name AS a,
get_age(a.person_id) AS age,
b.name AS b,
e.meeting_date AS met_on)
);
このコードによって、次の出力が生成されます。
A AGE B MET_ON
---------- ---------- ---------- ---------
John 60 Bob 01-SEP-00
Bob 57 Mary 10-JUL-01
例5-17 SCN
を使用したGRAPH_TABLE
問合せ
次のように、データベースの現在のSCN
値を確認します:
SQL> SELECT TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
TIMESTAMP_TO_SCN(SYSDATE)
-------------------------
2117789
次のGRAPH_TABLE
問合せでは、前述のSCN
値を使用します:
SELECT * FROM GRAPH_TABLE (students_graph AS OF SCN 2117789
MATCH
(a IS person) -[e]-> (b IS person)
COLUMNS (a.name AS a, b.name AS b, e.meeting_date AS met_on)
);
問合せの出力は次のようになります。
A B MET_ON
---------- ---------- ---------
Mary John 19-SEP-00
Bob Mary 10-JUL-01
John Bob 01-SEP-00
Mary Alice 19-SEP-00
例5-18 TIMESTAMP
を使用したGRAPH_TABLE
問合せ
次のGRAPH_TABLE
問合せでは、次のようにTIMESTAMP
値を使用します:
SQL> SELECT * FROM GRAPH_TABLE (students_graph AS OF TIMESTAMP SYSTIMESTAMP
MATCH
(a IS person WHERE a.name='John') -[e]-> (b IS person)
COLUMNS (a.name AS a, b.name AS b, e.meeting_date AS met_on)
);
問合せの出力は次のようになります。
A B MET_ON
---------- ---------- ---------
John Bob 01-SEP-00
例5-19 VERTEX_ID
識別子およびEDGE_ID
識別子を使用したGRAPH_TABLE
問合せ
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person ) -[e IS friends]-> (b IS person)
COLUMNS (JSON_SERIALIZE(VERTEX_ID(a)) AS id_a , JSON_SERIALIZE(EDGE_ID(e)) AS id_e)
);
この問合せでは、グラフ所有者、グラフ名、グラフ要素の表名およびキー値を含むJSONデータ型の出力が生成されます:
ID_A ID_E
--------------------------- ------------------------------
{"GRAPH_OWNER":"GRAPHUSER", {"GRAPH_OWNER":"GRAPHUSER","GR
"GRAPH_NAME":"STUDENTS_GRAP APH_NAME":"STUDENTS_GRAPH","EL
H","ELEM_TABLE":"PERSONS"," EM_TABLE":"FRIENDS","KEY_VALUE
KEY_VALUE":{"PERSON_ID":1}} ":{"FRIENDSHIP_ID":1}}
{"GRAPH_OWNER":"GRAPHUSER", {"GRAPH_OWNER":"GRAPHUSER","GR
"GRAPH_NAME":"STUDENTS_GRAP APH_NAME":"STUDENTS_GRAPH","EL
H","ELEM_TABLE":"PERSONS"," EM_TABLE":"FRIENDS","KEY_VALUE
KEY_VALUE":{"PERSON_ID":2}} ":{"FRIENDSHIP_ID":2}}
{"GRAPH_OWNER":"GRAPHUSER", {"GRAPH_OWNER":"GRAPHUSER","GR
"GRAPH_NAME":"STUDENTS_GRAP APH_NAME":"STUDENTS_GRAPH","EL
H","ELEM_TABLE":"PERSONS"," EM_TABLE":"FRIENDS","KEY_VALUE
KEY_VALUE":{"PERSON_ID":2}} ":{"FRIENDSHIP_ID":3}}
{"GRAPH_OWNER":"GRAPHUSER", {"GRAPH_OWNER":"GRAPHUSER","GR
"GRAPH_NAME":"STUDENTS_GRAP APH_NAME":"STUDENTS_GRAPH","EL
H","ELEM_TABLE":"PERSONS"," EM_TABLE":"FRIENDS","KEY_VALUE
KEY_VALUE":{"PERSON_ID":3}} ":{"FRIENDSHIP_ID":4}}
例5-20 VERTEX_EQUAL
述語を使用したGRAPH_TABLE
問合せ
SELECT * FROM GRAPH_TABLE (students_graph
MATCH
(a IS person WHERE a.name='John') -[e IS friends]->{,1} (b IS person)
WHERE VERTEX_EQUAL(a,b)
COLUMNS (JSON_SERIALIZE(VERTEX_ID(a)) AS id_a , JSON_SERIALIZE(VERTEX_ID(b)) AS id_b)
);
この問合せでは、グラフ所有者、グラフ名、グラフ要素の表名およびキー値を含むJSONデータ型の出力が生成されます:
ID_A ID_B
--------------------------- ---------------------------
{"GRAPH_OWNER":"GRAPHUSER", {"GRAPH_OWNER":"GRAPHUSER",
"GRAPH_NAME":"STUDENTS_GRAP "GRAPH_NAME":"STUDENTS_GRAP
H","ELEM_TABLE":"PERSONS"," H","ELEM_TABLE":"PERSONS","
KEY_VALUE":{"PERSON_ID":1}} KEY_VALUE":{"PERSON_ID":1}}
5.7.1 データベースでのサンプル・データの設定
students_graph
を作成するには、データベースに次のサンプル表とデータを設定する必要があります。
親トピック: SQLプロパティ・グラフ問合せの例
5.8 SQLプロパティ・グラフの問合せでサポートされている機能および制限事項
この項では、SQLプロパティ・グラフの問合せでサポートされている機能とサポートされていない機能のリストを示します。
サポートされている機能
- グラフ・パターン内のラベル式では、単一のラベル、ラベルなし、ラベルの論理和およびラベルの論理積がサポートされています。詳細は、次を参照してください。
- 任意の方向エッジ・パターン(
MATCH (a)-[e]-(b
)がサポートされています。例5-7を参照してください。
- 匿名の頂点(
MATCH ()-[e]->()
)およびエッジ(MATCH (a)-[]->(b)
)変数がサポートされています。例5-8を参照してください。
- 複雑なパス・パターン問合せがサポートされています。
- バインドされた再帰パス・パターン問合せがサポートされています。
例5-14を参照してください。
- バインド変数が、
WHERE
句内でサポートされています。例5-15を参照してください。
- 頂点とエッジをそれぞれ一意に識別する
VERTEX_ID
およびEDGE_ID
演算子を、SQLのGRAPH_TABLE
問合せ内で使用できます。- 「頂点およびエッジ識別子」を参照してください。
- 例5-19を参照してください。
- 頂点およびエッジ識別子の一致のための
VERTEX_EQUAL
およびEDGE_EQUAL
述語がサポートされています。- 「頂点およびエッジ識別子」を参照してください。
- 例5-20を参照してください。
- SQLおよびJSON式が、
WHERE
句およびCOLUMNS
句内でサポートされています。例4-6を参照してください。
- JSON簡易構文が、
JSON
タイプのプロパティにアクセスするためにサポートされています。例4-6を参照してください。
- PL/SQL関数が、
WHERE
句またはCOLUMNS
句内でサポートされています。例5-16を参照してください。
- グラフ問合せ内では、単一行および複数行のコメントがサポートされています。
- グラフ名、別名、グラフ要素パターン変数名、ラベル、プロパティ名など、
GRAPH_TABLE
問合せ内のすべての識別子は、大/小文字の区別に関する標準のSQLルールに従っています:- 二重引用符内の識別子では大文字と小文字が区別されます。
- 二重引用符で囲まれていない識別子は、暗黙的に大文字に変換され、二重引用符で囲まれます。
- SQLヒントは、チューニングのために
GRAPH_TABLE
問合せの内外でサポートされています。詳細は、「SQLプロパティ・グラフ問合せのチューニング」を参照してください。
- 必要な権限がある場合は、別のスキーマで定義されたグラフを問い合せることができます。
詳細は、「SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与」を参照してください。
制限事項
- 可変長パターン一致の目標(
ANY
、ALL
、ALL SHORTEST
、ANY CHEAPEST
など)はサポートされていません。 - パス・パターン変数(
MATCH p = (n)-[e]->(m)
)はサポートされていません。 COST
やTOTAL_COST
などの句はサポートされていません。- インライン副問合せおよび
LATERAL
インライン・ビューはサポートされていません。 - SQLマクロはサポートされていません。
親トピック: SQL GRAPH_TABLE問合せ
5.9 SQLプロパティ・グラフ問合せのチューニング
SQL GRAPH_TABLE
問合せは、EXPLAIN PLAN
文を使用してチューニングできます。
GRAPH_TABLE
問合せは、内部的に同等のSQLに変換されます。したがって、次のようにプロパティ・グラフ問合せに対してEXPLAIN PLAN
を生成できます:
SQL> EXPLAIN PLAN FOR SELECT * FROM GRAPH_TABLE (students_graph
MATCH (a is person)-[e is friends]-> (b is person)
COLUMNS (a.name AS a , b.name AS b)
);
Explained.
EXPLAIN PLAN
は、次のように表示できます:
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(format=>'ALL'));
Plan hash value: 1420380663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 264 | 10 (10)| 00:00:01 |
|* 1 | HASH JOIN | | 4 | 264 | 10 (10)| 00:00:01 |
|* 2 | HASH JOIN | | 4 | 184 | 7 (15)| 00:00:01 |
| 3 | TABLE ACCESS FULL| PERSONS | 4 | 80 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| FRIENDSHIPS | 4 | 104 | 3 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | PERSONS | 4 | 80 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$B92C7F25
3 - SEL$B92C7F25 / "A"@"SEL$213F43E5"
4 - SEL$B92C7F25 / "E"@"SEL$213F43E5"
5 - SEL$B92C7F25 / "B"@"SEL$213F43E5"
オプティマイザ・ヒントを使用して、前述のGRAPH_TABLE
問合せをチューニングできます。たとえば、次の例ではPARALLEL
ヒントを使用し、次の実行計画でヒントの使用方法を確認できます:
SQL> EXPLAIN PLAN FOR SELECT /*+ PARALLEL(4) */ * FROM GRAPH_TABLE (students_graph
MATCH (a is person)-[e is friends]-> (b is person)
COLUMNS (a.name AS a , b.name AS b)
);
Explained.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(format=>'ALL'));
Plan hash value: 1486901074
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 264 | 4 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 4 | 264 | 4 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | NESTED LOOPS | | 4 | 264 | 4 (0)| 00:00:01 | Q1,00 | PCWP | |
| 4 | NESTED LOOPS | | 4 | 264 | 4 (0)| 00:00:01 | Q1,00 | PCWP | |
| 5 | NESTED LOOPS | | 4 | 184 | 3 (0)| 00:00:01 | Q1,00 | PCWP | |
| 6 | PX BLOCK ITERATOR | | | | | | Q1,00 | PCWC | |
| 7 | TABLE ACCESS FULL | FRIENDSHIPS | 4 | 104 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
| 8 | TABLE ACCESS BY INDEX ROWID| PERSONS | 1 | 20 | 0 (0)| 00:00:01 | Q1,00 | PCWP | |
|* 9 | INDEX UNIQUE SCAN | PERSON_PK | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | |
|* 10 | INDEX UNIQUE SCAN | PERSON_PK | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | |
| 11 | TABLE ACCESS BY INDEX ROWID | PERSONS | 1 | 20 | 0 (0)| 00:00:01 | Q1,00 | PCWP | |
-----------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$B92C7F25
7 - SEL$B92C7F25 / "E"@"SEL$213F43E5"
8 - SEL$B92C7F25 / "A"@"SEL$213F43E5"
9 - SEL$B92C7F25 / "A"@"SEL$213F43E5"
10 - SEL$B92C7F25 / "B"@"SEL$213F43E5"
11 - SEL$B92C7F25 / "B"@"SEL$213F43E5"
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1
---------------------------------------------------------------------------
0 - STATEMENT
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
- PARALLEL(4)
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 4 because of hint
親トピック: SQL GRAPH_TABLE問合せ
5.10 プロパティ・タイプを決定するためのタイプ互換性ルール
論理和互換の共有プロパティ名を使用する場合、プロパティ・タイプは特定のタイプ互換性ルールによって決定されます。
次は、DDLの作成時および問合せコンパイル時に、論理和互換プロパティのプロパティ・タイプを決定するためのルールをまとめたものです:
- 共有ラベルの同じプロパティによって公開される式が文字データである場合、プロパティのデータ型は次のように決まります:
- すべての式のデータ型が
CHAR
で長さが同じである場合、プロパティはその長さのデータ型CHAR
になります。式がすべてデータ型CHAR
で長さが異なる場合、プロパティ・タイプはVARCHAR2
で、長さがより大きいCHAR
型になります。 - 任意またはすべての式のデータ型が
VARCHAR2
の場合、プロパティのデータ型はVARCHAR2
になります。VARCHAR2
の長さは、入力列の最大長サイズです。
- すべての式のデータ型が
- 共有ラベルの同じプロパティによって公開される式が数値データである場合、プロパティのデータ型は数値の優先順位によって決まります:
- プロパティによって公開される式のデータ型が
BINARY DOUBLE
の場合、プロパティのデータ型はBINARY DOUBLE
になります。 - プロパティを定義する式がデータ型
BINARY DOUBLE
ではなく、式の型がBINARY FLOAT
である場合、プロパティのデータ型はBINARY FLOAT
です。 - プロパティを定義するすべての式が
NUMBER
データ型の場合、プロパティのデータ型はNUMBER
になります。
- プロパティによって公開される式のデータ型が
- 共有ラベルの同じプロパティによって公開される式が日付およびタイムスタンプ・データである場合、プロパティのデータ型は次のように決まります:
- すべての式のデータ型が
DATE
の場合、プロパティのデータ型はDATE
になります。 - 任意またはすべての式のデータ型が
TIMESTAMP
の場合、プロパティのデータ型はTIMESTAMP
になります。
- すべての式のデータ型が
親トピック: SQL GRAPH_TABLE問合せ
5.11 SQL Developerを使用したSQLプロパティ・グラフの表示および問合せ
SQL Developer 23.1を使用すると、「接続」ナビゲータの「プロパティ・グラフ」ノードの下にある「SQLプロパティ・グラフ」を展開して、データベース・スキーマに存在するすべてのSQLプロパティ・グラフを表示できます。
次のステップは、SQLプロパティ・グラフに対するグラフ問合せの実行例を示しています。
親トピック: SQL GRAPH_TABLE問合せ