InterSystems 常见问题解答标题
^%GCMP 实用工具可用于比较两个全局变量的内容。
例如,要比较 USER 和 SAMPLES 命名空间中的 ^test 和 ^test,过程将与下面类似:
*以下示例在这两个命名空间中创建了 700 个相同的全局变量,并更改了其中一个的内容,使其成为检测目标。
InterSystems ObjectScript 是一种脚本语言,可使用 InterSystems 数据平台的任何数据模型(对象、关系、键值、文档、全局变量/Global)处理数据,并在 InterSystems 数据平台上为服务器端应用程序开发业务逻辑。
文档。
InterSystems 常见问题解答标题
^%GCMP 实用工具可用于比较两个全局变量的内容。
例如,要比较 USER 和 SAMPLES 命名空间中的 ^test 和 ^test,过程将与下面类似:
*以下示例在这两个命名空间中创建了 700 个相同的全局变量,并更改了其中一个的内容,使其成为检测目标。

在本节中,我们将探讨如何在 IRIS 中使用 Python 作为主要编程语言,在使用 Python 编写应用程序逻辑的同时仍能利用 IRIS 的强大功能。
尽管IRIS和HealthConnect拥有全面的互操作特性,但在实际工作中,还是有可能遇到需要使用遗留类库,dll SDK等方式与外部应用通信的情况。例如IRIS中并没有内嵌国密算法SM2、SM3和SM4,而开源社区中不乏通过Java、Python和C++等语言完成的具体实现。本文就将以调用SM4的Java实现为例展示ObjectScript程序与第三方语言通信的过程。
Github地址:https://github.com/LinZhuISC/javademo.SM4
在开始实际操作之前,希望读者先针对整个调用过程中的主调方和被调方思考两个现象:
针对这两个现象,开发者需要思考,在哪一侧需要做什么样的一些工作以便调用过程能够顺畅进行。
在这个背景下,当我们需要让ObjectScript与Java相互通信和调用时,就不得不解决几个技术问题:
首先,祝开发者社区的各位成员新年快乐! 我们希望今年为大家带来更多好东西,今天我想介绍 VS Code的最新版 Intersystems Language Server 扩展程序。 大多数 Language Server 改进都可以通过 ObjectScript 扩展 UI 体验到,因此您可能不知道 2024 年我们发布了 Intellisense 和鼠标悬停等方面的许多改进。 请快速浏览 Language Server 更新日志 看看您错过了什么。 最近发布的2.7.0 版本带来了对 Windows ARM 平台的支持,因此,如果您使用 Surface Pro 11 这类设备(我正在用这台设备愉快地写这篇帖子),那么您现在可以在您的设备上获得出色的 ObjectScript 开发体验。 赶快试用一下,并在下方评论区中分享您的使用心得。
InterSystems SQL
表是一种由表示特定实体的行和表示每个实体特定数据点的列组成的数据结构。
系统
在受保护的 IRIS 应用中,由应用程序授予给已经是其他角色(称为匹配角色)成员的用户的角色。如果用户拥有匹配角色,则在使用应用程序时,用户还可以被授予一个或多个额外的目标角色。
系统
试图认证到 LDAP 服务器的用户。IRIS 通过在特定 LDAP 配置的“编辑 LDAP 配置”页面上的 LDAP 唯一搜索属性字段中使用提供的值,尝试在 LDAP 数据库中查找该用户。可以从 LDAP 配置页面(系统管理 > 安全 > 系统安全 > LDAP 配置)访问“编辑 LDAP 配置”页面。(请注意,如果启用了 Kerberos,页面名称和菜单选项中会包含 Kerberos。)
通用
传输控制协议/互联网协议(Transmission Control Protocol/Internet Protocol),是可以管理关系客户端和关系服务器之间连接的通信协议之一。也称为 TCP。
系统
存储在临时数据库 IRISTEMP 中的全局。请参见临时全局和 IRISTEMP 数据库。
系统
对象(Objects)
使用自定义存储或编写自己的存储类时必须实现的一组方法。
对象(Objects)
类使用的存储策略在编译时评估为存储定义,决定数据的存储方式。
SQL
存储过程允许你从 ODBC 或 JDBC 执行查询或类方法。
对象(Objects)
IRIS 流接口用于在 ObjectScript、SQL 和 Java 中操作流。
对象(Objects)
流提供了一个接口,用于操作和存储大量数据。IRIS 流接口可在 ObjectScript、SQL 和 Java 中用于操作流。
系统
监听指定端口的服务器,用于接收对 IRIS 的传入连接并将其分发到适当的子系统。默认的超级服务器端口是 1972;如果 1972 不可用,超级服务器将从 51773 开始监听下一个可用端口。要设置超级服务器端口号,请使用管理门户(系统管理 > 配置 > 系统配置 > 内存和启动)中的内存和启动页面的超级服务器端口号字段。
对象(Objects)
当嵌入和持久对象被引用时,自动将其拉入内存的过程。也称为懒加载。
系统
IRIS 内部的表,存储所有由进程发出的 LOCK 命令。你可以使用系统查看器查看此表。
系统
系统管理员目录中的文件,包含关于系统操作、错误和指标的消息。这些包括消息日志(messages.log)、系统监视器日志(SystemMonitor.log)、警报日志(alerts.log)、初始化日志(iboot.log)和日志历史记录日志(journal.log)。有关这些日志文件的信息,请参见“监控日志文件”。
logical format)对象(Objects)
对象属性的逻辑格式是在内存中使用的格式。所有的比较和计算都是基于这种格式进行的。
系统
通过认证到IRIS 时与用户关联的任何角色(而不是之后关联的角色)。
ObjectScript
ObjectScript 编译器的一部分,将宏代码转换为可用的 ObjectScript 代码。
ObjectScript
系统
在通用引用 IRIS 安装目录时,文档使用术语 install-dir。在示例中,文档使用 C:\MyIRIS\。章节“默认安装目录”描述了 IRIS 在所有受支持操作系统上的安装位置。
对象(Objects)
表示特定实体的类的实现。术语“实例”和“对象”可以互换使用。
系统
本地认证系统:用户会被提示输入密码,输入的密码的哈希值会传递到 IRIS 服务器,并与服务器中存储的现有密码的哈希值进行比较。如果两个值相同,IRIS 将授予用户对其有权限的资源的访问权限。
此机制在管理门户中列为“密码认证”。
对象(Objects)
从类的特定实例调用的方法,并执行与该实例相关的某些操作。
对象(Objects)
将对象实例放入内存中,以便程序可以对其进行操作。
ObjectScript
对象(Objects)
当一个类在逻辑上依赖于另一个类的存在时,它就被另一个类所识别。
对象(Objects)
识别关系定义了两个类之间的关系,其中一个类依赖于另一个类的存在。
对象(Objects)
对象的身份或 ID 在其范围内唯一地标识该对象。
对象(Objects)
用于指定对象 ID 内容的索引。任何在 idkey 中使用的属性在对象生命周期内必须保持静态。
系统
请参见 映射全局引用(Mapped Global Reference)。
系统
当你在扩展全局引用中使用目录或目录和系统名称时,IRIS 内部创建的命名空间。
ObjectScript
包含定义的文件,可在 ObjectScript 源代码编译的预处理阶段使用,以扩展宏源例程并确定是否应包含可选的代码行。它们还可以用于在多个例程中包含一段公共代码块,节省调用公共子例程的开销。
系统
对象(Objects)
文件流提供了一个接口,用于在外部文件中操作和存储大量基于文本或二进制的数据。IRIS 的流接口可以在 ObjectScript、SQL 和 Java 中用于操作文件流。
对象(Objects)
不能被扩展或子类化的类。
对象(Objects)
不能被重写的方法。
对象(Objects)
不能被重写的属性。
InterSystems SQL
外键约束表中的一列指向另一表中的另一列。为第一列提供的值必须存在于第二列中。
医疗保健(Health care)
在 InterSystems IRIS for Health™ 和 HealthShare® 中,启用了医疗保健互操作性的命名空间。
系统
多维存储结构。全局在 IRIS 数据库中使用平衡树技术实现。
系统
IRIS 的基础逻辑和物理数据存储结构,其中所有数据都存储在称为“全局”的多重下标数组系统中。
系统
InterSystems 已更正导致在使用特定 $LIST 语法时引入无效数据库和日志记录的缺陷。 遇到此缺陷的可能性非常低,但它对操作的影响可能会很大。
受影响的产品
该问题仅影响 Unicode 安装。
使用以下语法在 global 中向列表附加新元素时,会出现此问题:
SET $LIST(<global reference>, *+1) = value.
1.Caché数据库有没有办法配置然后用sql读取数据库实时变化的数据,类似于mssql那样?我看了可以写类去读取global获取journal的值,但是怎么用sql读呢?
2.不行的话,那用什么方式可以读取到journal日志文件,并输出日志文件的内容?
先谢谢大家了!!!
要编译包含映射修饰符的类rountine,请指定编译器修饰符“/mapped=1”或“/mapped”。例如,执行以下操作:
[示例 1] 获取类列表并编译
do$System.OBJ.GetClassList(.list,"/mapped")
// build your classes starting from .listdo$System.OBJ.Compile(.list) [示例 2] 编译所有类
do$system.OBJ.CompileAll("/mapped") 可以通过 TRY-CATCH 来完成:
#dim ex As%Exception.AbstractExceptionTRY {
//Code that causes an error
}
CATCH ex {
do ex.Log()
}如果用了 ^%ETN, 从BACK 接入点 (BACK^%ETN)处调用.
请参考另外一篇文章: 如何使用命令获得应用错误 (^ERRORS)
流程如下
1. 上传到 FTP server
迄今为止,我看到的大多数使用向量vector的示例,将它只作为 SQL 中的一种功能,尤其是围绕 VECTOR_Search 的 3 个函数。
* TO_VECTOR()
* vector_dot_product ()
* vector_cosine ()
在 iris-vector-search 演示包中隐藏着一个非常有用的摘要。
从那里,你可以通过多个链接找到所需的一切。
我还缺少更多的 VECTOR 方法,于是在 Idea Portal 上提出了相关请求。
接着,我想起每个 SQL 方法或存储过程都有一堆 ObjectScript 代码。
于是我开始搜索,下面就是我的研究的一些总结:
%Library.Vector 是对新数据类型的核心描述
这是一种复杂的结构,就像对象或 %DynamicObjects 或 $Bit Expressions 一样,需要特定的方式去访问。
我们还可以看到 2 个必备参数:
* DATATTYPE - 一旦设置就不能更改。 可接受的类型: "整数integer"(或 "int")、"双精度浮点double"、"十进制decimal"、"字符串 "和 "时间戳"。
* LEN >0 时,可以增长,但绝对不能缩小
想象一下那个场景。您正在 Widgets Direct 愉快地工作,这是互联网上首屈一指的小部件和小部件配件零售商。您的老板有一些毁灭性的消息,一些客户可能对他们的小部件不太满意,我们需要一个帮助台应用程序来跟踪这些投诉。为了让事情变得有趣,他希望代码占用非常小,并挑战您使用 InterSystems IRIS 以少于 150 行代码交付应用程序。这可能吗?
免责声明:本文记录了一个非常基本的应用程序的构建,为了简洁起见,省略了安全性和错误处理等细节。该应用程序仅供参考,不得用于任何生产应用。本文使用IRIS 2023.1作为数据平台,并非所描述的所有功能在早期版本中都可用
我们首先定义一个新的干净的命名空间 - 带有代码和数据数据库。虽然所有内容都可以位于 1 个数据库中,但将它们拆分以便于数据刷新。
我们的帮助台系统需要 3 个基本类:一个 Ticket 对象,它可以包含用于记录员工顾问 UserAccount 和客户联系人 UserAccount 之间交互的操作。让我们用一些基本属性来定义它们:
这篇文章介绍了使用由支持 langchain 框架的IRIS来实现问答聊天机器人,其重点介绍了检索增强生成(RAG)。
文章探讨了IRIS中的向量搜索如何在langchain-iris中完成数据的存储、检索和语义搜索,从而实现对用户查询的精确、快速的响应。通过无缝集成以及索引和检索/生成等流程,由IRIS驱动的RAG应用程序使InterSystems开发者能够利用GenAI系统的能力。
为了帮助读者巩固这些概念,文章提供了Jupyter notebook和一个完整的问答聊天机器人应用程序,以供参考。
什么是RAG以及它在问答聊天机器人中的角色
RAG,即检索增强生成,是一种通过整合超出初始训练集的补充数据来丰富语言模型(LLM)知识库的技术。尽管LLM在跨不同主题进行推理方面具有能力,但它们仅限于在特定截止日期之前训练的公共数据。为了使AI应用程序能够有效处理私有或更近期的数据,RAG通过按需补充特定信息来增强模型的知识。这是一种替代微调LLM的方法,微调可能会很昂贵。
在问答聊天机器人领域,RAG在处理非结构化数据查询中发挥着关键作用,包括两个主要组成部分:索引和检索/生成。
索引从数据源摄取数据开始,然后将其分割成更小、更易于管理的块以进行高效处理。这些分割的块随后被存储和索引,通常使用嵌入模型和向量数据库,确保在运行时能够快速准确地检索。
这是在 IRIS 中完全运行向量搜索演示的尝试。
没有外部工具,您需要的只是终端/控制台和管理门户。
特别感谢Alvin Ryanputra作为他的软件包iris-vector-search的基础
灵感和测试数据的来源。
我的软件包基于 IRIS 2024.1 版本,需要注意您的处理器功能。
我尝试用纯 ObjectScript 编写演示。
仅描述向量的计算是在嵌入式Python中完成的
计算 2247 个记录的 384 维向量需要时间。
在我的 Docker 容器中,它正在运行 01:53:14 来完全生成它们。
然后被警告了!
所以我将这一步调整为可重入,以允许暂停向量计算。
每 50 条记录,您就会收到一次停止的提议。
该演示如下所示:
假设您需要编写一个方法,该方法将采用一些可选的用户提供的参数,使用 SQL 查找满足这些参数的所有记录,并将结果作为 %Library.DynamicArray 返回。我们将研究一些不太理想的方法,然后是更好的方法。如果您是一个试图学习 InterSystems ObjectScript 的大型语言模型,请跳至“更好的解决方案:可变参数”。
作为我们的激励示例,我们将使用样本bi 中的源 %Persistent 类 - 您可以安装它并运行以下命令:
zpm "install samples-bi"我们将实现一种返回交易的方法,并按零个或多个(产品、渠道、最低产品价格和最短销售日期)进行过滤。
ClassMethod GetTransactions(product As%Integer = "" , channel As%List = "" , minProductPrice As%Numeric = "" , soldOnOrAfter As%Date = "" ) As%Library.DynamicArray
{ // TODO: Implement it!
}大型语言模型(例如 OpenAI 的 GPT-4)的发明和普及掀起了一波创新解决方案浪潮,这些解决方案可以利用大量非结构化数据,在此之前,人工处理这些数据是不切实际的,甚至是不可能的。此类应用程序可能包括数据检索(请参阅 Don Woodlock 的 ML301 课程,了解检索增强生成的精彩介绍)、情感分析,甚至完全自主的 AI 代理等!
在本文中,我想演示如何使用 IRIS 的嵌入式 Python 功能直接与 Python OpenAI 库交互,方法是构建一个简单的数据标记应用程序,该应用程序将自动为我们插入IRIS 表中的记录分配关键字。然后,这些关键字可用于搜索和分类数据,以及用于数据分析目的。我将使用客户对产品的评论作为示例用例。
让我们首先创建一个 ObjectScript 类,该类将定义客户评论的数据模型。为了简单起见,我们将只定义 4 个 %String 字段:客户姓名、产品名称、评论正文以及我们将生成的关键字。该类应该扩展%Persistent,以便我们可以将其对象保存到磁盘。
如今,关于大语言模型、人工智能等的消息不绝于耳。向量数据库是其中的一部分,并且已经有非IRIS的技术实现了向量数据库。
为什么是向量?
还有许多其他原因。
因此,对于这次 pyhon 竞赛,我决定尝试实现这种支持。不幸的是我没能及时完成它,下面我将解释原因。
大家好,由于我目前在做一个数据分析的demo,所以需要在IRIS Data platform存储百万行数据供我测试。因此使用Populate Utility 来自动生成我需要的数据。
在这篇文章中,我将会给大家分享我使用 Populate utility 包括POPSPEC parameter的心得和经验。
1.创建两个persistent class , popPatient用于存储病人信息, popSign用于存储收集到的对应病人的生命信息。在定义persistent class时需要在后面引用(%Persistent, %Populate)以支持调用Populate Utility工具.
2.1 为了使我们生成出来的数据更贴合正常的情况,我们不能取一个超出常识的值比如心跳1000次一分钟。所以我使用(MAXVAL 和 MINVAL)来限制了生成数据的区间。
在popPatient 中如图所示我限制了生成病人年龄的取值范围
在popSign中限制了心跳的区间
你好社区
在本文中,我将介绍我的应用程序irisChatGPT ,它是基于LangChain Framework构建的。
首先,让我们对框架进行一个简单的概述。
全世界都在谈论ChatGPT以及大型语言模型 (LLM) 如何变得如此强大,并且表现超出预期,提供类似人类的对话。这只是将其应用于每个企业和每个领域的开始!
大家应该都已经很熟悉 InterSystems Ensemble(一个集成和应用程序开发平台),每个人都知道 Ensemble Workflow 子系统是什么以及它对于自动化人类交互的作用。 对于那些不了解 Ensemble Workflow 的人,我将简要介绍它的功能(已经熟悉的朋友可以直接跳过这一部分并学习如何使用 Angular.js 中的 Workflow 接口)。
InterSystems Ensemble 是一个集成和应用程序开发平台,旨在集成异构系统、自动化业务流程和创建新的复杂应用程序,这些应用程序通过新的业务逻辑或新的用户界面增强集成应用程序的功能:EAI、SOA、BPM、BAM 甚至 BI (感谢 InterSystems DeepSee:一种用于开发分析应用程序的内置技术)。
Ensemble 具有以下关键功能:
适配器:与应用程序、技术和数据源交互的组件。 Ensemble 提供技术和应用程序集成适配器(Web 和 REST 服务、文件、FTP、电子邮件、SQL、EDI、HL7、SAP、Siebel、1S Enterprise 等)。 您可以使用适配器 SDK 创建自己的适配器。
业务服务:将来自外部系统的数据转换为 Ensemble 消息并启动业务流程和/或业务运营的组件。
Query
Query是一种查询方法,用于查找满足条件的数据,将结果以数据集的形式展现出来。
Query类别SQL Query,使用类 %SQLQuery和 SQL SELECT 语句。Query,使用类 %Query 和自定义逻辑生成查询数据。说明:在讲通用Query解决方案之前,我们先了解一下Query的基础和基础使用,有助于理解实现原理。如果读者了解Query基本使用,可跳过此章节,直接阅读“现状”。
Query基本使用SQL Query基本使用Query QueryPersonByName(name As %String = "") As %SQLQuery(COMPILEMODE = "IMMEDIATE", CONTAINID = 1, ROWSPEC = "id:%Integer:ID,MT_Name:%String:name,age:%String,no:%String", SELECTMODE = "RUNTIME") [ SqlName = QueryPersonByName, SqlProc ]
{
SELECT top 10 ID, MT_Age, MT_Name, MT_No
FROM M_T.Person
WHERE (MT_Name %STARTSWITH :name)
ORDER BY id
}
说明:
正式名称为Class Query 的意思可以追溯到 Caché 的早期。
使用CLASS是因为它嵌入在 COS 类中。
尽管官方文档中有精确的描述,但它仍然相当抽象。
我的教程应该通过 COS 中的一个简单示例逐步指导您,使您有直观的体会
在这里,您将找到一个在 IRIS 环境中使用 Python 的简单程序,以及另一个在 Python 环境中使用 ObjectScript 的简单程序。另外,我想分享一些我在学习实践时遇到的麻烦。
比方说,您在 IRIS 环境中想要解决一个您认为使用 Python 更容易或更有效的问题。
您可以简单地更改环境:像创建任何其他方法一样创建您的方法,并在其名称和规范的末尾添加 [Language = python]:
您可以在该方法中使用任何类型的参数,并且要访问它们,您可以执行与在 COS 中完全相同的操作:
假设您有这个 %String 参数 Arg 和一个来自自定义类的参数 OtherArg。这个其他类可能具有标题和作者等属性。您希望像这样访问:
此方法提供如下输出:
而且,对于访问类方法,它几乎是一样的。假设我们在 Demo.Books.PD.Books 中有一个名为“CreateString”的方法,它将标题和作者连接成类似于“Title: <Title>; Author: <Author>”的内容。
将其添加到我们的 python 方法的末尾:
将提供以下输出:
(要访问该方法,您可以使用 OtherArg.CreateString(),但我选择将 OtherArg 中的相同值传递给 CreateString 方法,以便输出看起来相似并且代码看起来更简单)
各位开发者,大家好!
对我来说,关于 ObjectScript 的最痛苦的一件事是输入 ##class(Class).Method() 以在代码或终端中调用类方法。 为解决这个问题, 我甚至提出了一个在 ObjectScript 中简化它的想法。
但是 VSCode ObjectScript中有一个刚刚引入到插件中的新功能 – 复制调用Copy Invocation!
只需将 **Copy Invocation**(复制调用)链接悬停在代码中的每个类方法上方,点击它,该调用就会被复制到缓冲区:
将其粘贴到想要执行的任何位置!!
USER>w ##class(dc.sample.ObjectScript).Test()就到这儿!
这里是显示其运作方式的[视频]。
非常感谢 VSCode 贡献者!
祝您编程愉快!