1ホップパターンの反復

一般的な反復パターンにステップを2回繰り返すパターンの「友達の友達」があります。そのほか、メッセージを3ホップ先まで流すとして、メッセージの受信者の数はどのくらいになるだろうか。有名人と既存の結びつきがあるだろうか、など。

GSQLパターンマッチングを使えば、このような1ホップの繰り返しで構成される可変長のパターンが簡単に表現できます。エッジのパターンにアスタリスク記号(正規表現で言うならばクリーネ閉包)と任意の min..max レンジを付加する以外は、前のセクションで紹介した内容です。

  • (E*) は、エッジタイプEが任意の回数繰り返されることを意味します。(ゼロ回も含まれるので注意してください。)

  • (E*1..3) は、エッジタイプEが1回から3回まで反復されることを意味します。

次にもう少し詳しい例を挙げます。

  • 1ホップスターパターン — エッジパターンのゼロ回以上の反復

    1. FROM X:x - (E*) - Y:y

    2. FROM X:x - (F>*) - Y:y

    3. FROM X:x - (<G*) - Y:y

    4. FROM X:x - (_*) - Y:y

      • 各反復において、任意の無向性のエッジが選択できます。

    5. FROM X:x - (_>*) - Y:y

      • 各反復において、任意の右向きのエッジが選択できます。

    6. FROM X:x - (<_*) - Y:y

      • 各反復において、任意の左向きのエッジが選択できます。

    7. FROM X:x - ((E|F>|<G)*) - Y:y

      • 各反復において、E、F>、<G のうちの1つが選択できます。

  • 限度のある1ホップスターパターン

    1. FROM X:x - (E*2..) - Y:y

      • 下限のみ設定。エッジEが少なくとも2回繰り返されるチェーン。

    2. FROM X:x - (F>*..3) - Y:y

      • 上限のみ設定。エッジFが0~3回繰り返されるチェーン。

    3. FROM X:x - (<G*3..5) - Y:y

      • 上限と下限両方設定。エッジGが3~5回繰り返されるチェーン。

    4. FROM X:x - ((E|F>|<G)*3) - Y:y

      • 回数規定。エッジ反復が3回と規定されているチェーン。各反復において、エッジは、E、F>、<Gのいずれか。

コメント

  • スターマークが付加されているエッジのエイリアスは無効 スターマークを使う場合には、エッジのエイリアスは使えません。エッジの数が可変である場合、エイリアスをパターン内の特定のエッジと関連付けたり、結び付けたりすることができないためです。

  • 最短経路のマッチング スターマークを使ってエッジが反復されている場合、最短経路で発見されたマッチングが選択されます。次の例をご覧ください。

Figure 2 Shortest Path Illustration.

図2で示している 1 - (E>*) - 4 のパターンでは、次の3種類のパスで4から1に到達することができます。

  • 1→2→3→4

  • 1→2→3→5→6→2→3→4

  • 2→3→5→6→2 のサイクルを2回以上繰り返して、3で飛び出すパス

1番上のパスが最も短いので、唯一のマッチと見なされます。

可変ホップクエリの例

このチュートリアルでは、TigerGraph 2.4で導入されたGSQLのインタプリタモードを使います。インタプリタモードではインストールステップを省略し、クエリを作成すると同時に実行し、インタラクティブなエクスペリエンスを提供することができます。ワンステップで実行できるインタプリタモードのクエリは、名前なし(無名)、パラメーターなしで、SQLと全く同じです。

例1 「TennisPlayer」という名前のTagClassの直接または間接のスーパークラス (自己クラスを含む) を求める。

例1. 有向エッジパターン、無限回反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2 {

  TagClass1 =  SELECT t
               FROM TagClass:s - (IS_SUBCLASS_OF>*) - TagClass:t
               WHERE s.name == "TennisPlayer";

    PRINT  TagClass1;
}

以上のGSQLスクリプトをexample1.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example1.gsql

なお、次の例で、クエリを開始する頂点TennisPlayerは、ホップ数ゼロ回のパスを使った場合でもマッチしていることに留意してください。

  1. 例1の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [{"TagClass2": [
    {
      "v_id": "211",
      "attributes": {
        "name": "Person",
        "id": 211,
        "url": "http://dbpedia.org/ontology/Person"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "0",
      "attributes": {
        "name": "Thing",
        "id": 0,
        "url": "http://www.w3.org/2002/07/owl#Thing"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "149",
      "attributes": {
        "name": "Athlete",
        "id": 149,
        "url": "http://dbpedia.org/ontology/Athlete"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "59",
      "attributes": {
        "name": "TennisPlayer",
        "id": 59,
        "url": "http://dbpedia.org/ontology/TennisPlayer"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "239",
      "attributes": {
        "name": "Agent",
        "id": 239,
        "url": "http://dbpedia.org/ontology/Agent"
      },
      "v_type": "TagClass"
    }
  ]}]
}

例2 「TennisPlayer」という名前のTagClassの直属スーパークラスを求める。(1ホップ反復なしのパターンと同じです。)

例2. 有向エッジの1回反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2 {

  TagClass1 =  SELECT t
               FROM TagClass:s - (IS_SUBCLASS_OF>*1) - TagClass:t
               WHERE s.name == "TennisPlayer";

  PRINT TagClass1;
}

以上のGSQLスクリプトをexample2.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example2.gsql
  1. 例2の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [{"TagClass2": [{
    "v_id": "149",
    "attributes": {
      "name": "Athlete",
      "id": 149,
      "url": "http://dbpedia.org/ontology/Athlete"
    },
    "v_type": "TagClass"
  }]}]
}

例3. 「TennisPlayer」という名前のTagClassの1~2ホップで到達できる直接と間接のスーパークラスを求める。

例3. 有向エッジの1~2回の反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2 {

  TagClass1 =  SELECT t
               FROM TagClass:s - (IS_SUBCLASS_OF>*1..2) - TagClass:t
               WHERE s.name == "TennisPlayer";

    PRINT  TagClass1;
}

以上のGSQLスクリプトをexample3.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example3.gsql
  1. 例3の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [{"TagClass2": [
    {
      "v_id": "149",
      "attributes": {
        "name": "Athlete",
        "id": 149,
        "url": "http://dbpedia.org/ontology/Athlete"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "211",
      "attributes": {
        "name": "Person",
        "id": 211,
        "url": "http://dbpedia.org/ontology/Person"
      },
      "v_type": "TagClass"
    }
  ]}]
}

例4 「TennisPlayer」という名前のTagClassの2ホップ以内で到達できるスーパークラスを求める。

例4. 有向エッジの2回以内の反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2 {

  TagClass1 =  SELECT t
               FROM TagClass:s - (IS_SUBCLASS_OF>*..2) - TagClass:t
               WHERE s.name == "TennisPlayer";

    PRINT  TagClass1;
}

以上のGSQLスクリプトをexample4.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example4.gsql
  1. 例4の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [{"TagClass2": [
    {
      "v_id": "211",
      "attributes": {
        "name": "Person",
        "id": 211,
        "url": "http://dbpedia.org/ontology/Person"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "149",
      "attributes": {
        "name": "Athlete",
        "id": 149,
        "url": "http://dbpedia.org/ontology/Athlete"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "59",
      "attributes": {
        "name": "TennisPlayer",
        "id": 59,
        "url": "http://dbpedia.org/ontology/TennisPlayer"
      },
      "v_type": "TagClass"
    }
  ]}]
}

例5 「TennisPlayer」という名前のTagClassの1ホップ以上で到達できるスーパークラスを求める。

例5. 有向エッジの少なくとも1回の反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2 {

  TagClass1 =  SELECT t
               FROM TagClass:s - (IS_SUBCLASS_OF>*1..) - TagClass:t
               WHERE s.name == "TennisPlayer";

    PRINT  TagClass1;
}

以上のGSQLスクリプトをexample5.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example5.gsql
  1. 例5の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [{"TagClass2": [
    {
      "v_id": "211",
      "attributes": {
        "name": "Person",
        "id": 211,
        "url": "http://dbpedia.org/ontology/Person"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "0",
      "attributes": {
        "name": "Thing",
        "id": 0,
        "url": "http://www.w3.org/2002/07/owl#Thing"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "149",
      "attributes": {
        "name": "Athlete",
        "id": 149,
        "url": "http://dbpedia.org/ontology/Athlete"
      },
      "v_type": "TagClass"
    },
    {
      "v_id": "239",
      "attributes": {
        "name": "Agent",
        "id": 239,
        "url": "http://dbpedia.org/ontology/Agent"
      },
      "v_type": "TagClass"
    }
  ]}]
}

例6 Viktor Akhiezerが作成した、または「いいね!」した最新のコメント3件を探す。また、Viktor Akhiezerと関連する(作成した、またはいいね!した)コメントの総数を求める。

例6. 離接的な有向エッジの1回反復
USE GRAPH ldbc_snb

INTERPRET QUERY () SYNTAX v2{
  SumAccum<INT> @@commentCnt = 0;

  # Viktor Akhiezerが作成した、またはいいね!した最新のコメント3件を検索し
  # Viktor Akhiezerと関連するコメントの総数を求めます
  Top3Comments = SELECT p
                 FROM Person:s - ((<HAS_CREATOR|LIKES>)*1) - Comment:p
                 WHERE s.firstName == "Viktor" AND s.lastName == "Akhiezer"
                 ACCUM @@commentCnt += 1
                 ORDER BY p.creationDate DESC
                 LIMIT 3;

  PRINT Top3Comments;
  # Viktor Akhiezerと関連するコメントの総数
  PRINT  @@commentCnt;
}

以上のGSQLスクリプトをexample6.qsglと名付けたファイルにコピーしスクリプトファイルとし、Linuxから呼び出すことができます。

Linuxバッシュ
gsql example6.gsql
  1. 例6の出力

Using graph 'ldbc_snb'
{
  "error": false,
  "message": "",
  "version": {
    "schema": 0,
    "edition": "enterprise",
    "api": "v2"
  },
  "results": [
    {"Top3Comments": [
      {
        "v_id": "2061584720640",
        "attributes": {
          "browserUsed": "Chrome",
          "length": 4,
          "locationIP": "194.62.64.117",
          "id": 2061584720640,
          "creationDate": "2012-09-06 06:46:31",
          "content": "fine"
        },
        "v_type": "Comment"
      },
      {
        "v_id": "2061586872389",
        "attributes": {
          "browserUsed": "Chrome",
          "length": 90,
          "locationIP": "31.216.177.175",
          "id": 2061586872389,
          "creationDate": "2012-08-28 14:54:46",
          "content": "About Hector Berlioz, his compositions Symphonie fantastique and GraAbout Who Knew, the gu"
        },
        "v_type": "Comment"
      },
      {
        "v_id": "2061590804929",
        "attributes": {
          "browserUsed": "Chrome",
          "length": 83,
          "locationIP": "194.62.64.117",
          "id": 2061590804929,
          "creationDate": "2012-09-04 16:16:56",
          "content": "About Muttiah Muralitharan, mit by nine degrees, five degrees being thAbout Steve M"
        },
        "v_type": "Comment"
      }
    ]},
    {"@@commentCnt": 152}
  ]
}