Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

Skiplist

skiplist とは、クエリから返されることを望まないエンティティのリストです。例えば、ソース・テキストにあいさつ文が含まれている場合は、"many thanks" や "best regards" などの実際的な情報を含まない決まり文句を skiplist に入れたいと思うでしょう。また、skiplist を使用して、クエリ結果の分析対象とするには一般的で広く使用されすぎている上位概念を抑制することもできます。

Note:

skiplist を適用したクエリの結果を表示する際は、skiplist を使用すると一部の情報が抑制され、クエリ結果が通知なしで変更されることに注意する必要があります。skiplist は、データ・コンテンツ、クエリ結果を参照するユーザ、およびクエリ結果が表示されるコンテキストに適したものを使用してください。

skiplist の作成

特定のドメインに割り当てられる skiplist を定義したり、現在のネームスペースの任意のドメインで使用できるドメイン非依存 (ドメイン間共通) の skiplist を定義したりすることができます。skiplist は、以下の 2 つの方法で定義できます。

  • InterSystems IRIS ドメイン・アーキテクトを使用します。このインタフェースを使用して、ドメイン内 skiplist の定義、skiplist エンティティの追加と削除、skiplist の削除、またはドメインに対して定義された全 skiplist のリストができます。このインタフェースでは、エンティティを文字列として指定することによる skiplist 生成をサポートしています。

  • %iKnow.Utils.MaintenanceAPIOpens in a new tab クラスのメソッドを使用して、skiplist の定義、生成、および維持を行います。このクラスにより、ドメイン固有の skiplist とドメイン間共通の skiplist の両方を作成できます。このクラスには、文字列としてエンティティを指定するか、エンティティ ID でエンティティを指定して、skiplist にデータを入力するためのメソッドがあります。この章では、skiplist の %iKnow.Utils.MaintenanceAPIOpens in a new tab クラス・メソッドについて、いくつかの使用方法を示します。

%iKnow.Utils.CopyUtilsOpens in a new tab クラスの CopySkipLists()Opens in a new tab メソッドを使用すると、ドメイン内のすべての定義済み skiplist を別のドメインにコピーできます。

ドメイン・エクスプローラおよび基本ポータルのユーザ・インタフェースでは、skiplist の使用をサポートしています。

以下の例では、ドメイン固有の skiplist を作成し、その skiplist に要素を追加します。そして、ドメイン用のすべての skiplist、およびこのドメインのすべての要素をリストします。最後に、skiplist を削除します。

DomainCreateOrOpen
  SET domn="mydomainwithsl"
  IF (##class(%iKnow.Domain).NameIndexExists(domn))
     { SET domo=##class(%iKnow.Domain).NameIndexOpen(domn)
       SET domId=domo.Id }
  ELSE { SET domo=##class(%iKnow.Domain).%New(domn)
         DO domo.%Save()
         SET domId=domo.Id }
CreateSkipList
  SET slname="AviationSkipList"
  SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
       "Aviation non-mechanical terms skiplist")
PopulateSkipList
  SET skip=$LB("aircraft","airplane","flight","accident","event","incident","pilot",
                "student pilot","flight instructor","runway","accident site","ground","visibility","faa")
  SET ptr=0
  FOR x=0:1:100 {
   SET moredata=$LISTNEXT(skip,ptr,val)
    IF moredata=1 {
      SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
    }
    ELSE { WRITE x," entities in skiplist",!!
           GOTO ListSkipList }
  }
ListSkipList
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipLists(.sl,domId,0)
  SET i=1
  WHILE $DATA(sl(i)) {
       WRITE $LISTTOSTRING(sl(i),",",1),!
       SET i=i+1 }
  WRITE "Printed the ",i-1," skiplists",!
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipListElements(.sle,domId,slId)
   /* IF stat=1 {WRITE "success",!}
  ELSE {WRITE "GetSkipListElements failed" QUIT } */
  SET j=1
  WHILE $DATA(sle(j)) {
       WRITE $LISTTOSTRING(sle(j),",",1),!
       SET j=j+1 }
  WRITE "Printed the ",j-1," skiplist elements",!
CleanUp
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(domId,slId)
  IF stat=1 {WRITE "Skiplist deleted",!}
  ELSE {WRITE "DropSkipList failed" QUIT }

CreateSkipList()Opens in a new tab メソッドでは、skiplist の名前と説明を指定できます。skiplist 名は、任意の長さの任意の有効文字列を指定できます。skiplist 名では、大文字と小文字が区別されます。skiplist に割り当てる名前は一意にする必要があります。ドメイン固有の skiplist の場合、ドメイン内で一意にする必要があります。ドメイン間共通の skiplist の場合、ネームスペース内で一意にする必要があります。重複した skiplist 名を指定すると、ERROR #8091 が生成されます。skiplist の記述はオプションです。任意の長さの文字列とすることができます。

skiplist とドメイン

作成する各 skiplist は、ドメイン固有にするか、ドメイン間共通 (ドメイン非依存) にして現在のネームスペースの任意のドメインで使用できるようにすることができます。

  • ドメイン固有の skiplist は、CreateSkipList() メソッドでドメイン ID を指定することでドメインに割り当てられます。このメソッドは、連続する正の整数として skiplist ID を返します。この skiplist を使用するクエリ・メソッドは、この skiplist ID でこれを参照します。ドメイン固有の skiplist は語幹解析をサポートできます。

  • ドメイン間共通の skiplist はドメインに割り当てられません。代わりに CreateSkipList() メソッドで 0 のドメイン ID を指定します。このメソッドは、連続する正の整数として skiplist ID を返します。この skiplist を使用するクエリ・メソッドは、負の skiplist ID でこれを参照します。例えば、skiplist ID 8 で識別される skiplist は skiplist ID 値 -8 で参照されます。

ドメイン固有の skiplist を生成する場合、AddEntityToSkipList()Opens in a new tab または AddStringToSkipList()Opens in a new tab のいずれかを使用できます。ドメイン間共通の skiplist を生成する場合、AddStringToSkipList()Opens in a new tab のみ使用できます。

GetSkipListElements()Opens in a new tab は、ドメイン間共通の skiplist の entUniId 値について空の文字列を返します。

以下の例では、ドメイン固有の skiplist (AviationTermsSkipList) とドメイン間共通の skiplist (JobTitleSkipList) の 2 つの skiplist を作成および生成します。pIncludeCrossDomain ブーリアンが 1 に設定されているため、GetSkipLists()Opens in a new tab メソッドは両方の skiplist を返します。GetSkipLists() が負の整数としてドメイン間共通の skiplist の skiplist ID を返すことに注意してください。

DomainCreateOrOpen
  SET domn="mydomainwithsl"
  IF (##class(%iKnow.Domain).NameIndexExists(domn))
     { SET domo=##class(%iKnow.Domain).NameIndexOpen(domn)
       SET domId=domo.Id }
  ELSE { SET domo=##class(%iKnow.Domain).%New(domn)
         DO domo.%Save()
         SET domId=domo.Id }
CreateSkipList1
  SET slname="AviationTermsSkipList"
  SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
       "Common aviation terms skiplist")
PopulateSkipList1
  SET skip=$LB("aircraft","airplane","flight","accident","event","incident","airport","runway")
  SET ptr=0
  FOR x=0:1:100 {
   SET moredata=$LISTNEXT(skip,ptr,val)
    IF moredata=1 {
      SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
    }
  }
  WRITE "Skiplist ",slname," populated",!
CreateSkipList2
  SET sl2name="JobTitleSkipList"
  SET sl2Id=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(0,sl2name,
       "Aviation personnel skiplist")
PopulateSkipList2
  SET jobskip=$LB("pilot","copilot","student pilot","flight instructor","passenger")
  SET ptr=0
  FOR x=0:1:100 {
   SET moredata=$LISTNEXT(jobskip,ptr,val)
    IF moredata=1 {
      SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(0,sl2Id,val)
    }
  }
  WRITE "Skiplist ",sl2name," populated",!!
ListSkipLists
  SET pIncludeCrossDomain=1
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipLists(.sl,domId,pIncludeCrossDomain)
  SET i=1
  WHILE $DATA(sl(i)) {
     IF $LIST(sl(i),1)<0 {
        WRITE "cross-domain:",!,$LISTTOSTRING(sl(i),",",1),! }
     ELSE { WRITE "domain-specific:",!,$LISTTOSTRING(sl(i),",",1),! }
  SET i=i+1 }
  WRITE "Printed the ",i-1," skiplists",!!
CleanUp
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(domId,slId)
  IF stat=1 {WRITE "domain skiplist deleted",!}
  ELSE {WRITE "first DropSkipList failed" }
  SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(0,sl2Id)
  IF stat=1 {WRITE "cross-domain skiplist deleted",!}
  ELSE {WRITE "second DropSkipList failed" }

skiplist をサポートするクエリ

以下のクエリ・メソッドでは、skiplist を指定するためのパラメータが用意されています。複数の skiplist をそれらのメソッドのいずれかに対して指定するには、$LISTBUILD 関数の使用により、skiplist ID を %List 構造の要素として指定することができます。正の整数の skiplist ID 値としてドメイン固有の skiplist を指定し、負の整数の skiplist ID 値としてドメイン間共通の skiplist を指定します。

エンティティ・クエリ :

文クエリ :

ソース・クエリ :

skiplist クエリの例

このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。

以下の例では、対象にするには一般的すぎる非機械的航空用語を抑制しています。ここでは、CreateSkipList()Opens in a new tab を使用して skiplist を作成し、AddStringToSkipList()Opens in a new tab を使用してエンティティを skiplist に追加してから、その skiplist を GetTop()Opens in a new tab メソッドに指定しています。

#include %IKPublic
DomainCreateOrOpen
  SET dname="mydomain"
  IF (##class(%iKnow.Domain).NameIndexExists(dname))
     { WRITE "The ",dname," domain already exists",!
       SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
       GOTO DeleteOldData }
  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 ListerAndLoader }
DeleteOldData
  SET stat=domoref.DropData()
  IF stat { WRITE "Deleted the data from the ",dname," domain",!!
            GOTO ListerAndLoader }
  ELSE    { WRITE "DropData error ",$System.Status.DisplayError(stat)
            QUIT}
ListerAndLoader
  SET domId=domoref.Id
  SET flister=##class(%iKnow.Source.SQL.Lister).%New(domId)
  SET myloader=##class(%iKnow.Source.Loader).%New(domId)
CreateSkipList1
  SET slname="AviationTermsSkipList"
  SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
       "Common aviation terms skiplist")
PopulateSkipList
  SET skip=$LB("aircraft","airplane","flight","accident","event","incident","pilot","airport",
                "student pilot","flight instructor","runway","accident site","ground","visibility","faa")
  SET ptr=0
  FOR x=0:1:100 {
   SET moredata=$LISTNEXT(skip,ptr,val)
    IF moredata=1 {
      SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
    }
  }
  WRITE "Skiplist ",slname," populated",!

QueryBuild
   SET myquery="SELECT TOP 100 ID AS UniqueVal,Type,NarrativeFull FROM Aviation.Event"
   SET idfld="UniqueVal"
   SET grpfld="Type"
   SET dataflds=$LB("NarrativeFull")
UseLister
  SET stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds)
      IF stat '= 1 {WRITE "The lister failed: ",$System.Status.DisplayError(stat) QUIT }
UseLoader
  SET stat=myloader.ProcessBatch()
      IF stat '= 1 {WRITE "The loader failed: ",$System.Status.DisplayError(stat) QUIT }
SourceCountQuery
  SET numSrcD=##class(%iKnow.Queries.SourceQAPI).GetCountByDomain(domId)
  WRITE "The domain contains ",numSrcD," sources",!
TopEntitiesQuery
  DO ##class(%iKnow.Queries.EntityAPI).GetTop(.result,domId,1,20,"",0,0,0,0,$LB(slId))
  WRITE "NOTE: the ",slname," skiplist",!,
        "has been applied to this list of top entities",!
  SET i=1
  WHILE $DATA(result(i)) {
       SET outstr = $LISTTOSTRING(result(i),",",1)
         SET entity = $PIECE(outstr,",",2)
         SET freq = $PIECE(outstr,",",3)
         SET spread = $PIECE(outstr,",",4)
       WRITE "[",entity,"] appears ",freq," times in ",spread," sources",!
       SET i=i+1 }
  WRITE "Printed the top ",i-1," entities"
FeedbackOpens in a new tab