(1)で作業して作成したNLPのドメインを用いて、これを呼び出すコードをObjectScriptで記述する部分と、この関数(ストアドプロシージャと呼びます)をVB.NETで呼び出す方法について説明します。
ObjectScriptの基本的な呼び方例を次に示します。
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で次のように解説されています。
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")のような形式で記述します。
dim i as Integer
i = reader.FieldCount 'フィールド数の上限がわかる
dim s as String
s = Reader.GetName(1) '1からi-1までの数字を入れると、フィールド名が取得できる
VB.NET側の記述は次の通りです。
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