iKnow 環境作成の代替方法
ソース・データで iKnow を使用する前に、iKnow 環境を定義するオブジェクトのインスタンスを作成する必要があります。その後で、この環境にソース・テキストをロードします。これを実行するための推奨方法は、iKnow アーキテクトを使用することです。この章では、iKnow 環境のオブジェクトについて詳しく説明します。また、それらのオブジェクト作成して拡張する別の手段についても説明します。
以下に、iKnow 環境の構成要素を示します。
-
ドメイン : iKnow 処理のための論理的空間を確立します。ドメインの指定は必須です。
-
構成 : ソース・ドキュメント・コンテンツのための言語環境を確立します。構成の指定はオプションです。指定しない場合でも、iKnow には既定値が用意されています。iKnow アーキテクトでは、ドメインの言語環境を定義できます。この章では、追加の機能およびオプションと共に、ドメイン非依存の構成を作成する方法について説明します。
-
UserDictionary : ソース・テキストを iKnow にロードするときに適用するテキスト置換のセットを確立します。UserDictionary は 1 つ以上の構成に提供されます。UserDictionary の指定はオプションです。指定しない場合は、UserDictionary は使用されません。iKnow アーキテクトには、UserDictionary 機能がありません。この章では、この機能を追加する方法について説明します。
ドメイン、構成、および UserDictionary の複数のインスタンスを作成できます。これらの環境オブジェクトは互いに依存しておらず、特定セットのソース・データに依存することもありません。
iKnow ドメイン
すべての iKnow 処理は、ドメイン内で行われます。ドメインは、Caché ネームスペース内で iKnow が定義したユニット (単位) です。iKnow が使用するすべてのソース・データは、ドメインにリストおよびロードされます。Caché ネームスペースには、複数の iKnow ドメインを含めることができます。
iKnow ドメインは以下の 3 つの方法で、定義、変更および削除することができます。
-
iKnow アーキテクトを使用したドメインの定義。これは、ドメインを定義して、そのドメインの言語、メタデータ、およびロードするデータを指定するための最も簡単な方法です。
-
%iKnow.DomainDefinitionOpens in a new tab のサブクラスとしてのドメインの定義。このオプションは、ドメインを定義して、そのドメインの構成設定、メタデータ、およびロードするデータを指定するための強力で完全な機能を備えた方法になります。
-
%iKnow.DomainOpens in a new tab クラス・メソッドおよびプロパティを使用したプログラムによるドメインの定義。
DomainDefinition を使用したドメインの定義
ユーザが %iKnow.DomainDefinitionOpens in a new tab から継承するクラスを作成およびコンパイルすると、コンパイラは、クラスのドメイン XData ブロックにおいて XML 表現で指定された設定に対応する iKnow ドメインを自動的に作成します。ユーザは、ドメイン・パラメータ、メタデータ・フィールド定義、割り当て済みの構成などの静的要素を指定できます。これらはすべてコンパイル時に自動的に作成されます。また、ユーザは、ドメインにロードするテキスト・データのソースを指定することも可能です。Caché は、このソース情報を使用して、[classname].Domain という新しいクラスに専用の %Build() メソッドを生成します。この %Build() メソッドを使用して、指定されたデータをこのドメインにロードできます。
以下の手順を使用して、%iKnow.DomainDefinitionOpens in a new tab からの継承により、ドメインを定義します。
-
スタジオにて、目的のネームスペースを選択してから ([ファイル]→[ネームスペース変更])、新しいクラス定義を作成します ([ファイル]→[新規]、一般タブから [Caché クラス定義] アイコンを選択)。[新規クラスウィザード] が起動します。
-
[新規クラスウィザード] にて、任意のパッケージ名とクラス名を指定します。[次へ] を押します。[クラスタイプ] ボックスにて、[Extends] を選択して、スーパークラスの名前として %iKnow.DomainDefinitionOpens in a new tab を指定します。[完了] を押します。
-
スタジオにて、[クラス]→[リファクタ]→[オーバーライド] を選択します。[XData] タブを選択します。[ドメイン] アイコンを選択します。[OK] を押します。これにより、XData ブロックが作成されます。
-
XData ブロックの中括弧内にカーソルを置いて、“<” を入力します。スタジオ・アシストが即座に XML コード・オプションの提供を開始します。任意のドメイン名を指定します。少なくとも、以下の指定が必要となります。
{ <domain name="AviationEvents"> </domain> }
XML 構文とスタジオ・アシストのオプションを使用すれば、他のプロパティを XData ブロック内に追加できます (下記で説明)。少なくとも、<data> </data> タグが必要で、これらの中にデータ・ソースが必要です。例えば、以下のように指定します。
{ <domain name="AviationEvents"> <data> <files path="C:\MyDocs\" /> </data> </domain> }
-
スタジオにて、ファイルを保存してから (この場合は “MyDomain“)、[ビルド]→[コンパイル] を選択します。これによりドメインが作成されます。
以下に、この種のドメイン定義の例を示します。
Class Aviation.MyDomain Extends %iKnow.DomainDefinition
{
/// An XML representation of the domain this class defines.
XData Domain [ XMLNamespace = "http://www.intersystems.com/iknow" ]
{
<domain name="AviationEvents">
<parameter name="Status" value="1" />
<configuration name="MyConfig" detectLanguage="1" languages="en,es" />
<parameter name="DefaultConfig" value="MyConfig" />
<metadata>
<field name="EventDate" dataType="DATE"/>
<field name="Type" dataType="STRING" />
</metadata>
<data dropBeforeBuild="true">
<files path="C:\MyDocs\" encoding="utf-8" recursive="1" extensions="txt"
configuration="MyConfig" />
<query sql="SELECT %ID,EventDate,Type,NarrativeFull
FROM Aviation.Event"
idField="ID" groupField="ID" dataFields="NarrativeFull"
metadataFields="EventDate,Type" metadataColumns="EventDate,Type" />
</data>
</domain>
}
}
コンパイル時、この定義はドメイン "AviationEvents" (Status パラメータを 1 に設定) および 2 つのメタデータ・フィールドを作成します。これは、英語 (en) およびスペイン語 (es) のテキストを処理する構成 "MyConfig" を定義し、上記のドメインに割り当てます。
この定義は、ロードするファイルをこのドメインに指定します。これは、テキスト (.txt) ファイルを C:\MyDocs\ ディレクトリからロードし、Caché SQL データを Aviation.Event テーブルからロードします。詳細は、%iKnow.Model.listFilesOpens in a new tab クラス・プロパティおよび %iKnow.Model.listQueryOpens in a new tab クラス・プロパティを参照してください。
システムは、Aviation.MyDomain.Domain という依存クラスの %Build()Opens in a new tab メソッドを生成します。このメソッドには、C:\MyDocs ディレクトリおよび Aviation.Event テーブルからデータをロードするロジックが含まれています。
指定したテキスト・データ・ソースをドメインにロードするには、以下のように行います。
SET stat=##class(Aviation.MyDomain).%Build()
%Build() を使用後には、以下のようにエラーをチェックできます。
DO $SYSTEM.iKnow.ListErrors("AviationEvents",0)
これにより、3 タイプのエラー (エラー、障害のあるソース、警告) がリストされます。
現在のネームスペースで定義されたドメイン、および各ドメインに対してロードされたソースの数を表示するには、以下のようにします。
DO $SYSTEM.iKnow.ListDomains()
このドメインに対して定義されたメタデータ・フィールドを表示するには、以下のようにします。
DO $SYSTEM.iKnow.ListMetadata("AviationEvents")
iKnow では、すべてのドメインを 1 つのメタデータ・フィールド (DateIndexed) に割り当てます。追加のメタデータ・フィールドも定義することができます。
このドメイン定義で、<matching> 要素を指定できます。<matching> 要素は、ディクショナリ情報を記述し、ロードしたソースをこれらのディクショナリに自動的にマッチングするかどうかを指定します。Caché は、クラスのコンパイル中にこれらのオブジェクトに関して基本的な検証を実行しますが、これらのオブジェクトが %Build() メソッドの一部としてロードされるため、実行時にのみ名前の重複が発生します。詳細は、%iKnow.Model.matchingOpens in a new tab クラス・プロパティを参照してください。
このドメイン定義で、<metrics> 要素を指定できます。<metrics> 要素は、カスタム・メトリックをドメインに追加します。%iKnow.Metrics.MetricDefinition.Register() を呼び出す必要はありません。これは、コンパイル時にドメイン定義のコードで自動的に実行されます。詳細は、%iKnow.Model.metricsOpens in a new tab クラス・プロパティを参照してください。
プログラムによるドメインの定義
クラス・メソッドを使用して新規ドメインを定義するには、%iKnow.Domain.%New() 永続メソッドを呼び出して、ドメイン名をメソッド・パラメータとして指定します。ドメイン名には、任意の有効な文字列を指定できます。ドメイン名では、大文字と小文字は区別されません。このドメインに割り当てる名前は、現在のネームスペースで一意のものでなければなりません。このメソッドは、Caché インスタンスの全ネームスペースで一意であるドメイン・オブジェクト参照 (oref) を返します。%Save() メソッドを使用して、このインスタンスを永続的に保存する必要があります。ドメインの ID プロパティ (整数値) は、以下の例で示すように、インスタンスを永続オブジェクトとして保存するまで定義されません。
CreateDomain
SET domOref=##class(%iKnow.Domain).%New("FirstExampleDomain")
WRITE "Id before save: ",domOref.Id,!
DO domOref.%Save()
WRITE "Id after save: ",domOref.Id,!
CleanUp
DO ##class(%iKnow.Domain).%DeleteId(domOref.Id)
WRITE "All done"
新規のドメインを作成する、または既存のドメインを開くには、以下の 2 つの方法があります。
-
Exists()Opens in a new tab を使用して、ドメインが既に存在しているかどうかを判断します。ドメインが存在する場合、Open()Opens in a new tab を使用して、そのドメインを開きます。ドメインが存在しない場合は、%New() を使用して、ドメインを作成します。
-
GetOrCreateId()Opens in a new tab を使用して、ドメインが存在しない場合はドメインを作成し、存在する場合はそのドメインを開きます。
以下の例では、ドメインが存在するかどうかをチェックします。ドメインが存在しない場合は、プログラムによって作成されます。ドメインが存在する場合は、それが開かれます。デモンストレーションのため、このプログラムでは、ランダムにドメインが削除されたり削除されなかったりします。
DomainCreateOrOpen
SET domn="mydomain"
IF (##class(%iKnow.Domain).Exists(domn))
{ WRITE "The ",domn," domain already exists",!
SET domo=##class(%iKnow.Domain).Open(domn)
SET domId=domo.Id
}
ELSE {
SET domo=##class(%iKnow.Domain).%New(domn)
DO domo.%Save()
SET domId=domo.Id
WRITE "Created the ",domn," domain",!
WRITE "with domain ID ",domId,! }
ContainsData
SET x=domo.IsEmpty()
IF x=1 {WRITE "Domain ",domn," contains no data",!}
ELSE {WRITE "Domain ",domn," contains data",!}
CleanupForNextTime
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Domain).%DeleteId(domId)
IF stat {WRITE "Deleted the ",domn," domain" }
ELSE { WRITE "Domain delete error:",stat }
}
ELSE {WRITE "No delete this time" }
以下の例では、GetOrCreateId()Opens in a new tab 簡易メソッドを使用して、ドメインが存在しない場合はドメインを作成し、存在する場合はそのドメインを開きます。デモンストレーションのため、このプログラムでは、ランダムにドメインが削除されたり削除されなかったりします。
DomainGetOrCreate
SET domn="mydomain"
SET domId=##class(%iKnow.Domain).GetOrCreateId(domn)
SET domoref=##class(%iKnow.Domain).%OpenId(domId)
WRITE "The ",domn," domain with domain ID ",domId,!
ContainsData
SET x=domoref.IsEmpty()
IF x=1 {WRITE "Domain ",domn," contains no data",!}
ELSE {WRITE "Domain ",domn," contains data",!}
CleanupForNextTime
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Domain).%DeleteId(domId)
IF stat {WRITE "Deleted the ",domn," domain" }
ELSE { WRITE "Domain delete error:",stat }
}
ELSE {WRITE "No delete this time" }
ドメインを作成または開く %iKnow.DomainOpens in a new tab クラス・メソッドは、出力 %Status パラメータと共に提供されます。このパラメータは、現在のシステムに iKnow へのライセンス・アクセスがないために、iKnow ドメインを作成したり開くことができない場合に設定します。
ドメイン・パラメータの設定
ドメイン・パラメータによって、幅広い iKnow 処理の動作を制御します。個々のパラメータは、このドキュメント全体の該当する場所に記載されています。使用可能なドメイン・パラメータのリストは、付録 “ドメイン・パラメータ” を参照してください。
以下の例のドメイン・パラメータは、パラメータ名 (FullMatchOnly など) ではなく、マクロ・パラメータ ($$$IKPFULLMATCHONLY など) によって参照されます。プログラミングの方法としては、パラメータ名ではなく、このような %IKPublic マクロを使用することをお勧めします。
すべてのドメイン・パラメータに既定値が取得されています。一般的に、iKnow では、任意のドメイン・パラメータを特に設定しないでも最適な結果が得られます。iKnow では以下のように各パラメータの値を決定します。
-
現在のドメインのパラメータ値を指定している場合は、その値が使用されます。データをドメインにロードする前にのみ設定可能なパラメータと、常時設定可能なパラメータがあることに注意します。IsEmpty()Opens in a new tab メソッドを使用することで、データが現在のドメインにロードされているか判断できます。
-
システム全体のパラメータ値を指定している場合は、その値がすべてのドメインの既定値として使用されますが、ドメイン固有の値が設定されているドメインはその対象外となります。
-
ドメイン・レベルでも、システム・レベルでもパラメータの値を指定していない場合は、iKnow ではそのパラメータの既定値が使用されます。
現在のドメインのパラメータ設定
ドメインを作成すると、SetParameter()Opens in a new tab インスタンス・メソッドを使用して、個々のドメインのドメイン・パラメータを設定できます。SetParameter() によって、指定したパラメータが有効で設定されていたことを示すステータスが返されます。GetParameter()Opens in a new tab によって、パラメータ値とそのパラメータが設定されていたレベル (DEFAULT、DOMAIN または SYSTEM) が返されます。GetParameter() は、パラメータ名の有効性をチェックすることなく、ドメイン・レベルまたはシステム・レベルで設定されている際に識別できないすべてのパラメータ名に対して DEFAULT を返すことに注意します。
以下の例では、SortField ドメイン・パラメータの既定値を取得し、現在のドメインにそのパラメータを設定してから、設定した値と設定された時点でのレベル (DOMAIN) を取得します。
#Include %IKPublic
DomainCreate
SET domn="paramdomain"
SET domo=##class(%iKnow.Domain).%New(domn)
WRITE "Created the ",domn," domain",!
DO domo.%Save()
DomainParameters
SET sfval=domo.GetParameter($$$IKPSORTFIELD,.sf)
WRITE "SortField before SET=",sfval," ",sf,!
IF sfval=0 {WRITE "changing SortByFrequency to SortBySpread",!
SET stat=domo.SetParameter($$$IKPSORTFIELD,1)
IF stat=0 {WRITE "SetParameter failed" QUIT} }
WRITE "SortField after SET=",domo.GetParameter($$$IKPSORTFIELD,.str)," ",str,!!
CleanupForNextTime
SET stat=##class(%iKnow.Domain).%DeleteId(domo.Id)
IF stat {WRITE "Deleted the ",domn," domain" }
ELSE { WRITE "Domain delete error:",stat }
システム全体のパラメータ設定
SetSystemParameter()Opens in a new tab メソッドを使用して、ドメイン・システム全体にドメイン・パラメータを設定できます。このメソッドを使用して設定したパラメータは、その時点で、すべてのネームスペースにおける既存およびそれ以降に作成されるすべてのドメインの既定パラメータ値となります。このシステム全体の既定値は、SetParameter()Opens in a new tab インスタンス・メソッドを使用してドメインごとに上書きされます。
ドメイン・パラメータがシステムの既定として設定されているかどうかを確認するには、GetSystemParameter()Opens in a new tab メソッドを使用できます。システム全体のパラメータの初期値は常に NULL 文字列 (既定値ではない) になっています。
システム全体でドメイン・パラメータの既定の設定を削除する必要がある場合は、UnsetSystemParameter()Opens in a new tab メソッドを使用します。システム全体のパラメータ設定を設定している場合は、その設定を解除することによって新しい値に設定できるようになります。UnsetSystemParameter() では、解除するパラメータの既定値がない場合でもステータスの 1 (成功) を返します。
以下の例では、FullMatchOnly にシステム全体のパラメータ値を設定しています。システム全体の既定値が設定されていない場合は、プログラムによってこのシステム全体のパラメータが設定されます。システム全体の既定値が設定されている場合は、プログラムによってこのシステム全体のパラメータを解除してから設定します。
#Include %IKPublic
SystemwideParameterSet
/* Initial set */
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=1 {
WRITE "FullMatchOnly set systemwide to: "
WRITE ##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!
QUIT }
ELSE {
/* Unset and Reset */
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
IF stat=1 {
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=1 {
WRITE "FullMatchOnly was unset systemwide",!,"then set to: "
WRITE ##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
GOTO CleanUpForNextTime }
ELSE {WRITE "System Parameter set error",stat,!}
}
ELSE {WRITE "System Parameter set error",stat,!}
}
CleanUpForNextTime
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
IF stat '=1 {WRITE " Unset error status:",stat}
以下の例では、システム全体のパラメータ値を設定すると、その場ですべてのドメインのパラメータ値が設定されることを示しています。システム全体のパラメータ値を設定した後は、個々のドメインでこの値を上書きできるようになります。
#Include %IKPublic
SystemwideParameterUnset
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
WRITE "Systemwide setting FullMatchOnly=",##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
Domain1Create
SET domn1="mysysdomain1"
SET domo1=##class(%iKnow.Domain).%New(domn1)
DO domo1.%Save()
SET dom1Id=domo1.Id
WRITE "Created the ",domn1," domain ",dom1Id,!
WRITE "FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
SystemwideParameterSet
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=0 {WRITE "SetSystemParameter failed" QUIT}
WRITE "Set systemwide FullMatchOnly=",##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
Domain2Create
SET domn2="mysysdomain2"
SET domo2=##class(%iKnow.Domain).%New(domn2)
DO domo2.%Save()
SET dom2Id=domo2.Id
WRITE "Created the ",domn2," domain ",dom2Id,!
WRITE "Domain setting FullMatchOnly=",domo2.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
DomainParameters
WRITE "New domain ",dom2Id," FullMatchOnly=",domo2.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!
WRITE "Existing domain ",dom1Id," FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
OverrideForOneDomain
SET stat=domo1.SetParameter($$$IKPFULLMATCHONLY,0)
IF stat=0 {WRITE "SetParameter failed" QUIT}
WRITE "Domain override FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!
CleanupForNextTime
SET stat=##class(%iKnow.Domain).%DeleteId(dom1Id)
SET stat=##class(%iKnow.Domain).%DeleteId(dom2Id)
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
ドメインへの割り当て
ドメインを作成し、そのドメイン・パラメータを指定 (オプション) すれば、各種コンポーネントをそのドメインに割り当てることができます。
-
ソース・データ : ドメインの作成後、通常はいくつかの (大概は大量の) テキスト・ソースをドメインにロードすることになります。これにより、iKnow がインデックスを作成したデータがドメイン内に生成されます。テキスト・ソースのロードは、ほとんどの iKnow 処理での必須前提条件となります。ファイル、SQL フィールドおよびテキスト文字列を含む、各種のテキスト・ソースがサポートされています。iKnow がデータ・ソースのインデックスを作成すると、iKnow 処理に影響することなく、元のデータ・ソースを削除できます。データ・ソースの変更により、iKnow 処理に影響を及ぼすことはありませんが、そのデータ・ソースをリロードして、ドメイン内の iKnow がインデックスを作成したデータを更新した場合は例外です。
-
フィルタ : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数のフィルタを作成できます。フィルタでは、ロードされたソースのいくつかをクエリから除外するために使用する条件を指定します。したがって、フィルタにより、ドメイン内にロードされたデータのサブセット上で iKnow 処理を実行することが可能になります。
-
メタデータ : ドメインの作成後、必要に応じて、ソースをフィルタ処理するための条件として使用できるメタデータ・フィールドを 1 つまたは複数指定できます。メタデータ・フィールドは、iKnow がインデックスを作成するデータ以外の、ソースに関連付けられたデータです。例えば、テキスト・ソースがロードされた日時は、そのソースのメタデータ・フィールドです。メタデータ・フィールドは、テキスト・ソースをドメインにロードする前に定義する必要があります。
-
ブラックリスト : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数のブラックリストを作成できます。ブラックリストは、クエリから返されることを望まないエンティティ (単語や語句など) のリストです。したがって、ブラックリストを使用して、ドメインにロードされたデータ・ソース内の特定のデータ・エンティティを無視する iKnow 処理を実行できます。
-
ディクショナリ : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数のディクショナリを作成できます。ディクショナリには、iKnow がインデックスを作成したデータとの照合に使用されるエンティティが含まれています。
これらのコンポーネントは、各種の iKnow クラスおよびメソッドの使用により定義されます。Caché iKnow アーキテクトを使用して、メタデータ・フィールドを定義したり、ソースをロードしたり、ブラックリストを定義したりすることもできます。
メタデータ・フィールドは、ソースをロードする前に定義する必要があります。フィルタ、ブラックリストおよびディクショナリは、いつでも定義または変更することができます。
ドメインからの全データの削除
元のソース・テキストの削除または変更が、そのテキストから iKnow ドメインにリストおよびロードされたソース・データに影響を及ぼすことはありません。インデックス作成済みのソース・セットへのソースの追加や削除は、明示的に行う必要があります。
%DeleteId() 永続メソッドでは、ドメインとそのドメインにリストおよびロードされた全ソース・データを削除します。また、DropData()Opens in a new tab メソッドを使用すると、ドメイン自体を削除せずに、そのドメインにロードされた全ソース・データを削除できます。いずれのメソッドでもインデックスが作成された全ソース・データが削除され、新しいデータ・ソース・セットを使用して初めからやり直すことが可能になります。
膨大な数のソースを含んだドメインを削除する場合は、%DeleteId() を使用してドメインを削除する前に、DropData() を使用してデータを削除します。%DeleteId() を使用して、データを内包させたままドメインを削除する場合、Caché はデータ削除を行いますが、ジャーナリングが無効化されているときにおいても、それぞれのデータ削除についてジャーナリングを実行します。データを削除してからのドメイン削除によって、これらの大規模ジャーナル・ファイルの生成を防ぎます。
IsEmpty()Opens in a new tab メソッドを使用することで、データがドメインにロードされているか判断できます。
以下の例は、ドメインからのデータの削除を示しています。指定のドメインが存在しない場合は、プログラムによってそのドメインが作成されます。指定のドメインが存在する場合、プログラムがデータの存在をテストします。ドメインにデータが存在する場合は、プログラムによりそのドメインが開かれて、データが削除されます。
DomainCreateOrOpen
SET dname="mytestdomain"
IF (##class(%iKnow.Domain).Exists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).Open(dname)
IF domoref.IsEmpty() {GOTO RestOfProgram}
ELSE {GOTO DeleteData }
}
ELSE
{ WRITE "The ",dname," domain does not exist",!
SET domoref=##class(%iKnow.Domain).%New(dname)
DO domoref.%Save()
WRITE "Created the ",dname," domain with domain ID ",domoref.Id,!
GOTO RestOfProgram }
DeleteData
SET stat=domoref.DropData()
IF stat { WRITE "Deleted the data from the ",dname," domain",!
GOTO RestOfProgram }
ELSE { WRITE "DropData error",!
QUIT}
RestOfProgram
WRITE "The ",dname," domain contains no data"
全ドメインのリスト
すべてのネームスペースにおける現在のすべてのドメインをリストするには、GetAllDomainsOpens in a new tab クエリを使用できます。詳細は、以下の例を参照してください。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Domain","GetAllDomains")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute()
WRITE !,"Domains in all namespaces",!
DO rset.%Display()
domainId:domainName:namespace:version という形式を使用して、各ドメインが別々の行にリストされます。
VersionOpens in a new tab プロパティは、ドメインの作成時に使用された iKnow データ構造のバージョンを示す整数になっています。iKnow のシステム・バージョン番号は、リリースに iKnow データ構造の変更が含まれる場合に変更されます。したがって、Caché の新しいバージョンまたは新規 iKnow 機能の導入では、iKnow のシステム・バージョン番号は変わらない場合があります。ドメインの Version プロパティの値が現行の iKnow システム・バージョンではない場合、ドメインをアップグレードして iKnow の最新機能を利用することになります。詳細は、“iKnow の実装” の章の "iKnow データのアップグレード" を参照してください。
既定では、GetAllDomains は、全ネームスペースの現在のドメインをすべてリストします。以下の例に示されているように、%Execute() でブーリアン引数を指定して、現在のネームスペースにドメインのリストを制限できます。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Domain","GetAllDomains")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute(1)
WRITE !,"Domains in all namespaces",!
DO rset.%Display()
ブーリアン値の 1 を指定すると、現在のネームスペースのドメインにリストが制限されます。ブーリアン値の 0 (既定値) を指定すると、全ネームスペースの全ドメインがリストされます。(メモ : リストされる Version プロパティ値は現在のドメイン以外では正しくない場合があります。)
以下を使用すると、現在のネームスペースのすべてのドメインをリスト表示できます。
DO ##class(%SYSTEM.iKnow).ListDomains()
ドメイン名の変更
以下の例に示すように、Rename()Opens in a new tab クラス・メソッドを使用して、現在のネームスペース内の既存ドメインの名前を変更できます。
SET stat=##class(%iKnow.Domain).Rename(oldname,newname)
IF stat=1 {WRITE "renamed ",oldname," to ",newname,!}
ELSE {WRITE "no rename",oldname," is unchanged",! }
ドメイン名の変更により、ドメインを開くときに使用する名前が変わり、既存のドメイン ID が新規の名前に割り当てられます。Rename() では、ドメインの現在のインスタンス名は変更されません。名前を変更するには、古いドメイン名が存在して、新しいドメイン名は存在していないことが必要です。
ドメインのコピー
既存のドメインを現在のネームスペースの新規ドメインにコピーするには、%iKnow.Utils.CopyUtilsOpens in a new tab クラスの CopyDomain()Opens in a new tab メソッドを使用できます。CopyDomain() メソッドは、ドメインの定義を新規ドメインにコピーして、一意のドメイン名およびドメイン ID を割り当てます。既存のドメインの変更はありません。新規のドメインが存在しない場合、このメソッドにより新規ドメインが作成されます。既定では、このメソッドはドメイン・パラメータ設定および割り当てられたドメイン・コンポーネント (存在する場合) を、既存のドメインからコピーのドメインにコピーします。
また、既定では、CopyDomain() メソッドはソース・データを既存のドメインからコピーのドメインにコピーします。ただし、ソース・データのコピーを要求しても、ソース・データが既存のドメインに存在しない場合、CopyDomain() の処理は失敗します。
以下の例では、“mydomain“ という名のドメインおよびそのパラメータ設定とソース・データを “mydupdomain“ という名の新規ドメインにコピーします。“mydomain“ にソース・データが含まれていないため、(ソース・データをコピーするかどうかを指定する) 3 番目の引数は 0 に設定されています。
DomainMustExistToBeCopied
SET olddom="mydomain"_$PIECE($H,",",2)
SET domo=##class(%iKnow.Domain).%New(olddom)
DO domo.%Save()
IF (##class(%iKnow.Domain).Exists(olddom))
{WRITE "Old domain exists, proceed with copy",!!}
ELSE {WRITE "Old domain does not exist" QUIT}
CopyDomain
SET newdom="mydupdomain"
IF (##class(%iKnow.Domain).Exists(newdom))
{WRITE "Domain copy overwriting domain ",newdom,!}
ELSE {WRITE "Domain copy creating domain ",newdom,!}
SET stat=##class(%iKnow.Utils.CopyUtils).CopyDomain(olddom,newdom,0)
IF stat=1 {WRITE !!,"Copied ",olddom," to ",newdom," copying all assignments",!!}
ELSE {WRITE "Domain copy failed with status ",stat,!}
CleanUp
SET stat=##class(%iKnow.Domain).%DeleteId(domo.Id)
WRITE "Deleted the old domain",!
IF $RANDOM(2) {
SET newId=##class(%iKnow.Domain).GetOrCreateId("mydupdomain")
SET stat=##class(%iKnow.Domain).%DeleteId(newId)
WRITE "Deleted the new domain" }
ELSE {WRITE "No new domain delete this time" }
CopyDomain() メソッドにより、既存ドメインのドメイン設定、ソース・データ、および割り当てられたコンポーネントをすべて新規ドメインにすばやくコピーできます。このメソッドでは、割り当てられたドメイン・コンポーネントすべてをコピーするかまったくコピーしないかに対して、ブーリアン・オプションが用意されています。%iKnow.Utils.CopyUtilsOpens in a new tab クラスの他のメソッドでは、割り当てられたコンポーネントのどれを既存ドメイン間でコピーするかの指定において、より高度な制御が可能です。
iKnow 構成
iKnow 構成は、ソース・ドキュメントを扱う際の動作を指定します。これは、ソース・データのロード処理時のみ使用されます。構成はそのネームスペースに固有で、1 つのネームスペース内に複数の構成を作成できます。iKnow はネームスペースの各構成に、一意の整数である構成 ID を割り当てます。構成 ID 値は再利用されません。同じ構成を異なるドメインやソース・テキストのロードに適用できます。iKnow 構成の定義や使用はオプションで、構成を指定しないと、プロパティの既定値が使用されます。
iKnow 構成は、以下の 2 つの方法で定義できます。
-
%iKnow.ConfigurationOpens in a new tab クラス・メソッドおよびプロパティを使用する方法 (この章で説明)。
-
iKnow アーキテクトを使用して、サポートする言語をドメイン定義の一部として指定する方法。
構成の定義
構成を定義するには、%iKnow.ConfigurationOpens in a new tab クラスの %New()Opens in a new tab 永続メソッドを使用できます。
Exists()Opens in a new tab メソッドを呼び出すことで、目的の名前の iKnow 構成が既に存在しているかどうかを判断できます。構成が存在する場合、以下の例に示すように、Open()Opens in a new tab メソッドを使用して、その構成を開くことができます。
IF ##class(%iKnow.Configuration).Exists("EnFr") {
SET cfg=##class(%iKnow.Configuration).Open("EnFr") }
ELSE { SET cfg=##class(%iKnow.Configuration).%New("EnFr",1,$LB("en","fr"))
DO cfg.%Save() }
構成プロパティの設定
構成では以下のプロパティを定義します。
-
Name : 構成名には、任意の有効な文字列を指定できます。構成名では、大文字と小文字は区別されません。この構成に割り当てる名前は、現在のネームスペースで一意のものでなければなりません。
-
DetectLanguage : Languages プロパティに複数の言語が指定されている場合に自動言語識別を使用するかどうかを指定するブーリアン値。このオプションはパフォーマンスに大きな影響を与える可能性があるため、必要な場合以外は設定しないでください。既定値は 0 です (自動言語識別を使用しません)。
-
Languages : ソース・ドキュメントに含まれる言語、つまり、テストする言語と適用する言語モデルを指定します。使用できるオプションは、Dutch/nl (オランダ語)、English/en (英語)、French/fr (フランス語)、German/de (ドイツ語)、Japanese/ja (日本語)、Portuguese/pt (ポルトガル語)、Russian/ru (ロシア語)、Spanish/es (スペイン語)、Swedish/sv (スウェーデン語)、および Ukrainian/uk (ウクライナ語) です。既定値は、English (en) です。言語は、常に、その言語の ISO 639-1 の 2 文字の省略形式を使用して指定します。このプロパティ値は、($LISTBUILD を使用して) 文字列の Caché リストとして指定します。
-
UserDictionary : 定義された UserDictionary オブジェクトの名前、または定義された UserDictionary ファイルのファイル・パスのいずれかとなります。UserDictionary は、iKnow がロード処理時にソース・テキスト・エンティティに適用する、ユーザ定義の置換語のペアを含んでいます。このプロパティはオプションで、既定値は NULL 文字列です。
-
Summarize : ソース・テキストのロード時に要約情報を格納するかどうかを指定するブーリアン値。1 に設定すると、iKnow が要求するソース情報が生成されて、ロードされたソース・テキストの要約が生成されます。0 に設定すると、この構成オブジェクトで処理されたソースについては、要約を生成できません。通常、このオプションは 1 に設定することをお勧めします。既定値は 1 です。
すべての構成プロパティ (Name は除く) は既定値を割り当てられます。プロパティのディスパッチを使用することで、構成プロパティを取得または設定することができます。
IF cfgOref.DetectLanguage=0 {
SET cfgOref.DetectLanguage=1
DO cfgOref.%Save() }
プロパティ・ディスパッチを使用してプロパティを変更する前に、最初に新規作成した構成に対して %Save() を実行する必要があり、さらにプロパティ値の変更後、構成に対して %Save() を実行する必要があります。
以下の例では、英語とフランス語を自動言語識別によりサポートする構成を作成しています。その後、英語とスペイン語をサポートする構成に変更しています。
OpenOrCreateConfiguration
SET myconfig="Bilingual"
IF ##class(%iKnow.Configuration).Exists(myconfig) {
SET cfg=##class(%iKnow.Configuration).Open(myconfig)
WRITE "Opened existing configuration ",myconfig,! }
ELSE { SET cfg=##class(%iKnow.Configuration).%New(myconfig,1,$LB("en","fr"))
DO cfg.%Save()
WRITE "Created new configuration ",myconfig,! }
GetLanguages
WRITE "that supports ",$LISTTOSTRING(cfg.Languages),!
SetConfigParameters
SET cfg.Languages=$LISTBUILD("en","sp")
DO cfg.%Save()
WRITE "changed ",myconfig," to support ",$LISTTOSTRING(cfg.Languages),!
CleanUpForNextTime
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Configuration).%DeleteId(cfg.Id)
IF stat {WRITE "Deleted the ",myconfig," configuration" }
}
ELSE {WRITE "No delete this time",! }
複数言語と自動言語識別の使用方法の詳細は、このドキュメントの “言語の識別” の章を参照してください。
構成の使用
以下のいずれかの方法で定義された構成を適用できます。
-
DefaultConfig ドメイン・パラメータの定義
-
構成を Init()Opens in a new tab インスタンス・メソッドの 1 番目の引数に指定して、リスタ・インスタンスを初期化し、構成の既定値をオーバーライドします。
-
構成を loader.ProcessBuffer()Opens in a new tab または loader.ProcessVirtualBuffer()Opens in a new tab メソッドの引数として指定します。
全構成のリスト
GetAllConfigurationsOpens in a new tab クエリを使用して、現在のネームスペース内の定義された全構成をリストできます。詳細は、以下の例を参照してください。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Configuration","GetAllConfigurations")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute()
WRITE "The current namespace is: ",$NAMESPACE,!
WRITE "It contains the following configurations: ",!
DO rset.%Display()
1 行に 1 つの構成がリストされ、構成 ID の後に構成パラメータ値が示されます。リストされる値はコロンで区切られます。サポートされる言語のリストを使用して構成が定義されている場合は、GetAllConfigurations はこれらの言語の省略形をコンマで区切って表示します。
以下を使用すると、現在のネームスペースのすべての構成をリスト表示できます。
DO ##class(%SYSTEM.iKnow).ListConfigurations()
文字列を正規化する構成の使用法
定義された iKnow 構成を使用すると、Normalize()Opens in a new tab メソッドにより、文字列での iKnow テキストの正規化を実行することができます。このメソッドは、以下の例に示すように、文字列の正規化と UserDictionary の適用 (任意) の両方を行います。
DefineUserDictionary
SET time=$PIECE($H,",",2)
SET udname="Abbrev"_time
SET udict=##class(%iKnow.UserDictionary).%New(udname)
DO udict.%Save()
DO udict.AddEntry("Dr.","Doctor")
DO udict.AddEntry("Mr.","Mister")
DO udict.AddEntry("\&\","and")
DisplayUserDictionary
DO udict.GetEntries(.dictlist)
SET i=1
WHILE $DATA(dictlist(i)) {
WRITE $LISTTOSTRING(dictlist(i),",",1),!
SET i=i+1 }
WRITE "End of UserDictionary",!!
DefineConfiguration
SET cfg=##class(%iKnow.Configuration).%New("EnUDict"_time,0,$LB("en"),udname)
DO cfg.%Save()
NormalizeAString
SET mystring="...The Strange Case of Dr. Jekyll & Mr. Hyde"
SET normstring=cfg.Normalize(mystring)
WRITE normstring
CleanUp
DO ##class(%iKnow.UserDictionary).%DeleteId(udict.Id)
DO ##class(%iKnow.Configuration).%DeleteId(cfg.Id)
構成に依存しない文字列に対して iKnow テキスト正規化を実行するには、NormalizeWithParams()Opens in a new tab メソッドを使用できます。
これらのメソッドは、以下の順序で処理を実行します。
-
UserDictionary が指定された場合、これを適用
-
iKnow 言語モデル処理を実行
-
すべてのテキストを小文字に変換
-
複数の空白スペース文字を単一の空白文字で置換
iKnow UserDictionary
UserDictionary は、ソース・テキストに適用されるユーザ定義の用語ペア・セットを指定します。iKnow では、ソース・テキスト・リスト処理の一環として、それぞれ最初の用語ペアの出現を2 番目の用語と置き換えます。この処理では、iKnow で使用するソース・テキストが変更されるので、続きの iKnow 処理はすべて、置換された用語を参照することになります。例えば、UserDictionary が省略形 “Dr.“ を “Doctor“ で置換する場合は、iKnow によってインデックスが作成されたデータに出現するすべての “Dr.“ は、単語 “Doctor“ で置き換えられます。元のソース・ファイルは変更されませんが、iKnow 内のすべてのソース・テキストにはこの置換語が含まれます。iKnow の他のすべてのコンポーネントとは異なり、UserDictionary はリストしてロードする前にソース・コンテンツを変更します。
UserDictionary を使用して、ある用語で別の用語を置換したり、頭文字や省略形を展開したり (またはその逆)、文区切りを回避または生成できます。
置換語のペアは、iKnow テキスト正規化の前に適用されます。ここで、iKnow の内部テキスト表現は小文字に変換されます。これにより、置換語のペアでは大文字と小文字が区別されます。したがって、“physician“ のインスタンスすべてを “doctor“ で置き換えるには、"physician","doctor"、"Physician","Doctor"、そして "PHYSICIAN","DOCTOR" といった置換語のペアが必要になります。
UserDictionary の定義はオプションです。UserDictionary はすべての固有の構成またはドメインから独立しています。定義された UserDictionary は構成プロパティ として割り当てることができます。1 つの構成に対して割り当て可能な UserDictionary は 1 つのみです。同じ UserDictionary を複数の構成に割り当てることができます。
また、定義された UserDictionary を、あらゆる構成から独立して、NormalizeWithParams()Opens in a new tab メソッドに対して指定することもできます。
既存の構成を変更することはできません。%New() が、既存の構成を削除または置換することはありません。したがって、既存の構成に UserDictionary を追加するには、指定の構成を明示的に削除してから再作成する必要があります。または、新しい構成名を使って新しい構成を作成することもできます。
UserDictionary はソースがリストされるときにソースに適用されます。UserDictionary を変更しても、既にインデックスが作成されているソースは影響されません。
UserDictionary 形式
UserDictionary のペアでは、同等の用語に対して、頻繁に簡易的な用語置換を行うことが多くあります。例えば、出現する “physician“ のすべてを “doctor“ で置き換える場合などがあります。バックスラッシュ記号を使用すると、追加の形式オプションを指定できます。
形式 | 意味 |
---|---|
\ | ここに空白がある場合のみ置換を実行します。 |
\noend | 文区切りを抑制します。 |
\end | 文区切りを行います。 |
これらを、以下のサンプル UserDictionary ペアに示します。
\UK,United Kingdom \+\,plus Fr.,\noend \STOP,\end
オブジェクト・インスタンスとしての UserDictionary 定義
最初に UserDictionary オブジェクトを作成してから、そのインスタンスを生成します。
SET udict=##class(%iKnow.UserDictionary).%New("MyUserDict")
DO udict.%Save()
DO udict.AddEntry("Dr.","Doctor")
DO udict.AddEntry("physician","doctor")
DO udict.AddEntry("Physician","Doctor")
UserDictionary オブジェクトを生成するには、AddEntry()Opens in a new tab メソッドを使用して、置換語のペアを指定します。置換語の各ペアは、AddEntry(oldstring,newstring) の形式で、個別の AddEntry() は必要です。この置換は文字列の置換であり、置換語のペアでは大文字と小文字が区別されることに注意してください。オプションにより、UserDictionary エントリを追加する位置を指定することができます (position の既定は UserDictionary の末端部へのエントリ追加となります)。iKnow は UserDictionary の順で置換語のペアを適用するので、position を使用して、追加的な置換を実行することができます。例えば、最初に “PA“ を “physician’s assistant“ で置換してから、“physician“ を “doctor“ で置換します。
UserDictionary オブジェクトを割り当てるには、%New() 構成メソッドの 4 番目の引数に UserDictionary 名を指定します。
SET cfg=##class(%iKnow.Configuration).%New("MyConfig",0,$LISTBUILD("en"),"MyUserDict",1)
DO cfg.%Save()
ファイルとしての UserDictionary 定義
最初に UserDictionary ファイルを作成してから、それを生成して、その後に UserDictionary ファイルを構成に割り当てる必要があります。
UserDictionary ファイルは UTF-8 形式のエンコードのテキスト・ファイルであることが必要です。
UserDictionary ファイルを生成するには、テキスト・ファイルの置換語のペアを指定します。置換語の各ペアは、oldstring,newstring の形式で、1 行に 1 ペアずつ示されます。この置換は文字列の置換であり、置換語のペアでは大文字と小文字が区別されることに注意してください。以下に UserDictionary ファイルのサンプルを示します。
Mr.,Mister Dr.,Doctor Fr.,Fr \UK,United Kingdom
UserDictionary ファイルを割り当てるには、%New() 構成メソッドの 4 番目の引数にフル・パス名を指定します。
SET cfg=##class(%iKnow.Configuration).%New(myconfig,0,$LISTBUILD("en"),"C:\temp\udict.txt",1)
DO cfg.%Save()