複合型の処理: 例¶
タイトルとさまざまな著者で書籍をモデル化するリレーションを定義するものとします。以下の属性を使用できます。
TITLE
: 単純型 (text
)。AUTHOR
: 複合型。より具体的には、さまざまな著者がおり、著者ごとにその名と姓、連絡先住所のリストを表すものとします。前述のように、array 型はサブリレーションをモデル化するので、register 型を使用してこのリレーションのスキーマを示す必要があります。したがって、サブリレーションAUTHOR
には、単純型NAME
およびSURNAME
のサブ属性と、連絡先住所のリストを格納するその他の array 型複合属性 (CONTACT
) が含まれる、関連付けられた register 型があることになります。CONTACT
は別のサブリレーションを表し、サブ属性MAIL
とADDRESS
で構成されるスキーマを使用します。MAIL
は単純型で、ADDRESS
はサブ属性STREET
、PLACE
、およびCOUNTRY
で構成される register です。
「 Trees of compound elements 」に、型 AUTHOR
のツリーを示します。型 AUTHOR
のエレメントを表すデータ型は、以下のステートメントを使用して作成できます。
CREATE TYPE address AS REGISTER OF (
STREET:text,
CITY:text,
COUNTRY:text
);
CREATE TYPE contactAddress AS REGISTER OF (
MAIL:text,
ADDRESS:address
);
CREATE TYPE contactAddressArray AS ARRAY OF contactAddress;
CREATE TYPE author AS REGISTER OF (
NAME:text,
SURNAME:text,
CONTACTADDRESS:contactAddressArray
);
CREATE TYPE authorArray AS ARRAY OF author;

複合エレメントのツリー¶
「 Tuple with compound elements 」は、このビューのタプルとその内部表現の例を示しています。
TITLE |
AUTHOR |
|||||
---|---|---|---|---|---|---|
Book |
NAME |
SURNAME |
CONTACTADDRESS |
|||
Name 1 |
Surname1 |
ADDRESS |
||||
Author1@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street1 |
City1 |
Country1 |
||||
ADDRESS |
||||||
Author2@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street2 |
City2 |
Country2 |
||||
NAME |
SURNAME |
CONTACTADDRESS |
||||
Name 3 |
Surname3 |
ADDRESS |
||||
Author3@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street3 |
City3 |
Country3 |
||||
ADDRESS |
||||||
Author4@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street4 |
City4 |
Country4 |
||||
TITLE |
AUTHOR |
|||||
Book |
NAME |
SURNAME |
CONTACTADDRESS |
|||
Name 1 |
Surname1 |
ADDRESS |
||||
Author1@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street1 |
City1 |
Country1 |
||||
ADDRESS |
||||||
Author2@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street2 |
City2 |
Country2 |
||||
NAME |
SURNAME |
CONTACTADDRESS |
||||
Name 3 |
Surname3 |
ADDRESS |
||||
Author3@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street3 |
City3 |
Country3 |
||||
ADDRESS |
||||||
Author4@authors.com |
STREET |
CITY |
COUNTRY |
|||
Street4 |
City4 |
Country4 |
「 Tree of Compound-type values 」に、値ツリーの構造を示します。

複合型値のツリー¶
このリレーションをモデル化する基本リレーションを作成できます。
CREATE TABLE BOOK I18N es_euro (
TITLE:text (SEARCH),
AUTHOR:authorArray
);
また、リレーションの ラッパー を作成する必要もあります。ここでも同じように、 ラッパー によって返されるデータのスキーマは、リレーションのスキーマと互換性がなければならない点に注意してください。つまりこの場合、 ラッパー では、データが複合値の形式で返される必要があります。
注釈
複合型、ラッパー、および基本ビューを手動で作成しなくても済むように、Administration Tool を使用してデータソースをインポートし、基本ビューを作成することを強くお勧めします。
たとえば、次の図は、XML ラッパーを作成して必要なデータを取得するための VQL 文の一部を示しています。定義された出力スキーマがリレーションのスキーマとどのように互換性があるかに注意してください。
CREATE WRAPPER XML BOOK_sm1
OUTPUTSCHEMA (
TITLE,
AUTHOR : ARRAY OF
AUTHOR : REGISTER OF (
NAME,
SURNAME,
CONTACTADDRESS : ARRAY OF
CONTACTADDRESS : REGISTER OF (
MAIL,
ADDRESS : ARRAY OF
ADDRESS : REGISTER OF (
STREET,
CITY,
COUNTRY
)
)
)
)
... Wrapper definition ...;
ラッパー を作成したら、 BOOK
リレーションに検索メソッドを定義できます (「 基本ビューの変更 」を参照)。ほとんどの場合、クエリ制限は単純データ型を示す URI に対してのみ定義します (このことは、複合型属性がサブリレーションであるかのようにみなされるという事実と一致します)。ただし、複合型を示す URI に制限を追加することもできます (この場合、条件の右側のオペランドをコンストラクター ROW
と { }
を使用して作成すること、および演算子 =
と <>
のみが使用可能です)。次の文は、使用可能な検索メソッドを追加します (複合 URI AUTHOR.CONTACTADDRESS
に対する制限が含まれている点に注意してください)。
ALTER TABLE BOOK
ADD SEARCHMETHOD BOOK_SM1 (
CONSTRAINTS (
ADD TITLE NOS ZERO ()
ADD AUTHOR.NAME NOS ZERO ()
ADD AUTHOR.SURNAME NOS ZERO ()
ADD AUTHOR.CONTACTADDRESS NOS ZERO ()
ADD AUTHOR.CONTACTADDRESS.MAIL NOS ZERO ()
ADD AUTHOR.CONTACTADDRESS.ADDRESS.STREET NOS ZERO ()
ADD AUTHOR.CONTACTADDRESS.ADDRESS.CITY NOS ZERO ()
ADD AUTHOR.CONTACTADDRESS.ADDRESS.COUNTRY NOS ZERO ()
)
OUTPUTLIST (TITLE, AUTHOR)
WRAPPER (xml book)
);
注釈
条件クエリに複合属性の URI を指定する場合、テーブル名と属性名の区別が曖昧になるのを避けるために、属性名を括弧で囲んで指定します。
最後に、このリレーションに対して実行できるクエリの例をいくつか示します。
タイトルに「java」という語を含むすべての書籍のタイトルと著者名を取得します。
SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST FROM BOOK WHERE TITLE like '%java%' GROUP BY TITLE;
タイトルに「java」という語を含む書籍のタイトルと各著者の連絡先住所のリストを検索します。
SELECT TITLE, LIST((AUTHOR).CONTACTADDRESS) AS AUTHORLIST FROM BOOK WHERE TITLE like '%java%' GROUP BY TITLE
タイトルに「java」という語を含むすべての書籍のタイトルと各著者の第 1 メールアドレスを検索します。
SELECT TITLE,LIST((AUTHOR).CONTACTADDRESS[0].MAIL) AS AUTHORLIST FROM BOOK WHERE TITLE like '%java%' GROUP BY TITLE
タイトルに「java」という語を含み、
.es
という語を含むメールアドレスを持つ著者が 1 人以上いるすべての書籍のタイトルと各著者の名前を検索します。SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST FROM BOOK WHERE (TITLE like '%java%') AND ((AUTHOR).CONTACTADDRESS.MAIL like '%.es%' ) GROUP BY TITLE
タイトルに「java」という語を含み、住所に
Real
が含まれる著者が 1 人以上いるすべての書籍のタイトルと各著者の名前を検索します。SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST FROM BOOK WHERE (TITLE like '%java%') AND ((AUTHOR).CONTACTADDRESS.ADDRESS.STREET like '%Real%') GROUP BY TITLE
連絡先住所が 1 つで、メールアドレスが
john@mail.com
で、市区町村Madrid (Spain)
の番地Real
に住んでいる著者によって書かれた書籍を検索します。SELECT TITLE, AUTHOR FROM BOOK WHERE (AUTHOR).CONTACTADDRESS = { ROW('john@mail.com',{ROW('Real', 'Madrid', 'Spain')}) }