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問合せについて詳しく説明します:

5.1 グラフ・パターンについて

SQL GRAPH_TABLE問合せは、グラフ・パターンで構成されます。

グラフ・パターンは、GRAPH-TABLE問合せの入力グラフ名とCOLUMNS句の間に表されます。

グラフ・パターンは、1つまたは複数の頂点とエッジ・パターンで構成されます。たとえば、次のグラフ・パターンには2つの頂点パターンと1つのエッジ・パターンがあります:

(v1) -[e]-> (v2)

頂点パターンはカッコで囲まれ、単一の頂点との照合方法を指定します。エッジ・パターンは大カッコで囲まれ、これがエッジ・パターンの左側と右側でデリミタになり、単一のエッジの照合方法を指定します。

また、エッジ・パターンで使用可能な矢印トークンを次の表にまとめています:

表5-1 エッジ・パターンの矢印トークン

方向性 大カッコ付き構文 省略形構文脚注1
右方向 -[ ]-> ->
左方向 <-[ ]- ->
任意の方向のエッジ(右または左) <-[ ]->または-[ ]- -

脚注1

  • 「省略形構文」列に矢印用のカッコはありません。
  • エッジ・ラベルが指定されていないため、すべてのエッジ・ラベルが考慮されます。したがって、特定のエッジでのフィルタリングはサポートされていません。

グラフ要素パターン(頂点またはエッジ・パターンのいずれか)には、オプションで次のものを含めることができます:
  • 要素変数。
  • キーワードISで始まり、1つ以上のラベル名のリストが続く要素パターンのその部分であるラベル式。複数のラベル名がある場合、これらは縦棒で区切られます。
  • 要素パターンによって宣言された要素変数の検索条件を表す要素パターンWHERE句。

次の各項では、グラフ・パターンの概念について詳細に説明します:

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]
  • 頂点グラフ・パターン変数aは、任意のラベルを持つ頂点と一致する可能性があります。
  • エッジ・グラフ・パターン変数eは、任意のラベルを持つエッジと一致する可能性があります。
() []
  • 頂点パターンにはラベルがなく、任意の頂点と一致する可能性があります。
  • エッジ・パターンにはラベルがなく、任意のエッジと一致する可能性があります。

グラフ・パターン変数が指定されていない場合、一意の頂点またはエッジ変数名がシステムによって内部的に生成されます。したがって、問合せの他の場所で頂点またはエッジを参照することはできません(不明なため)。

(IS person) [IS friend_of]
  • 頂点パターンにはpersonラベルのみが含まれています。
  • エッジ・パターンにはfriend_ofラベルのみが含まれています。

グラフ・パターン変数が指定されていない場合、一意の頂点またはエッジ変数名がシステムによって内部的に生成されます。したがって、問合せの他の場所で頂点またはエッジを参照することはできません(不明なため)。

(IS person|place|thing) [IS friend_of|student_of]
  • 頂点パターンには、personplaceおよびthingの3つのラベルの選択肢があります。これは、頂点パターンがこれらのラベルを持つ任意の頂点と一致する可能性があることを意味します。
  • エッジ・パターンには、friend_ofstudent_ofの2つのラベルの選択肢があります。これは、エッジ・パターンがこれらのラベルを持つ任意のエッジと一致する可能性があることを意味します。

頂点パターンまたはエッジ・パターンに明示的なグラフ・パターン変数がないため、問合せの他の場所ではこの頂点またはエッジを参照できません。

(a IS person|place|thing) [e IS friend_of|student_of] 前述の表エントリと同じです。ただし、頂点パターンおよびエッジ・パターンには、頂点およびエッジ・グラフ・パターン変数としてそれぞれaおよびeが含まれています。そのため、問合せの他の場所にあるグラフ・パターン変数を使用して、それぞれ頂点またはエッジを参照できます。

頂点パターンでラベルの論理和を使用するGRAPH_TABLE問合せについては、例5-12を参照してください。

(a IS person),

(a IS car)

(a)–[e IS L1]->(b),

(a)–[e is L2]->(b)

  • 頂点パターンa IS personは、aがラベルpersonを持つ頂点と一致する必要があることを意味し、頂点パターンa IS carは、aがラベルcarを持つ頂点と一致する必要があることを意味します。したがって、これは、aがラベルとしてpersoncarの両方を持つ頂点と一致する必要があり、実質的にこれら2つの条件のANDであることを表します。また、問合せの他の場所で、頂点をaとして参照することもできます。
  • エッジ・パターンe IS L1は、eがラベルL1を持つエッジと一致する必要があることを意味し、エッジ・パターンe IS L2は、eがラベルL2を持つエッジと一致する必要があることを意味します。したがって、これは、eがラベルとしてL1L2の両方を持つエッジと一致する必要があり、実質的にこれら2つの条件のANDであることを表します。また、問合せの他の場所で、エッジをeとして参照することもできます。

頂点パターンでラベルの論理積を使用するGRAPH_TABLE問合せについては、例5-13を参照してください。

(a IS person WHERE a.name = 'Fred') [e IS student_of WHERE e.subject = 'Arts']
  • 頂点パターンにはラベルpersonおよび頂点グラフ・パターン変数aがあり、これは要素パターンWHERE句で修飾されます。
  • エッジ・パターンにはラベルstudent_ofおよびエッジ・グラフ・パターン変数eがあり、これは要素パターンWHERE句で修飾されます。

要素パターン内で表示される唯一のグラフ・パターン変数は、要素パターンによってローカルに定義されたグラフ・パターン変数です。別の要素パターンのグラフ・パターン変数にはアクセスできません。例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のデータ型は、FLOATBINARY_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_DOUBLEFLOATより優先されるため、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} nmの間(両端を含む)
{, m} 0mの間(両端を含む)
? 0または1

前の表の数量詞の最大上限は10です。

前述の表で説明されている数量詞を使用したGRAPH_TABLE問合せの例については、例5-14を参照してください。

5.3 複雑なパス・パターン

複雑なパス・パターンを使用してSQLプロパティ・グラフを問い合せることができます。

循環パス・パターン

頂点およびエッジ・パス・パターンは循環を形成できます。たとえば、次のグラフ・パターンについて考えてみます:

MATCH (a IS person) -[IS friends]-> (a IS person)

前述のグラフ・パターンは単一のパス・パターンを示し、頂点変数aが2回含まれています。したがって、これによって、afriendsエッジを持つ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を参照してください。

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を参照してください。

5.5 特定のSCNでのGRAPH_TABLE問合せの実行

特定のシステム変更番号(SCN)またはタイムスタンプ値でGRAPH_TABLE問合せを実行できます。

GRAPH_TABLE問合せの最初のオペランドであるグラフ名は、次のいずれかの句に関連付けることができます:

  • AS OF SCN: 例5-17を参照してください
  • AS OF TIMESTAMP: 例5-18を参照してください

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権限が必要です。

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は要素パターン変数abの両方にバインドされています。これは、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 データベースでのサンプル・データの設定

「SQLプロパティ・グラフの作成」に示されているSQLプロパティ・グラフstudents_graphを作成するには、データベースに次のサンプル表とデータを設定する必要があります。
  1. スキーマ・ユーザーとしてデータベースに接続します。
  2. 次のSQLスクリプトを実行して、データベースにサンプル・データを含むuniversitypersonsstudentsおよびfriendships表を作成します。
    CREATE TABLE university (
        id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
        name VARCHAR2(10),
        CONSTRAINT u_pk PRIMARY KEY (id));
    
    INSERT INTO university (name) VALUES ('ABC');
    INSERT INTO university (name) VALUES ('XYZ');
    
    CREATE TABLE persons (
         person_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT
         BY 1),
         name VARCHAR2(10),
         birthdate DATE,
         height FLOAT DEFAULT ON NULL 0,
         hr_data JSON,
         CONSTRAINT person_pk PRIMARY KEY (person_id)
       );
    
    INSERT INTO persons (name, height, birthdate, hr_data)
           VALUES ('John', 1.80, to_date('13/06/1963', 'DD/MM/YYYY'), '{"department":"IT","role":"Software Developer"}');
    
    INSERT INTO persons (name, height, birthdate, hr_data)
           VALUES ('Mary', 1.65, to_date('25/09/1982', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Manager"}');
    
    INSERT INTO persons (name, height, birthdate, hr_data)
           VALUES ('Bob', 1.75, to_date('11/03/1966', 'DD/MM/YYYY'), '{"department":"IT","role":"Technical Consultant"}');
    
    INSERT INTO persons (name, height, birthdate, hr_data)
           VALUES ('Alice', 1.70, to_date('01/02/1987', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Assistant"}');
    
    CREATE TABLE student_of (
          s_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
          s_univ_id NUMBER,
          s_person_id NUMBER,
          subject VARCHAR2(10),
          CONSTRAINT stud_pk PRIMARY KEY (s_id),
          CONSTRAINT stud_fk_person FOREIGN KEY (s_person_id) REFERENCES persons(person_id),
          CONSTRAINT stud_fk_univ FOREIGN KEY (s_univ_id) REFERENCES university(id)
        );
    
    INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (1,1,'Arts');
    INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (1,3,'Music');
    INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (2,2,'Math');
    INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (2,4,'Science');
    
    CREATE TABLE friends (
        friendship_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
        person_a NUMBER,
        person_b NUMBER,
        meeting_date DATE,
        CONSTRAINT fk_person_a_id FOREIGN KEY (person_a) REFERENCES persons(person_id),
        CONSTRAINT fk_person_b_id FOREIGN KEY (person_b) REFERENCES persons(person_id),
        CONSTRAINT fs_pk PRIMARY KEY (friendship_id)
    );
    
    INSERT INTO friends (person_a, person_b, meeting_date) VALUES (1, 3, to_date('01/09/2000', 'DD/MM/YYYY'));
    INSERT INTO friends (person_a, person_b, meeting_date) VALUES (2, 4, to_date('19/09/2000', 'DD/MM/YYYY'));
    INSERT INTO friends (person_a, person_b, meeting_date) VALUES (2, 1, to_date('19/09/2000', 'DD/MM/YYYY'));
    INSERT INTO friends (person_a, person_b, meeting_date) VALUES (3, 2, to_date('10/07/2001', 'DD/MM/YYYY'));

5.8 SQLプロパティ・グラフの問合せでサポートされている機能および制限事項

この項では、SQLプロパティ・グラフの問合せでサポートされている機能とサポートされていない機能のリストを示します。

サポートされている機能

  • グラフ・パターン内のラベル式では、単一のラベル、ラベルなし、ラベルの論理和およびラベルの論理積がサポートされています。詳細は、次を参照してください。
  • 任意の方向エッジ・パターン(MATCH (a)-[e]-(b)がサポートされています。

    例5-7を参照してください。

  • 匿名の頂点(MATCH ()-[e]->())およびエッジ(MATCH (a)-[]->(b))変数がサポートされています。

    例5-8を参照してください。

  • 複雑なパス・パターン問合せがサポートされています。

    例5-9例5-10、および例5-11を参照してください。

  • バインドされた再帰パス・パターン問合せがサポートされています。

    例5-14を参照してください。

  • バインド変数が、WHERE句内でサポートされています。

    例5-15を参照してください。

  • 頂点とエッジをそれぞれ一意に識別するVERTEX_IDおよびEDGE_ID演算子を、SQLのGRAPH_TABLE問合せ内で使用できます。
  • 頂点およびエッジ識別子の一致のためのVERTEX_EQUALおよびEDGE_EQUAL述語がサポートされています。
  • SQLおよびJSON式が、WHERE句およびCOLUMNS句内でサポートされています。

    例4-6を参照してください。

  • JSON簡易構文が、JSONタイプのプロパティにアクセスするためにサポートされています。

    例4-6を参照してください。

  • PL/SQL関数が、WHERE句またはCOLUMNS句内でサポートされています。

    例5-16を参照してください。

  • グラフ問合せ内では、単一行および複数行のコメントがサポートされています。
  • グラフ名、別名、グラフ要素パターン変数名、ラベル、プロパティ名など、GRAPH_TABLE問合せ内のすべての識別子は、大/小文字の区別に関する標準のSQLルールに従っています:
    • 二重引用符内の識別子では大文字と小文字が区別されます。
    • 二重引用符で囲まれていない識別子は、暗黙的に大文字に変換され、二重引用符で囲まれます。
  • SQLヒントは、チューニングのためにGRAPH_TABLE問合せの内外でサポートされています。

    詳細は、「SQLプロパティ・グラフ問合せのチューニング」を参照してください。

  • 必要な権限がある場合は、別のスキーマで定義されたグラフを問い合せることができます。

    詳細は、「SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与」を参照してください。

制限事項

  • 可変長パターン一致の目標(ANYALLALL SHORTESTANY CHEAPESTなど)はサポートされていません。
  • パス・パターン変数(MATCH p = (n)-[e]->(m))はサポートされていません。
  • COSTTOTAL_COSTなどの句はサポートされていません。
  • インライン副問合せおよびLATERALインライン・ビューはサポートされていません。
  • SQLマクロはサポートされていません。

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

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になります。

5.11 SQL Developerを使用したSQLプロパティ・グラフの表示および問合せ

SQL Developer 23.1を使用すると、「接続」ナビゲータの「プロパティ・グラフ」ノードの下にある「SQLプロパティ・グラフ」を展開して、データベース・スキーマに存在するすべてのSQLプロパティ・グラフを表示できます。

図5-1 SQL DeveloperでのSQLプロパティ・グラフ

図5-1の説明が続きます
「図5-1 SQL DeveloperでのSQLプロパティ・グラフ」の説明

次のステップは、SQLプロパティ・グラフに対するグラフ問合せの実行例を示しています。

  1. 任意のSQLプロパティ・グラフをクリックします。
    これにより、別のタブでSQLワークシートが開きます。
  2. SQLワークシートで1つ以上のグラフ問合せを実行します。
    たとえば:

    図5-2 SQL DeveloperでのGRAPH_TABLE問合せの実行

    図5-2の説明は図の下のリンクをクリックしてください。
    「図5-2 SQL DeveloperでのGRAPH_TABLE問合せの実行」の説明