LoginSignup
1
0

More than 5 years have passed since last update.

InterSystems IRIS NLPをVB.NETから使う方法のまとめ(2)

Last updated at Posted at 2018-11-02

(1)で作業して作成したNLPのドメインを用いて、これを呼び出すコードをObjectScriptで記述する部分と、この関数(ストアドプロシージャと呼びます)をVB.NETで呼び出す方法について説明します。

ObjectScriptの基本的な呼び方例を次に示します。

StoredProc()
Class User.MercForNLP Extends (%Persistent, %Library.Populate)
{

Property diseaseName As %String;

Property medicalDivision As %String;

Property dataType As %String;

Property contentFull As %String(MAXLEN = 100000);

ClassMethod StoredProcTest3() [ ReturnResultsets, SqlName = StoProcTest3, SqlProc ]
{

    Set rs=##class(%Library.ResultSet).%New("%iKnow.Queries.EntityQAPI:GetSimilar")

    Set domId = $system.iKnow.GetDomainId("AnalyzeMerc")

    Set sc=rs.Execute(domId,"糖尿病",1,50)

    Do %sqlcontext.AddResultSet(rs)
}
}

このテーブル(クラス)は[MercForNLP]です。そのフィールドとして、[diseaseName], [medicalDivision], [dataType], [contentFull](と、デフォルトである[Id])が作られています。
ここに、[ClassMethod]と宣言して関数(メソッド)[StoredProc3()]を作成しています。

この後ろにある[]の中身は、それぞれ、
ReturnResultSets : VB.NET側からIRISDataReaderで読み出せる形式でデータの戻り値を生成する
SqlName=StoProcTest3 : 呼び出し形式が"SQL形式"であるということ(Userドメイン空間で一意の名前になるように名前を決める必要がある)
SqlProc : SQL形式の戻り値を出すプロシージャであることの宣言
であることを意味しています。

NLPにアクセスする方法として、
%iKnow.Queries.EntityQAPI:GetSimilar
という関数を作ることがわかります。これはClass Referenceで次のように解説されています。
image.png

ResultSetである(として使う)rsに、GetSimilarの結果を戻すようなresultSetをNewで生成します。
rs=##class(%Library.ResultSet).%New("%iKnow.Queries.EntityQAPI:GetSimilar")

(1)で作成したドメイン[AnalyzeMerc]のID番号を得る方法として、
$system.iKnow.GetDomainId("AnalyzeMerc")
という関数で呼ぶことがわかります。

この中から、[糖尿病]というエンティティに類似したエンティティを50個まで取り出す作業として、
Set sc=rs.Execute(domId,"糖尿病",1,50)
という関数が割り当たっています。

ObjectScriptの最後に、戻すべきResultSetとして[rs]を渡していることがわかります。
Do %sqlcontext.AddResultSet(rs)

VB側での記述は次のようにします。以前記載しました、IRISサーバへの接続の後、IRISCommand、IRISDataReaderを使います。ポイントは、

Command = New IRISCommand("SQLUser.StoProcTest3", connection)
で指定している関数名が、[StoredProcTest3()]ではなく、[SQLUser.StoProcTest3]であることに注意が必要です。出力は、[reader.Read()]として出力リストを一つずつ読み出し、その項目名(フィールド名)をreader.Item("entUniId")のような形式で記述します。

ResultSetのフィールド名を知る方法
dim i as Integer
i = reader.FieldCount 'フィールド数の上限がわかる
dim s as String
s = Reader.GetName(1) '1からi-1までの数字を入れると、フィールド名が取得できる

VB.NET側の記述は次の通りです。

Button3_Click

 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Dim connection As IRISConnection

        connection = New IRISConnection

        connection.ConnectionString = "Server=localhost; Port=51773; " + "Namespace = TESTSAMPLES; " + "Password = trki1979; " + "User ID = torikai;"

        connection.Open()

        Dim Command As IRISCommand

        Dim reader As IRISDataReader

        Command = New IRISCommand("SQLUser.StoProcTest3", connection)

        Command.CommandType = CommandType.StoredProcedure

        reader = Command.ExecuteReader()

        While (reader.Read())

            MsgBox(reader.Item("entUniId") & "," & reader.Item("entity") & "," & reader.Item("frequency") & "," & reader.Item("spread"))

        End While

    End Sub
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0