嘿,社区的朋友们大家好!
是的,我知道我们有很多技巧和窍门类的文章-——我们甚至为此专门设置了一个标签(Tips & Tricks),不是吗?但我不能分享我自己的收藏。在这个合集中,您可以找到适合初学者的代码片段,以及一些日常的 ObjectScript 结构。事实上,这也是一种学习我最喜欢的编程语言的新方法。所以,如果你们有什么要补充的,欢迎提出!
InterSystems IRIS 是一个完整的数据平台
InterSystems IRIS 为您提供了捕获、共享、理解组织最宝贵的资产(数据)并采取相应行动所需的一切。
作为一个完整的平台,InterSystems IRIS 不需要集成多种开发技术。应用程序需要更少的代码、更少的系统资源和更少的维护。
嘿,社区的朋友们大家好!
是的,我知道我们有很多技巧和窍门类的文章-——我们甚至为此专门设置了一个标签(Tips & Tricks),不是吗?但我不能分享我自己的收藏。在这个合集中,您可以找到适合初学者的代码片段,以及一些日常的 ObjectScript 结构。事实上,这也是一种学习我最喜欢的编程语言的新方法。所以,如果你们有什么要补充的,欢迎提出!
这一次,我们使用 React 作为 IRIS 的前端开发工具,这本身并不是真正的编程。在使用网络开发框架(不限于 React)时,一个关键的考虑因素是使用哪种 CSS 框架。到目前为止,我们一直在使用 Bootstrap,它是标准的,也是最容易上手的。
不过,虽然它很容易使用,但我觉得它提供的自定义灵活性有限。也就是说,即使我们要改用其他 CSS 框架,学习它并从头开始重写所有内容也是一项巨大的工作,所以我们就保持原样。
这一次,在获得了名为 "Claude Code "的强大工具后,我试着让它将 Bootstrap 转换为 Materialize。结果是:修改一次性完成。包括验证在内,整个过程不到五分钟。如果我自己研究 Materialize 并实现它,我想至少需要两三天的时间。
引导式屏幕
Materialize 屏幕
简单地更改样式表并不有趣,所以我还要求修复一个我注意到是错误但一直没有解决的问题。
问题是,即使在编辑屏幕上删除了数据,这些数据仍然会出现在左侧的列表中。
只需一个请求就能轻松解决这个问题。
以下是修复请求的内容:
After pressing the delete button in ExpenseItem.tsx and deleting the corresponding record, update the list in ExpenseItemList.txt so that the deleted item is no longer included in the list.
RabbitMQ 是一个消息代理,它允许生产者(发送数据消息的一方)和消费者(接收数据消息的一方)建立异步、实时且高性能的海量数据流。RabbitMQ 支持 AMQP(高级消息队列协议),这是一种开放标准的应用层协议。
采用 RabbitMQ 的主要原因包括以下几点:
我们将利用温度监测器作为案例来详述 RabbitMQ 的概念:
要建立一套自动化的数据转换流程,实现临床数据对真实世界证据的支持,面临着诸多困难:数据标准林立、数据转换难、数据质量差、治理耗时耗力。
InterSystems OMOP 数据管道创新地打通“FHIR + OMOP”两个标准。通过FHIR标准解决数据的“互联互通”问题;通过OMOP解决数据的“科研分析”问题——OMOP 的主导型场景体现在真实世界研究,标准化的数据模型能够降低科研门槛,加速从数据到知识的转化,已在全球 80 多个国家的 4000 多家机构得到应用。
往期技术视频速递:详细拆解InterSystems FHIR to OMOP解决方案,通过Demo演示,向您展示数据如何从FHIR到OMOP无缝流转,助力您实现临床数据转换流程的自动化,提升研究效率。
如果您是 InterSystems 的新用户,欢迎访问InterSystems 开发者交流中心(Developer Hub)。
您可以从这里开始使用 InterSystems 技术——安装 InterSystems IRIS,连接到它,运行一些实际的东西,或者直接在基于浏览器的交互环境中试用产品(无需设置)。
如果你想知道从哪里开始,这里有你会发现的内容:
开发者入门指南 - 介绍 InterSystems IRIS 的结构以及如何设置它
快速入门 - 简短实用的指南,帮助您从零开始进行设置
引言 - ObjectScript 中的人工智能流问题
今天,我想介绍一下我在将 AI API 集成到 ObjectScript 应用程序时遇到的一个问题以及找到的解决方案。我最初的测试很成功,但也有些令人沮丧。
HTTP 调用成功了;请求正确地发送到了我的 LLM API。但随后,沉默......漫长的等待。最终,整个响应以单个块的形式到达。
从技术上讲,它成功了,但与 ChatGPT 会话相比,用户体验令人失望。
现代模型设计为逐个令牌流式输出。这使得等待时间大大缩短,因为即使尚未生成完整的答案,您也可以开始读取响应。 要启用此行为,只 需向 API传递 stream=true。 不过,在这种看似简单的操作背后有一个重要的细节:流媒体依赖于服务器发送事件(Server-Sent Events,SSE)。
如果不支持客户端 SSE,就无法利用这种模式。
对于通常在 ObjectScript 中使用的 %Net.HttpRequest 类,响应会被缓冲,直到连接关闭。换句话说,没有增量读取,没有渐进标记,因此也就没有流。
如果我们希望将 LLM 集成到 IRIS 应用程序中,那么能够处理 文本/事件 流、即时解析事件和实时处理数据是至关重要的 。
持续训练(CT)流水线将基于特定时间点可用数据,通过数据科学实验开发出的机器学习(ML)模型规范化。它不仅为模型部署做好准备,还支持在新数据可用时进行自主更新,同时具备用于审计目的的稳健性能监控、日志记录和模型注册功能。
InterSystems IRIS 已经提供了支持此类流水线所需的几乎所有组件。然而,缺少一个关键要素:标准化的模型注册工具。在本文中,我将介绍一种结合 IRIS 优势与开源 AI 工程平台 MLflow 的方法。它们共同作为构建有效持续训练(CT)流水线的互补工具。
本仓库中的实现利用了 MLflow 的内置配置来存储 SHAP 解释器,以提供对相应模型预测结果的解释,包括随机森林(Random Forest)、XGBoost、神经网络等“黑盒”复杂模型。
**演示视频**:https://youtu.be/qLdc4jhn83c
---
该 CT 流水线模块背后的理论基于 Google 在相关文章中定义的 MLOps 1 级行业标准。每个组件的实现都利用了 IRIS 和 MLflow 的最佳特性(如下图所示,红色部分突出显示):

对于那些刚接触 CT 流水线的人来说,上图描述了数据科学项目中传统的实验阶段(上半部分“实验/开发/测试”,通常在 Jupyter Notebook 中进行)如何转化为生产级模型部署。
如果您有长时间运行的报文,这里有一段简单的代码可以捕获它们。您也可以使用队列等待警报(Queue Wait Alert)来获得相同的结果,不过这段代码甚至可以捕获队列为空的单条活动消息。它还能扫描所有命名空间,且不会对生产进行修改,因此可用于调试。
Include Ensemble
Class User.LongMessagesTask Extends %SYS.Task.Definition
{
Parameter TaskName = "Long running messages";
Property LongRunningMessageThreshold As %Integer(MINVAL = 1) [ InitialExpression = 60 ];
Method OnTask() As %Status
{
set ts = $zdatetime($NOW(0),3,1)
set ns = ""
while 1 {
// Iterate namespaces
set ns = $o($$$EnsJobMonitorRoot(ns))
quit:ns=""
set job =""
while 1 {
// Iterate jobs
set job = $o($$$EnsJobMonitorRoot(ns, job))
quit:job=""
// Get business host name
set bh = $o($$$EnsJobMonitorRoot(ns,job,""))
// Get the time of the last state change
set lastActivity = $$$EnsJobMonitorRoot(ns,job,bh,"%LastActivity")
// Get active message, if any - bh can be just idling
set active = $d(^[ns]Ens.ActiveMessage(job),messageid) // From $$$EnsActiveMessage
if active {
set time = $system.SQL.Functions.DATEDIFF("s", lastActivity, ts)
if time > ..LongRunningMessageThreshold {
set text = $$$FormatText("Long running message %1, in ns: %2, BH: %3, processing since %4, for %5 seconds", messageid, ns, bh, lastActivity, time)
// For debug
// write text, !
do ##class(%SYS.System).WriteToConsoleLog(text)
}
}
}
}
quit $$$OK
}
}有时,客户需要一个小型 IRIS 实例在云中执行某些操作,然后将其关闭,或者他们需要数百个容器(即每个最终用户或每个界面一个容器)来处理小型工作负载。 这个练习的目的是了解 IRIS 实例可以做到多小。在这次练习中,我们重点研究了IRIS 实例可配置的最小内存量。 您知道影响 IRIS 内存分配的所有参数吗?
这些是影响 IRIS 内存分配的不同桶及其相应参数:
在 InterSystems IRIS 中使用 OpenEHR
我们偶尔会收到有关在 InterSystems 中使用 OpenEHR 的问题。 通常,这些讨论的重点是企业为什么以及如何在构建应用程序时实施 OpenEHR。下面是一份简要指南:
作为新的互操作性用户界面浪潮的一部分(请参阅@Aya Heshmat 在2025.1 和2025.3中介绍的新内容),v2026.1已经作为开发者预览版发布,这可能是您尝试一下的理由——它将发布用于消息查看和搜索的新用户界面,包括可视化跟踪(以及其他用户界面好东西)。
以下是一个快速预告:

大家好,我是姚鑫。
最近一段时间,我把自己过去几年在 InterSystems IRIS 项目中的开发经验,系统整理成了一本书—— 📕 《IRIS(数据平台)编程技术指南》 现已由 北京航空航天大学出版社 正式出版发行。
说实话,写书的过程比我想象中要难很多。 如果说写博客是“随手记录”,那么写书就是一次真正的“工程项目”:要保证结构完整、逻辑严谨、内容能从入门一路带到实战。
本书围绕 InterSystems IRIS 的核心开发语言 ObjectScript 展开,内容不仅讲语法,更注重“工程实践”。
主要包括:
✅ IRIS 平台介绍与开发环境搭建 ✅ ObjectScript 语法规则、变量体系、全局变量机制 ✅ 常用数据类型、表达式、系统命令、系统函数 ✅ 函数与方法、面向对象编程基础 ✅ %Persistent 持久类(ORM 与 SQL 映射) ✅ Storage 存储策略、懒加载机制、并发分析 ✅ 嵌入式数据结构、常见性能问题与技术难点解析
整体内容更偏向“项目实战型”,不是纯概念堆砌。
Hi 大家好!
备考 InterSystems 认证考试,仅阅读文档远远不够,更需要针对真实考试目标进行集中练习。如果您计划在 HL7、SQL、系统管理或开发领域验证自己的专业技能,系统化的准备将带来显著效果。
🧑🏫 备考平台

本平台提供了大量与认证领域相匹配的练习题,并附有详细的答案解析,指出相关文档参考。您还可以随时跟踪自己的学习进度,从而更清晰地了解哪些方面有所提升、哪些方面仍需加强。
通过教材与互动测验的结合,您可以找出薄弱环节,巩固知识,并以更充分的信心应对考试。
👉 点击此处开始练习
请注意,exam-prep.es 是一个独立的练习平台,与 InterSystems 无任何关联。本平台旨在作为备考的辅助工具使用。
我们在将 IRIS 实例迁移到另一台机器(甚至可能是升级版本)后,有多少次是在几天之后才猛然惊觉:我们忘了迁移那个对于业务操作(Business Operations)至关重要的 SSL 配置?或者是漏掉了某个凭据(Credential),又或是某个包里孤零零的一个类?
最简单的法子就是列一张清单¹。把我们必须迁移的实体项都罗列出来。但是,Word 文档里的简易清单往往会被人抛诸脑后,甚至干脆被无视。
管理学的基本原理告诉我们:如果你希望人们遵循流程,你可以采取以下手段:
Python 脚本固然可行,但人们可能会忘记脚本放在哪儿,或者去哪儿下载。一旦有了新版本,所有使用者都得重新下载。
IRIS 类或任务似乎也是理想选择,直到你意识到有时你是迁移到另一个网络的服务器,一个实例根本无法访问另一个。
这就是为什么我选择了浏览器插件一旦安装,它便触手可及(哪怕你几个月不用它);更新会自动完成。即便你换了浏览器或出于某种原因弄丢了插件,从应用商店重新安装也只是点击一下的事。
尽管LOCK(docs) 是 InterSystems IRIS 的基础部分,负责并发性,但开发者社区上关于它的讨论并不多。这是可以理解的,因为它是一个稳定且相当低级的命令。在本文中,我将举一个简单的例子,说明如何使用互操作性锁。在示例中,我们将有一个本地表,其中的引用数据由两个不同的进程使用:
这里的问题是,当业务操作更新表时(最糟糕的情况是进行完全重建),自定义函数将无法从表中获取数据,这将导致 DTL/规则处理出现问题。
锁可以帮助我们解决这个问题。具体方法如下:
更新器业务操作会先使用共享锁,然后再释放独占锁。一旦某个进程获得独占锁,IRIS 就会保证其他进程无法获得同一资源上的锁。这样,当独占锁被持有时,实用程序就无法获取共享锁。一旦我们的业务操作完成对表的更新,它就会释放独占锁,允许实用程序访问表。
让我们开始吧
有点简单(在实际项目中作为 LUT 可能会更好),但我们的目的是展示锁是如何工作的,而不是构建一个复杂的表:
Class Lock.RefData Extends %Persistent
{
Property Value;
}大家好。又是我!!😀
最近,我试图整理InterSystems IRIS😆的一些学习材料,并意识到这些资源实际上非常分散。
因此,我在这里列出了一个按类别分组的列表,供以下人员使用:
此外,我还补充了一些自己的经验,说明哪些有用(哪些没用,可能只是对我没用🤫🤐)。
如果您不知道从哪里开始,请从这里开始:
我的体验 从 Developer Hub + 入门开始效果很好。它提供了快速运行的足够条件(无需安装,直接测试!!!!ᾒ)。
不适合我的地方 一开始就直接进入文档→正如我常说的...我知道句子中的每个单词,但就是不理解🥲。
当你想真正开始工作时: