# セマンティック リンク

通常は、目的の項目値をクリックすることで、明示的に選択を行います。一方、セマンティック リンクを使用して、間接的に選択を行う方法もあります。セマンティック リンクは、項目値に似ていますが、オブジェクト自体ではなく、オブジェクト間の関係を表す点が異なります。セマンティック リンクは、ボタンのリストとして表示されます。

セマンティック リンクをクリックすると、他の項目で選択が行われます。

## セマンティック テーブルのルール

情報メモセマンティック テーブルは、テーブル ビューアーでは表示されません。

セマンティック リンクは、オブジェクト間のリレーションを含むテーブルをロードすることで作成されます。

* このテーブルは、厳密に3つまたは4つの列を含む必要があります。
* セマンティック テーブルには、異なる項目の項目値間のリレーション、または同じ項目の項目値間のリレーションのいずれかが含まれる必要があります。この2つを混在させることはできません。
* セマンティック テーブルをロードする LOAD または SELECT ステートメントは、その前に semantic 修飾子を使用して、論理テーブルでないことを示す必要があります。

通常は、4つの列が使用されます。1列目には、他の項目値へのリレーションを持つ項目値が含まれ、3列目には、関連付けられた項目値が含まれます。2列目には、リレーションの名前が含まれる必要があります。4列目には、逆リレーションの名前が含まれる必要があります。

3つの列を使用する場合は、逆リレーションの明示的な名前は指定できません。2列目に提供された名前がリレーションと逆リレーションの両方で使用されます。この名前の前または後に矢印が付けられます。

同じ項目内の項目値間にリレーションが存在する場合、1列目と3列目は同じ名前にする必要があります。また、2列目と4列目の名前、つまりリレーションのタイプ も同じにする必要があります。ただし、リレーションが異なる項目の項目値間のものである場合は、すべての列は相互に異なる名前である必要があります。

## データからのセマンティック テーブルの抽出

セマンティック テーブルは、必ずしも QlikView の外部のテーブルとして存在する必要はありません。個別の LOAD ステートメントを使用して、オブジェクトの既存のテーブルからこのテーブルを抽出する方が柔軟性は高くなります。

presidents のサンプル ディレクトリに含まれる QlikView の例では、Predecessor (前任者) および Successor (後任者) リンクを生成するためのスクリプトは次のようになります。

`Directory presidents;` `LOAD * from presdnts.csv (ansi, txt, delimiter` `is ',', embedded labels);` `Semantic LOAD` `No -1 as No,` `'Successor' as Relation,` `No,` `'Predecessor' as Relation` `from presdnts.csv (ansi, txt, delimiter is ',',` `embedded labels) where No > 1;`

2つ目の LOAD ステートメントは、右の図のようなテーブルを生成します。このテーブルはセマンティック テーブルとしてロードされます。最初のレコードでは、存在しない0番目の社長に最初の社長がリンクされるため、where 句を使用して最初のレコードを取り除きます。

この LOAD ステートメントには、No というラベルの2つの項目と Relation というラベルの2 つの項目が含まれることにも注目してください。このような LOAD ステートメントを使用して内部テーブルをロードすると、スクリプト実行エラーが発生します。1つの内部テーブルのロード手順では、同じ名前の項目が存在していないことが要求されるためです。同様に、このような SELECT ステートメントも、ほとんどの ODBC ドライバの要件に合わせるため、使用できません。代わりに、presidents テーブルがデータベース内に存在する場合は、次の構造を使用してください。

`Connect to DataBase;` `SELECT * from presdnts;` `Alias No2 as No, Relation2 as Relation;` `Semantic SELECT` `No -1 as No,` `'Successor' as Relation,` `No as No2,` `'Predecessor' as Relation2` `from presdnts where No > 1;`

presidentsの例は、セマンティック リンクを使用するための単なる一例です。これらのセマンティック リンクは、家系図でも使用できます。この場合、セマンティック リンクは、いとこ(cousin)、兄弟姉妹(sibling)、祖母 (grandmother)などになります。会社における社員の場合、セマンティック リンクは、superior（上役）、reports to（直属の上司）、secretary（秘書）などになります。

## 関連する値をリレーション名として使用する

関連する項目値をリレーションの名前として使用すると、よりわかりやすくなる場合があります。社長(presidents)の例では、すべての前任者(predecessor)を1つの列に含め、すべての後任者(successor)を別の列に含めることができます。

これらのリンクを作成するには次のロード スクリプトが必要です。

`LOAD` `No as DuplicateOfNo,` `FirstName & ' ' & LastName as Name,` `*` `from presdnts.csv;` `Semantic LOAD` `No -1 as No,` `FirstName & ' ' & LastName as Successor,` `No as DuplicateOfNo,` `'Dummy1'` `from presdnts.csv where No > 1;` `Semantic LOAD` `No +1 as No,` `FirstName &' ' & LastName as Predecessor,` `No as DuplicateOfNo,` `'Dummy2'` `from presdnts.csv;`

セマンティック リンクをクリックすると、3 列目の項目 DuplicateOfNo が選択されます。これは常に、セマンティック テーブルでセマンティック リンクに表示される社長の数です。

最初は明確に認識することができない可能性がありますが、上記のコンストラクション内の逆リレーションはほとんど役にたちません。これらは社長の名前を表示し、クリックされると、表示されている社長の前任者/後継者が選択されます。これが Dummy1 および Dummy2 と呼ばれている理由であり、最初のリレーション（2列目）だけが使用されます。

リスト ボックスにダミー リレーションが表示されるのを避けるために、2列目と4列目を異なるタイプのリレーションとして処理する必要があります。つまり、1列目と3列目を異なる項目名にする必要があります。そのために、社長の数を含む No と DuplicateOfNo の2つの列を使用しています。

リレーションを含む2つの異なるリスト ボックスが必要なので、2つの異なる semantic ステートメントが必要です。

この例は、3列のセマンティック テーブルでも実行できますが、ほとんどの場合、逆リレーションを含むリスト ボックスは、ユーザーを混乱させる可能性があります。