uCosminexus DocumentBroker Version 3 クラスライブラリ C++ 解説

[目次][用語][索引][前へ][次へ]

4.6.1 属性検索

ここでは,属性検索(プロパティを指定した検索)でのedmSQLの指定例を示します。

<この項の構成>
(1) 指定例で使用するクラスとプロパティ
(2) 一つのクラスに対して実行する属性検索
(3) 結合したクラスに対して実行する属性検索
(4) 副問い合わせを実行する属性検索
(5) 検索結果を取得する順序を指定した属性検索
(6) VariableArray型プロパティを指定した属性検索
(7) 集合関数を指定した属性検索
(8) グループ分けをする属性検索

(1) 指定例で使用するクラスとプロパティ

この指定例で検索の対象になる文書は,次のようなクラスから作成された文書です。

文書X
Document Xクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表4-43 Document Xクラスのプロパティ

プロパティ識別子 内容
DocCode 文書を管理するためのコード
Title タイトル
Author 著者
AuthorId 著者ID
Publisher 出版元
Abstract 概要
CreateDate 作成日

所有書一覧
OwnersListクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表4-44 OwnersListクラスのプロパティ

プロパティ識別子 内容
DocCode 文書を管理するためのコード
Owner 所有者

辞書Y
Dictionary Yクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表4-45 Dictionary Yクラスのプロパティ

プロパティ識別子 内容
Name 名前
Birthday 誕生日
EntryId エントリーID

論文
myPaperクラスを基に作成された文書です。次の表に示すプロパティが設定されています。

表4-46 myPaperクラスのプロパティ

プロパティ識別子 内容
Title タイトル
Authors Name 名前
Org 所属

注※
VariableArray型プロパティです。

(2) 一つのクラスに対して実行する属性検索

ここでは,一つのクラスに対して実行する属性検索の指定例を示します。

(a) SELECT句とFROM句だけを指定する検索

<検索対象>としてDocument Xクラスを,<選択項目>としてTitleプロパティ,AuthorプロパティおよびAbstractプロパティを取得する例を示します。

指定例
SELECT Title,Author,Abstract
FROM   "Document X"
(b) SELECT句,FROM句およびWHERE句を指定する検索

(a)に加えて,検索条件としてWHERE句に「Authorプロパティが『日立太郎』で,CreateDateプロパティが20000101より大きい」という条件を指定する例を示します。

指定例
SELECT Title,Author,Abstract
FROM "Document X"
WHERE Author = '日立太郎' AND CreateDate > '20000101'
(c) 重複排除を指定する検索

Document Xクラスから,Authorプロパティを,重複を排除して取得する例を示します。

指定例
SELECT DISTINCT Author
FROM "Document X"
(d) 検索条件としてOIIDを指定した検索

Document Xクラスから作成された文書から,OIIDを指定して,Titleプロパティ,AuthorプロパティおよびAbstractプロパティを取得する例を示します。なお,OIIDは,oiid関数を使用して指定します。

指定例
SELECT Title,Author,Abstract
FROM "Document X"
WHERE dmaProp_OIID = oiid('dma:///xxx/xxx/xxxxxxxxxx...xxx')

(3) 結合したクラスに対して実行する属性検索

ここでは,複数のクラスを結合した検索対象クラスに対して実行する属性検索の指定例を示します。

なお,edmSQLで実行できる結合の方法には,次の2種類があります。

なお,実現できる結合の種類については,データベースに従います。

それぞれの場合の指定例を示します。

(a) 二つのクラスを内部結合した検索

Document XクラスとOwnersListクラスを内部結合して,Document Xクラスの文書のTitleプロパティ,Document XクラスのAuthorプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。ここでは,次の二つの方法の指定例を示します。

結合するときには,Document XクラスのDocCodeプロパティとOwnersListクラスのDocCodeプロパティが一致することを条件とします。

なお,Document Aクラスの<相関名>としてDX,OwnersListクラスの<相関名>としてOLを使用します。

FROM句に<クラス指定>を並べて内部結合して,結合の条件をWHERE句に指定する方法
次のように指定します。
指定例
SELECT DX.Title,DX.Author,OL.Owner 
FROM "Document X" DX, OwnersList OL
WHERE DX.DocCode = OL.DocCode

INNER JOINを使用して二つのクラスの結合を指定する検索
次のように指定します。
指定例
SELECT DX.Title,DX.Author,OL.Owner
FROM   "Document X" DX INNER JOIN OwnersList OL
           ON DX.DocCode = OL.DocCode
 
(b) 三つのクラスを内部結合した検索

Document Xクラス,OwnersListクラスおよびDictionary Yクラスを結合して,Document XクラスのTitleプロパティとDocument XクラスのAuthorプロパティ,Dictionary YクラスのBirthdayプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。ここでは,次の二つの方法の指定例を示します。

結合するときには,Document XクラスのDocCodeプロパティとOwnersListクラスのDocCodeプロパティが一致することと,Document XクラスのAuthorIdプロパティとDictionary YクラスのEntryIdプロパティが一致することを条件とします。

FROM句に<クラス指定>を並べて内部結合して,結合の条件をWHERE句に指定する方法
次のように指定します。
指定例
SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM  "Document X" DX,
             OwnersList OL,"Dictionary Y" DY
WHERE  DX.DocCode = OL.DocCode
 AND DX.AuthorId = DY.EntryId
 

INNER JOINを使用して三つのクラスの結合を指定する検索
次のように指定します。
指定例
SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM ("Document X" HD INNER JOIN OwnersList OL 
 ON DX.DocCode = OL.DocCode)
 INNER JOIN "Dictionary Y" DY
  ON DX.AuthorId = DY.EntryId
(c) 二つのクラスを外部結合した検索

Document XクラスとOwnersListクラスを外部結合して,Document Xクラスの文書のTitleプロパティとDocument XクラスのAuthorプロパティおよびOwnersListクラスのTitleプロパティを取得する例を示します。

次のように指定します。

指定例
SELECT DX.Title,DX.Author,OL.Owner
FROM "Document X" DX LEFT OUTER JOIN OwnersList OL
        ON DX.DocCode = OL.DocCode
(d) 三つのクラスを外部結合した検索

Document Xクラス,OwnersListクラスおよびDictionary Yクラスを外部結合して,Document XクラスのTitleプロパティ,Document XクラスのAuthorプロパティ,Dictionary YクラスのBirthdayプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。

指定例
SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM ("Document X" DX LEFT OUTER JOIN OwnersList OL 
    ON DX.DocCode = OL.DocCode) LEFT OUTER JOIN 
  "Dictionary Y" DY ON DX.AuthorId = DY.EntryId
 

(4) 副問い合わせを実行する属性検索

ここでは,副問い合わせを指定する場合の属性検索の指定例を示します。

(a) 比較述語を指定した副問い合わせ

OIIDがわかっているDocument XクラスのオブジェクトのCreateDateプロパティよりも,Birthdayプロパティが新しい(値が大きい)Dictionary Yクラスのオブジェクトの,NameプロパティとBirthdayプロパティを取得する例を示します。

指定例
SELECT Name, Birthday
FROM "Dictionary Y"
WHERE  Birthday > (SELECT CreateDate
        FROM "Document X"
        WHERE dmaProp_OIID = 
               oiid( 'dma:///xxx/xxx/xxxxxxxxxx...xxx'))
 
(b) IN述語を指定した副問い合わせ

CreateDateプロパティが19990101よりも値が大きいDocument XクラスのオブジェクトのAuthorIdプロパティのどれかと,Dictionary YクラスのEntryIdプロパティの値が等しい,Dictionary YクラスのオブジェクトのNameプロパティとBirthdayプロパティを取得する例を示します。

指定例
SELECT Name, Birthday
FROM "Dictionary Y"
WHERE EntryId IN (SELECT AuthorId
                      FROM "Document X"
                      WHERE CreateDate > '19990101')
(c) EXISTS述語を指定した副問い合わせ

Dictionary YクラスのオブジェクトのNameプロパティとDocument XクラスのオブジェクトのAuthorプロパティが一致する文書が一つでもあれば,そのDictionary Yクラスの文書のNameプロパティとBirthdayプロパティを取得する例を示します。

指定例
SELECT Name, Birthday
FROM "Dictionary Y" DY
WHERE EXISTS (SELECT *
                   FROM "Document X" DX
                   WHERE DY.Name = DX.Author)

(5) 検索結果を取得する順序を指定した属性検索

ここでは,取得する検索結果の順序を指定する場合の属性検索の指定例を示します。

Document Xクラスの文書のうち,CreateDateプロパティの値が20000101よりも大きいオブジェクトを検索して,Titleプロパティ,Authorプロパティ,およびCreateDateプロパティを取得します。このとき,Authorプロパティによって昇順に並び替え,その中でCreateDateプロパティで降順に並び替えて検索結果を取得する例を示します。まず,並び替えのキーとしてソート項目指定番号を指定する例を示します。ソート項目番号は,AuthorプロパティはSELECT句で2番目に指定されているので「2」,CreateDateプロパティはSELECT句で3番目に指定されているので「3」になります。

指定例
SELECT Title,Author,CreateDate
FROM "Document X"
WHERE CreateDate > '20000101'
ORDER BY 2 ASC,3 DESC

これを,プロパティ名で指定すると,次のようになります。

指定例
SELECT Title,Author,CreateDate
FROM "Document X"
WHERE CreateDate > '20000101'
ORDER BY Author ASC,CreateDate DESC

(6) VariableArray型プロパティを指定した属性検索

ここでは,VariableArray型のプロパティの検索方法について説明します。

(a) VariableArray型のプロパティを取得する検索

ここでは,myPaperクラスのVariableArray型プロパティであるAuthorsプロパティを取得する例を示します。

指定例
SELECT Title,Authors
FROM myPaper
WHERE CreateDate > '20000101'
(b) VariableArray型プロパティの要素の値を指定した検索

ここでは,myPaperクラスのVariableArray型プロパティであるAuthorsプロパティの,Orgプロパティが「日立製作所」であるオブジェクトのTitleプロパティとAuthorsプロパティを取得します。

指定例
SELECT Title,Authors
FROM myPaper
WHERE Authors[ANY].Org = '日立製作所'

(7) 集合関数を指定した属性検索

ここでは,COUNT(*)関数およびCOUNT関数を使用した検索の指定例を示します。

Document Xクラスの文書のうち,作成日が「2000年1月1日」よりも新しい(CreateDateプロパティの値が「20000101」よりも大きい)文書の数を取得します。

指定例
SELECT COUNT(*) FROM "Document X"
WHERE CreateDate > '20000101'

次に,Document Xクラスの文書のうち,作成日が「2000年1月1日」よりも新しい(CreateDateプロパティの値が「20000101」よりも大きい)文書のAuthorsプロパティの値の数を,重複排除して取得します。

指定例
SELECT COUNT(DISTINCT Authors) FROM "Document A"
WHERE CreateDate > '20000101'

(8) グループ分けをする属性検索

ここでは,GROUP BY句を使用した検索方法について説明します。

Document Xクラスの文書について,文書のAuthorプロパティでグループ化したときのグループ数を取得します。

指定例
SELECT Author, COUNT(*) FROM "Document X"
GROUP BY Author

次に,Document Xクラスの文書について,文書のAuthorプロパティとPublisherプロパティとの組み合わせでグループ化し,Publisherプロパティの値が「日立製作所」であるグループの数を取得します。

指定例
SELECT Author, Publisher, COUNT(*)
FROM "Document X"
GROUP BY Author, Publisher
HAVING Publisher= '日立製作所'