嘿开发者,
观看此视频,了解 UC Davis Health 如何使用 InterSystems API Manager 来满足业务合作伙伴对访问自定义 API 和 FHIR API 的需求:
InterSystems IRIS 是一个完整的数据平台
InterSystems IRIS 为您提供了捕获、共享、理解组织最宝贵的资产(数据)并采取相应行动所需的一切。
作为一个完整的平台,InterSystems IRIS 不需要集成多种开发技术。应用程序需要更少的代码、更少的系统资源和更少的维护。
嘿开发者,
观看此视频,了解 UC Davis Health 如何使用 InterSystems API Manager 来满足业务合作伙伴对访问自定义 API 和 FHIR API 的需求:
大型语言模型(例如 OpenAI 的 GPT-4)的发明和普及掀起了一波创新解决方案浪潮,这些解决方案可以利用大量非结构化数据,在此之前,人工处理这些数据是不切实际的,甚至是不可能的。此类应用程序可能包括数据检索(请参阅 Don Woodlock 的 ML301 课程,了解检索增强生成的精彩介绍)、情感分析,甚至完全自主的 AI 代理等!
在本文中,我想演示如何使用 IRIS 的嵌入式 Python 功能直接与 Python OpenAI 库交互,方法是构建一个简单的数据标记应用程序,该应用程序将自动为我们插入IRIS 表中的记录分配关键字。然后,这些关键字可用于搜索和分类数据,以及用于数据分析目的。我将使用客户对产品的评论作为示例用例。

让我们首先创建一个 ObjectScript 类,该类将定义客户评论的数据模型。为了简单起见,我们将只定义 4 个 %String 字段:客户姓名、产品名称、评论正文以及我们将生成的关键字。该类应该扩展%Persistent,以便我们可以将其对象保存到磁盘。
Class DataTagging.生产级别的Cache集群往往由多个Cache实例组成,而Cache自带的管理界面不能满足对整个集群的监控,因此在实际使用中,往往需要投入人力对实例进行性能巡检。即便如此,这种巡检模式实时性低、告警的漏报错报率高、对既往数据追溯能力差。针对Cache/IRIS集群管理的这一缺憾,本文提出以Prometheus监控Cache集群的方案,最终实现了对集群全实例监控指标的自动化采集,以及准实时监控数据展示和告警提示。

Prometheus是一个开源的监控收集框架。它内置了一个数据收集服务、一个时序数据库、和一个Web UI管理界面。 Prometheus采用PULL模式拉取监控数据,使得它在众多监控解决方案中脱颖而出。这种PULL模式只需被监控对象暴露出符合Prometheus要求的接口即可,而无需配置监控服务器地址,也无需管理定时任务,对应用程序的侵入性极小。 Prometheus也有一个健全的生态。它提供各种管理接口API,如自动服务发现、告警、查询等接口,和已有开源软件互操作性好,也方便接入机构内部系统。其中Grafana是最重要的生态伙伴,它是一个开源的数据可视化工具,支持动态的更改数据源、灵活地配置报表、编写Prometheus查询语句、定义告警等。
InterSystems IRIS、Health Connect和上一代的Ensemble提供了优秀的互操作架构,但即便有低代码开发能力,很多开发者还是希望能用自己的技术栈语言在InterSystems的产品上开发互操作产品。
考虑到互操作产品本身的开放性要求和各个技术栈背后庞大的生态价值,InterSystems IRIS和Health Connect提供了Production EXtension (PEX)架构,让开发者使用自己的技术栈语言来开发互操作解决方案。目前PEX支持Java、.net、Python。
这里我们介绍使用Java利用PEX进行互操作产品的开发。
在进入PEX主题前,需要简单介绍一下Java在InterSystems IRIS上开发的各种技术选项,因为PEX也是以这些技术选项为基础的。
近日,InterSystems宣布 InterSystems IRIS® Cloud SQL 和 InterSystems IRIS® Cloud IntegratedML® 服务全面上市。 这些全面托管的云原生智能数据服务使开发人员能够轻松地在SQL环境中构建云原生数据库和机器学习(ML)应用程序。
通过 Cloud SQL和 Cloud IntegratedML,开发人员可以访问下一代关系数据库即服务(DBaaS),DBaaS快速且易于配置和使用。 嵌入式AutoML功能支持开发人员在全面托管的、弹性的云原生环境中,仅仅通过几条类似SQL的命令即可轻松开发并执行机器学习模型。
这里介绍三个SQL函数 JSON_ARRAY 、 JSON_OBJECT和JSON_ARRAYAGG,可以直接通过SQL语句返回JSON格式数据
1. JSON_ARRAY 函数通过逗号(,)分割的多个表达式,返回JSON array格式的数据
SELECT TOP 3 Name,
JSON_ARRAY(%ID,%TABLENAME,UCASE(Name),Age,Home_State) "JSON data"
FROM Sample.Person也可以忽略空值(null) ,添加“ABSENT ON NULL”
SELECT TOP 3 Name,
JSON_ARRAY(%ID,%TABLENAME,UCASE(Name),Age,Home_State ABSENT ON NULL) "JSON data"
FROM Sample.Person获取到的返回结果
.png)
如果想显示空值(null),使用"NULL ON NULL",如果没有特意标明,则该设置为默认值。
下面语句获取客户所有电话号码,并以JSON array格式返回:
SELECT JSON_ARRAY(HomePhone,WorkPhone,Mobile) "JSON data"
FROM Test.Phones["055-8263371","052-4957286","054-4951066"]2.
如果系统24小时没有停止,旧的日志文件将根据“日志文件删除设置”在0:30删除。
导致日志文件保留的时间早于“日志文件删除设置”的一个可能原因是存在仍处于开放状态的事务。
在这种情况下,您将能够通过搜索执行事务的进程并完成事务来删除日志文件。
下面的示例检查是否存在未完成的事务,如果存在,则输出目标文件名和日志记录信息。
(示例可以从这里下载
*注意*如果要检查的日志文件较大或日志文件较多,则执行需要时间,因此请联系我们的支持中心。
Class ISJ.JournalUtility { ClassMethod GetOpenTransaction() As %Status { set status= $$$OK #dim ex As %Exception.AbstractException #dim rset As %ResultSet try { //current journal file write !, "Current journal file name:" , ##class ( %SYS.Journal.System ).GetCurrentFileName(),!作为针对数据导入处理性能和错误(锁定表已满)的衡量标准,可能需要调整常规内存堆 (gmheap) 和锁定表大小 (locksiz) 参数。
事实上,您可以使用终端和管理门户来检查当前分配了多少通用内存堆。
★终端用
// 一般メモリヒープサマリUSER> w $system .Config.SharedMemoryHeap.GetUsageSummary() 4992226 , 6029312 , 59441152通用内存堆摘要以使用量、分配量和配置量(字节)的形式显示返回值。
使用量是分配的锁表、进程表等实际使用的量。
分配量是gmheap区域中锁表、进程表等分配的量。
配置量为gmheap(KB)+IRIS系统附加区,即当前最大可用量(实际通用内存堆区值)。
如上所述,配置数量与配置参数 gmheap 的独立值不匹配。
这是因为IRIS自动将内部使用的内存区域添加到配置参数gmheap中来配置通用内存堆区域。详情请参阅下面的文档。
您可以使用以下命令获取锁表的使用情况:
返回值显示为可用量、用户可用量和已用量(字节)。详情请参阅这篇文章。
%SYS > w ##class (SYS. Lock ).GetLockSpaceInfo() 16772624 , 16764624 , 4592
★用于管理门户
您可以从“系统操作”>“系统使用情况”>“共享内存堆使用状态”进行检查。
Gartner魔力象限是业内知名的分析报告,针对特定市场进行严谨、基于事实的研究后发布的魔力象限报告,可为用户提供全面视图,以便其了解在高速增长、差异化明显的市场中供应商的相对位置。在魔力象限中,供应商被定位在四个象限中:领导者(Leader)、挑战者(Challenger)、远见者(Visionary)和利基玩家(Niche Player)。
2023年年底,在 Gartner 2023年最新发布的“云数据库管理系统(Cloud DBMS)魔力象限”中,InterSystems再次荣膺“挑战者”(Challenger)称号,这是InterSystems第三次入围这一报告并得到认可(2022年“远见者”,2021年“挑战者”)。
Gartner此次评估面向包括InterSystems在内的19家云数据库管理系统供应商进行。我们相信,Gartner魔力象限“挑战者”这一定位,证明了InterSystems有能力挑战现状、推动创新,为市场提供独特的解决方案。
InterSystems IRIS数据平台提供的结缔组织(connective tissue)可将不同来源的分散数据转换为单一、完整的视图,从而在医疗保健、金融服务和供应链等关键市场中为具有关键数据需求的客户提供更好的结果。
嗨,大家好,
我们想重点介绍 2023 年布拉格欧洲欧洲医疗健康黑克松Hackathon期间创建的一些杰出项目。
IKEM 和阿斯利康向参与者提出了九个现实世界的医疗保健挑战。
InterSystems 向参与者介绍了使用 FHIR 存储库并通过在 AWS 上提供 FHIR 云服务来在其解决方案中执行 FHIR 可用性的机会。
来认识一下我们挑战的获胜者:
第一名Čarodějové (PathoSync)
“PathoSync 软件是复杂病理学家平台的坚实基础。通过使用自定义映射,任何实验室都可以将其数据投影到 FHIR7 标准,该标准很快将在全球范围内强制执行。这使得数字化过程更加顺利。与 InterSystems 的连接确保了质量并实现了很多医疗保健功能。此外,使用位于欧洲的FHIR服务器严格遵循GDPR规范,因此软件的使用遵循欧洲标准。
ZFEntry 表每个 Callout 库必须定义一个 ZFEntry 表,该表允许 IRIS 加载和访问 Callout 函数。 ZFEntry 表由以 ZFBEGIN 开头、以 ZFEND 结尾的宏代码块生成。在这两个宏之间,必须为要公开的每个函数调用一次 ZFENTRY 宏。
每个 ZFENTRY 调用都采用三个参数:
ZFENTRY(zfname,linkage,entrypoint)
其中 zfname 是用于在 $ZF 调用中指定函数的字符串,linkage 是指定如何传递参数的字符串,entrypoint 是 C 函数的入口点名称。
要创建 Callout 库,代码必须包含 #define ZF_DLL 指令,该指令是一个开关,可生成用于定位库函数的内部 GetZFTable 函数。加载 Callout 库时, IRIS 调用此函数来初始化该库,以便后续查找库函数名称。
注意:ZFEntry 序列号
ZFEntry 表中条目的位置可能很重要。 $ZF(-5) 和 $ZF(-6) 接口(在“调用标注库函数”中描述)都通过指定表中的序列号(从 1 开始)来调用库函数。
在医疗行业中,处方是个非常重要的临床工作数据概念。因此,在考察用FHIR能如何构造我国所需医疗行业数据模型时,就会需要考虑如何用FHIR表达处方。
在2019年,FHIR的工作组已否认需要使用特定的资源来表达处方(不是药嘱)这个概念,见:
https://jira.hl7.org/browse/FHIR-24905

奇妙的是,IHE规范中却明确有处方(Prescription)的定义并需要引用药嘱(Medication Treatment Plan Item)。
https://www.ihe.net/uploadedFiles/Documents/Pharmacy/IHE_Pharmacy_Suppl_PRE.pdf?#page=12
FHIR官网指出这种复合式的request有三种表达方式:
• Shared requisition id
• "Based on" chain
• RequestOrchestration
https://build.fhir.org/request.html#compound
在FHIR实际应用中,则可以见到多种形态使用容器类资源表达处方并包含药嘱的表达形式,例如:
在此文章中将分享,当使用InterSystems IRIS 做后端时如何接收并保存通过POST方式发送过来的 Base64文件。
前后端之间传输文件,我认为较简单的方式是:前端将文件转为Base64格式,调用POST方法并将Base64内容附加在JSON消息中的一个参数中,在JSON消息中的另一个参数可以是文件名,比如消息定义如下:
{
"fileData": "JVBERi0xLjQKJdPr6eEKMSAwIG...",
"fileName": "example.pdf"
}在IRIS中,可以定义一个web application用于处理POST请求,同时定义一个分派类继承于%CSP.REST,在类中定义一个方法,具体保存文件。
代码示例:
ClassMethod SaveFile() As %Status
{
Try {
Do ##class(%REST.Impl).%SetContentType("application/json")
If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTErrorTCP作为OSI 7层的传输层的通信协议,其使用上不像更上层的通信协议那么方便,因为TCP操作的不是数据包,它操作的是数据流。因此有多种将TCP数据流“解释”为数据包(消息)的方法。
InterSystems IRIS提供了多种TCP适配器,用于不同的“解释”,例如EnsLib.TCP.FramedInboundAdapter使用特定的首尾字符做为分隔、EnsLib.TCP.CountedInboundAdapter使用固定的长度进行分隔...
同时,InterSystems IRIS提供了多种开箱即用的TCP业务服务和业务操作,方便接入和发送TCP数据。这里我们介绍常见的使用特定的首尾字符做为分隔的TCP业务服务和业务操作。
EnsLib.TCP.Framed.PassthroughService和EnsLib.TCP.Framed.PassthroughOperation是一组使用特定的首尾字符做为分隔TCP数据流的通用业务服务和业务操作。EnsLib.TCP.Framed.PassthroughService业务服务会将TCP数据封装在Ens.StreamContainer发送给业务流程或业务操作;而EnsLib.TCP.Framed.PassthroughOperation业务操作发送并接收Ens.
InterSystems IRIS 提供了一组通用的RESTful 业务服务和业务操作类,用户无需开发自定义的业务服务和业务操作类,就可以直接向外提供RESTful服务和调用外部的RESTful API。
| BS | EnsLib.REST.GenericService | 通用REST业务服务 |
| BS | EnsLib.REST.SAMLGenericService | 检查SAML令牌的签名和时间戳的REST业务服务 |
| BO | EnsLib.REST.GenericOperation | 通用REST业务操作 |
| BO | EnsLib.REST.GenericOperationInProc | 用于透传模式的通用REST业务操作 |
通用的RESTful 业务服务和业务操作类使用一个通用的RESTful消息类 - EnsLib.REST.GenericMessage,它是EnsLib.HTTP.GenericMessage的子类,二者数据结构都是
| HTTPHeaders | 记录http头的数组 |
| Stream | 记录http体的数据流 |
| Type | 数据流类型,例如是字符流还是二进制流。 |
目前在使用Codemirror展示cache的代码,codemirror能支持csp和js的代码高亮,但是cls的代码没有对应插件,不知具体关键字的正则表达式,是否有对应插件或解决方法,可是cls代码高亮。
SqlDbx是我们常用的数据库查询与操作工具,因其轻量且无须安装而无处不在,然而习惯了在Intersystems的CACHE和ENSEMBLE版本下使用SqlDbx在升级到IRIS版本后却无法使用了,为此进行了一系列尝试,并最终获得成功,形成本文攻略,分享给大家。
1、在SqlDbx的连接登录窗口,从DBMS Type中直接选择 “InterSystems CACHE”连接IRIS会报错,提示“通过IRISconnect失败”,说明“InterSystems CACHE”不再适用于IRIS。


2、考虑IRIS的ODBC支持,为此换一种思路,采用ODBC方式连接,此方式需要在ODBC中建立DSN。


3、从Intersystems官网https://intersystems-community.github.io/iris-driver-distribution/或github网站https://github.com/intersystems-community/iris-driver-distribution/tree/...下载InterSystems IRIS ODBC 32位驱动,注意一定要下载32位驱动(注:SqlDbx现只支持32位的ODBC)。


由于InterSystems最近宣布从2023.2版本开始停止对InterSystems Studio的支持,转而独家开发Visual Studio Code(VSC)IDE的扩展,相信后者比Studio提供了更优越的体验,我们很多开发者都已切换或开始使用 VSC。很多人可能想知道如何打开终端进行操作,因为VSC没有像Studio那样的输出面板,也没有集成的功能来打开IRIS终端,除非下载InterSystems开发的插件。
在 VSC 中打开终端的方法有多种,具体取决于您使用的具体配置,我在这里总结了适合任何情况的最佳解决方案:
至少拥有 IRIS 2020.1.1 或 IRIS 2021.1.
由于国内使用基于M语言IRIS平台几乎都在医疗行业。医疗系统又非常的庞大和复杂。前期由于快速占领市场,系统数量越来越多,到了临界点后就产生了质变,所以前期基于功能的线性开发注重效率,所以导致大量的产品业务代码有如下集中情况:

如上图所示,这仅仅是展示了五个模块之前的交互,在此基础上继续增加模块则复杂度成指数级上升,并且如果每个模块之间如果没有做好接口管理,维护起来也是地狱级别。
如何解决这个问题,一般会分为两派:优化派与架构派。
优化派的思想是将现有的系统优化。例如重构某个方法,优化某个SQL。优化派的优势是针对系统改动较小,可以保持系统的稳定性,可以快速实施,缺点是治标不治本,随着需求越来越多,增加的代码量越多,后期还是会撑不住。
架构派的核心思想是调整系统架构,将原来的大系统拆分为多个互相配合的小系统,例如药库系统拆分为,采购模块,订单模块,查询模块,分析模块等。架构派的优势是一次调整可以支撑比较长期的业务发展,缺点是动作较大,耗时较长,稳定性需要项目考验。
这是Java 编程比赛的相关文章。
我决定推出一个基于 IRIS Native API for Java 的 CRUD++ Global编辑器。
++因为它不仅仅是C reate、 R ead、 U pdate、 D elete
Global可视化对于立即查看结果始终很重要。
这需要在服务器端有一个小的帮助器类作为默认 API 的扩展
我的策略是拥有一个可从命令行使用的相当适度的界面
就像在 Docker 控制台或终端上一样,并使其尽可能简单。
花哨的图形界面只会分散示例的基本内容。
如果有任何默认值或先前的值,则会在输入提示中显示。
在 Docker 容器中,编辑器已经可以使用了。
您首先连接到服务器
欢迎使用 IRIS NativeAPI 全局编辑器
>>> 服务器IP [127.0.0.Hi 开发者们,
我们非常高兴地邀请大家参加新的 InterSystems 在线编程竞赛,重点关注 Java 及其衍生产品!
时间: 2023年11月13日至12月3日(美国东部时间)
奖金池: 14,000 美元
.jpg)
我们最近发布了一份关于在镜像环境中使用报告节点(完整的“异步报告镜像成员”)的新白皮书。越来越多的客户正在研究这种机制,将其作为一种快速、简单的方法来设置保持最新的生产数据副本,但可以用于分析查询或重型报告工作负载,而不影响源系统。 请在此处阅读白皮书。
与往常一样,我们很想听听您对如何在组织中使用此镜像选项的反馈,以及您是否对我们如何提高其效率有想法。
本主题介绍如何发送HTTP请求(如POST或GET)和处理响应。
可以创建%Net.HttpRequest的实例来发送各种HTTP请求并接收响应。此对象相当于Web浏览器,可以使用它发出多个请求。它会自动发送正确的cookie,并根据需要设置Referer标头。
要创建HTTP请求,请使用以下常规流程:
%Net.HttpRequest的实例。localhost。注意:不要将http://或https://作为服务器值的一部分。这将导致错误#6059:无法打开到服务器http:/的TCP/IP套接字。
%Net.HttpRequest实例的get()方法或其他方法来发送HTTP请求,如“发送HTTP请求”中所述。可以从实例发出多个请求,它将自动处理cookie和Referer标头。
注意:如果创建此HTTP请求是为了与生产出站适配器(EnsLib.HTTP.Outbound Adapter)一起使用,那么请改用该适配器的方法来发送请求。
%Net.HttpRequest的同一实例发送其他HTTP请求。自 InterSystems IRIS 2023.3 发布起,CentOS 将不再是受支持的开发平台。
CentOS 一直是一个受支持的开发平台,为开发人员提供了相当于 Red Hat Enterprise Linux (RHEL) 的免费版本,用于 IRIS 开发。您可能知道,Red Hat 对 CentOS 进行了重大更改,CentOS 已成为 RHEL 的“上游”。这意味着它具有 RHEL 中尚未包含的错误和功能,这可能会给在该平台上构建的开发人员带来问题。
我们鼓励使用 CentOS 的开发人员利用 Red Hat 的免费开发人员计划来获得 RHEL 的免费开发许可证。
CentOS 继续支持 IRIS 2023.2(及更早版本)。
对于经常进行插入、删除操作的表,位图索引的存储往往会变得不那么高效。
例如,下面定义的表,经常进行大数量的删除操作 (TRUNCATE TABLE)
Class MyWork.MonthData Extends (%Persistent, %Populate)
{
/// Level of satisfaction
Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
/// Age
Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
Index AgeIdx On Age [ Type = bitmap ];
}对该表进行插入操作后,索引表存储的内容为:
【INSERT】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(401,120,4,75,102,10,<omit> 958)/*$bit(5,76,103,107・・・
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(407,121,29,178,251,2<omit>,732,772,898,960)/*$bit(3・・・
^MyWork.使用(^GLOBUFF )可以获取到使用的数据库缓存global buff的大小,
可以直接执行这个命令或者通过代码的方式获取结果
下面是执行命令的方式:
USER>zn "%SYS"
%SYS>do ^GLOBUFF
Find which globals are using the most buffers.
Display the top <25>: → Press Enter // Default is to display top 25 globals
Total buffers: 102400 Buffers in use: 6926 PPG buffers: 77 (1.112%) // Global name, database name, percentage occupied by the buffer
Item Global Database Percentage (Count)
1 oddDEF IRISLIB 34.iris 是数据平台,更是一种数据库。对于熟悉SQL语句的人来说,会认为“既然是数据库,数据应该就能使用sql语句来查询”。这是对的,但是因为有global这个概念,保存的数据可能在global里面,而没有对应的表,也可能保存在类的参数定义里面。这些数据,不能使用sql直接查询。要查询iris数据库的数据,通常有几种方式:1.直接查询表的数据。2.查询视图。3.调用存储过程(call 命令)。其中要查询“只存于global里面或者类参数里定义的数据”,只有使用存储过程。但是存储过程有个问题,就是程序如果迁移到低版本的cache数据库后,数据类型的定义会有问题,且不再支持使用select的方式,只能使用call。这对于第三方熟悉sql的人员来说很不友好。因此结合global和表的关系,介绍一种我称为“进程表”的表。进程表,指数据只存于该进程中,global的样式为"^||global名“。通常按照默认存储新加一个持久类(对应会生成一个表),然后手动的把global改成进程global,也就是加上”||“。然后写个方法,把需要查询出来的数据写入进程global。这样就能查询出来 了。调用形式为 SELECT * FROM People WHERE People_GLB()=1。
示例如下:
一般情况下,我们根据iris的portal向导创建数据库,然后创建命名空间。这个过程比较花时间,如果是已经存在的数据库,还需要再装载。翻阅portal调用的方法后,我整合了这几个方法。把这几个方法拷贝到任意已经存在的命名空间,通过执行CNNS(路径,命名空间),就可以快速创建好命名空间。方法的大概过程是,进入到%sys命名空间,然后依次创建数据库,创建命名空间,创建web应用。创建完成后,回到当前命名空间。
{
s currentNS = $namespace
s $zt="Err"
zn "%SYS"
s ret=..CNNS1(pathroot,NS)
zn currentNS
q ret
Err
zn currentNS
q $ze
} ClassMethod CNNS1(pathroot, NS)
{
s APP="APP"
d ..CDB(pathroot,APP,NS,.sc)
q:sc'=1 sc
s DATA="DATA"
d ..CDB(pathroot,DATA,