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

SQLグラフ問合せのGRAPH_TABLE演算子には、グラフ・パターンが含まれます。

グラフ・パターンは、入力グラフ名とGRAPH_TABLE演算子内のCOLUMNS句の間に表されます。

グラフ・パターンには、頂点パターンおよびエッジ・パターンで構成される1つ以上のカンマ区切りのパス・パターンが含まれます。たとえば、次のパス・パターンには2つの頂点パターンと1つのエッジ・パターンがあります。

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

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

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

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

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

脚注1

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

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

関連項目:

『Oracle Database 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]
  • 頂点グラフ・パターン変数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が含まれています。そのため、問合せの他の場所にあるグラフ・パターン変数を使用して、それぞれ頂点またはエッジを参照できます。

例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として参照することもできます。

例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つ以上の表の一部です。
  • プロパティにアクセスするには、常にグラフ変数名を使用する必要があります。
  • 問合せのコンパイル時に、特定のタイプ・チェック・ルールが頂点またはエッジ表のプロパティに適用されます。詳細は、「プロパティ・タイプを決定するためのタイプ互換性ルール」を参照してください。

次の例では、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を問い合せる場合、次の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