前面介绍了通过mirroring或shadow,使用journal日志过滤器的方式,在不改动数据模型的情况下实现InterSystems IRIS/Caché上的CDC能力。
但如果你可以修改InterSystems IRIS/Caché上的数据模型,也可以考虑使用DSTIME特性实现变更数据捕获。

DSTIME特性

DSTIME特性是InterSystems IRIS/Caché的嵌入式实时BI工具DeepSee用于跟踪数据变更的。
InterSystems IRIS和2011版之后的Caché,都支持DSTIME特性。它会自动记录数据库中SQL表记录或持久化对象的变更,并将变更记录写入持久化的多维数组^OBJ.DSTIME中。

0 0
0 92

FHIR 术语服务规范描述了一组对 CodeSystemValueSetConceptMap 资源的操作。 在这些操作中,以下四种操作似乎是最为广泛采用的:

CodeSystem ValueSet
$lookup
$validate-code
$expand
$validate-code

开发该规范的部分实现一直是探索 IRIS for Health 2020.1 中引入的全新 FHIR 框架的有效途径。 本实现包括上述四种操作,并支持与 CodeSystemValueSet 资源的读取搜索交互。

需要注意的是,本实现使用普通 ObjectScript 持久化类作为源术语表。

0 0
0 91
文章
Michael Lei · 五月 10, 2021 阅读大约需 10 分钟
通过深度学习解释和研究 Covid-19 X 射线分类器

关键字:深度学习,Grad-CAM,X 射线,Covid-19,HealthShare,IRIS

目的

在复活节周末,我谈到了一些针对 Covid-19 肺的深度学习分类器。  演示结果还算不错,似乎与当时有关该主题的一些学术研究刊物相吻合。 但它真的足够“好”吗? 

最近,我偶然收听了一个关于“机器学习中的可解释性”的在线午餐网络讲座,Don 在演讲的最后谈到了这个分类结果:

0 0
0 88
文章
jieliang liu · 三月 15, 2021 阅读大约需 1 分钟
JDBC 兼容性状态

JDBC 兼容性状态 **这是一篇  [InterSystems 常见问题解答网站](https://faq.intersystems.co.jp/)文章。   

 

版本 2009.1 及更高版本与 JDBC 4.0 API 兼容。 有关详细信息,请查阅以下文档。 [关于 JDBC 支持](First Look: JDBC and InterSystems Databases - InterSystems IRIS Data Platform 2020.3
)

0 0
0 87
文章
Michael Lei · 五月 12, 2021 阅读大约需 7 分钟
InterSystems 数据平台和性能 – 第 2篇

部分 在上个帖子中,我们安排了使用 pButtons 进行 24 小时的性能指标收集。 在本帖中,我们将研究几个收集到的关键指标,以及它们与底层系统硬件的关系。 我们还将开始探索 Caché(或任一 InterSystems 数据平台)指标与系统指标之间的关系。 以及如何使用这些指标来了解系统的每日节拍率并诊断性能问题。

0 0
0 87

在这个一小时的互动课程中,用户可以参与了涉及多个Docker容器的复合应用程序的开发。此外,学员们还学习如何创建数据转换和业务规则,使用业务流程设计器来建立病人护理的逻辑,并使用Spark和PMML将业务操作与机器学习模型连接起来。

赶快来参加我们的线上课程吧:

https://learning.intersystems.com/course/view.php?id=1662&ssoPass=1

 

0 2
0 86
文章
Nicky Zhu · 五月 20, 2021 阅读大约需 7 分钟
互操作消息统一管理系列:MessageBank

一. 企业信息库简介

企业信息库(MessageBank)是一个可选的远程归档设施,可以从多个来自不同实例的互操作性Production中收集信息、事件日志项目和搜索表项。如下图所示:
image

这套环境由两种角色的实例构成:
企业信息库服务器,它本身也是一个Production,完全由Message Bank服务组成,接收来自任何数量的客户Production提交的消息、日志等。

客户端Operation(Message Bank Operation),将其添加到一个正在运行的Production中,并用企业信息库服务器的地址进行配置。如连接通畅,消息和日志即可自动转发到Message Bank并在其中存储。

为了使你能方便地看到信息库中的信息,InterSystems IRIS®提供了以下附加选项。

对于企业信息库实例,管理门户自动包括企业监控器页面,在那里你可以监控客户端Production的状态,浏览消息库,并对被监控客户的消息进行检索。

对于每个客户端实例,你在消息库实例中配置一个到企业监控器的链接。

0 0
0 86

可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。

下面是这两个查询的具体作用:

A) %SYS.Journal.File类中的ByTimeReverseOrder查询
这个查询会获取journal日志文件名并按降序排列

1 0
1 86

各位领导、老师大家好。非常荣幸有机会参加这次由中国数字医学杂志社组织的陕西省医院数字化转型研讨会。

IT这个行业很有意思,就是大家都很喜欢造词。这几年有一个词特别火,叫做数智化底座,很多厂商都先后推出了自己的数智化底座解决方案。结合最近对整个行业的一些观察,今天借这个机会,跟各位领导和老师探讨一下,医疗行业的数字化有什么特点,到底什么样的底座或者平台比较符合我们医疗行业,以及我们在建设数智化底座的时候需要考虑哪些问题。结合我们最近的一些观察和思考,有不当之处,欢迎各位老师批评、指正。

首先一点就是我们做任何工作,首先要解决“为什么”的问题?第一个核心思路,我想数字化转型是为智慧医院服务的,归根结底,还是要通过数字化的手段,来实现医院的高质量发展。针对这一目标,国家卫健委制定了智慧医院发展的三大目标,就是智慧医疗、智慧管理和智慧服务,我想说白了,无非就是让医院、医护人员以及我们的患者过的更好,提高我们治疗和护理水平、降本增效,同时能够让我们的患者得到更好的服务。所有的数字化建设,不管是平台还是应用,都应该围绕这一核心目标。

2 0
0 83

image

这篇文章是对我的  iris-globals-graphDB 应用的介绍。
在这篇文章中,我将演示如何在Python Flask Web 框架和PYVIS交互式网络可视化库的帮助下,将图形数据保存和抽取到InterSystems Globals中。

建议

 

第一步 : 通过使用Python 原生SDK建立与IRIS Globals的链接

 #create and establish connection
  if not self.iris_connection:
         self.iris_connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS")
                                     
  # Create an iris object
  self.iris_native = irisnative.createIris(self.iris_connection)
  return self.iris_native

 

第二步 : 使用 iris_native.set( ) 功能把数据保存到Globals 里     

#import nodes data from csv file
isdefined = self.iris_native.isDefined("^g1nodes")
if isdefined == 0:
    with open("/opt/irisapp/misc/g1nodes.csv", newline='') as csvfile:

 reader = csv.DictReader(csvfile)
 for row in reader:
    self.iris_native.set(row["name"], "^g1nodes", row["id"])

 #import edges data from csv file
 isdefined = self.iris_native.isDefined("^g1edges")
 if isdefined == 0:
    with open("/opt/irisapp/misc/g1edges.csv", newline='') as csvfile:
 reader = csv.DictReader(csvfile)
 counter = 0                
 for row in reader:
    counter = counter + 1
    #Save data to globals
    self.iris_native.set(row["source"]+'-'+row["target"], "^g1edges", counter)  

 

第三步: 使用iris_native.get() 功能把节点和边缘数据从Globals传递给PYVIS

 #Get nodes data for basic graph    
  def get_g1nodes(self):
        iris = self.get_iris_native()
        leverl1_subscript_iter = iris.iterator("^g1nodes")
        result = []
        # Iterate over all nodes forwards
        for level1_subscript, level1_value in leverl1_subscript_iter:
            #Get data from globals
            val = iris.get("^g1nodes",level1_subscript)
            element = {"id": level1_subscript, "label": val, "shape":"circle"}
            result.append(element)            
        return result

    #Get edges data for basic graph  
    def get_g1edges(self):
        iris = self.get_iris_native()
        leverl1_subscript_iter = iris.iterator("^g1edges")
        result = []
        # Iterate over all nodes forwards
        for level1_subscript, level1_value in leverl1_subscript_iter:
            #Get data from globals
            val = iris.get("^g1edges",level1_subscript)
            element = {"from": int(val.rpartition('-')[0]), "to": int(val.rpartition('-')[2])}
            result.append(element)            
        return result

 

Step4: Use PYVIS Javascript to generate graph data

<script type="text/javascript">
    // initialize global variables.
    var edges;
    var nodes;
    var network;
    var container;
    var options, data;
  
    // This method is responsible for drawing the graph, returns the drawn network
    function drawGraph() {
        var container = document.getElementById('mynetwork');
        let node = JSON.parse('{{ nodes | tojson }}');
        let edge = JSON.parse('{{ edges | tojson }}');
     
        // parsing and collecting nodes and edges from the python
        nodes = new vis.DataSet(node);
        edges = new vis.DataSet(edge);

        // adding nodes and edges to the graph
        data = {nodes: nodes, edges: edges};

        var options = {
            "configure": {
                "enabled": true,
                "filter": [
                "physics","nodes"
            ]
            },
            "nodes": {
                "color": {
                  "border": "rgba(233,180,56,1)",
                  "background": "rgba(252,175,41,1)",
                  "highlight": {
                    "border": "rgba(38,137,233,1)",
                    "background": "rgba(40,138,255,1)"
                  },
                  "hover": {
                    "border": "rgba(42,127,233,1)",
                    "background": "rgba(42,126,255,1)"
                 }
                },

                "font": {
                  "color": "rgba(255,255,255,1)"
                }
              },
            "edges": {
                "color": {
                    "inherit": true
                },
                "smooth": {
                    "enabled": false,
                    "type": "continuous"
                }
            },
            "interaction": {
                "dragNodes": true,
                "hideEdgesOnDrag": false,
                "hideNodesOnDrag": false,
                "navigationButtons": true,
                "hover": true
            },

            "physics": {
                "barnesHut": {
                    "avoidOverlap": 0,
                    "centralGravity": 0.3,
                    "damping": 0.09,
                    "gravitationalConstant": -80000,
                    "springConstant": 0.001,
                    "springLength": 250
                },

                "enabled": true,
                "stabilization": {
                    "enabled": true,
                    "fit": true,
                    "iterations": 1000,
                    "onlyDynamicEdges": false,
                    "updateInterval": 50
                }
            }
        }
        // if this network requires displaying the configure window,
        // put it in its div
        options.configure["container"] = document.getElementById("config");
        network = new vis.Network(container, data, options);
        return network;
    }
    drawGraph();
</script>

 

第五步: 从app.py 主文件调用上面的代码

#Mian route. (index)
@app.route("/")
def index():
    #Establish connection and import data to globals
    irisglobal = IRISGLOBAL()
    irisglobal.import_g1_nodes_edges()
    irisglobal.import_g2_nodes_edges()

    #getting nodes data from globals
    nodes = irisglobal.get_g1nodes()
    #getting edges data from globals
    edges = irisglobal.get_g1edges()

    #To display graph with configuration
    pyvis = True
    return render_template('index.html', nodes = nodes,edges=edges,pyvis=pyvis)    

下面是关于此项目的 介绍视频:

0 0
0 82
文章
姚 鑫 · 三月 26, 2021 阅读大约需 6 分钟
第十三章 使用动态SQL(四)

第十三章 使用动态SQL(四)

返回完整结果集

使用%Execute()%ExecDirect()执行语句将返回一个实现%SQL.StatementResult接口的对象。该对象可以是单一值,结果集或从CALL语句返回的上下文对象。

%Display()方法

可以通过调用%SQL.StatementResult类的%Display()实例方法来显示整个结果集(结果对象的内容),如以下示例所示:

  DO rset.%Display()

请注意,%Display()方法不会返回%Status值。

显示查询结果集时,%Display()通过显示行数来结束:“受影响的5行”。 (这是%Display()遍历结果集之后的%ROWCOUNT值。)请注意,%Display()不会在此行计数语句之后发出行返回。

0 0
0 82
文章
姚 鑫 · 五月 20, 2021 阅读大约需 9 分钟
第一章 发送HTTP请求

第一章 发送HTTP请求

本主题介绍如何发送HTTP请求(如POSTGET)和处理响应。

HTTP请求简介

可以创建%Net.HttpRequest的实例来发送各种HTTP请求并接收响应。此对象相当于Web浏览器,可以使用它发出多个请求。它会自动发送正确的cookie,并根据需要设置Referer标头。

要创建HTTP请求,请使用以下常规流程:

0 0
0 80
文章
姚 鑫 · 三月 12, 2021 阅读大约需 5 分钟
第九章 SQL查询数据库(一)

第九章 SQL查询数据库

查询类型

查询是执行数据检索并生成结果集的语句。查询可以包含以下任意项:
- 一个简单的SELECT语句,用于访问指定表或视图中的数据。
- 具有JOIN语法的SELECT语句,用于访问多个表或视图中的数据。
- 合并多个SELECT语句的结果的UNION语句。
- 使用SELECT语句为封闭的SELECT查询提供单个数据项的子查询。
- 在嵌入式SQL中,这是一个使用SQL游标通过FETCH语句访问多行数据的SELECT语句。

使用SELECT语句

SELECT语句从一个或多个表或视图中选择一行或多行数据。下面的示例显示了一个简单的SELECT

0 0
0 80

本文档将向您介绍 InterSystems IRIS®数据平台如何通过使用应用服务器进行分布式缓存,利用企业缓存协议(Enterprise Cache Protocol,ECP)来扩展用户容量(User Volume)。
本指南介绍了如何使用分布式缓存架构进行扩展,并介绍了与部署 InterSystems IRIS 分布式缓存集群相关的一些初始任务。一旦您完成了本指南,您将对分布式缓存集群的工作原理和设置方法有一个基本的了解。
这些活动被设计成只使用默认的设置和功能,这样您就可以熟悉该功能的基本原理,而不必处理细节(尽管这些细节在执行实现时可能很重要)。有关使用 InterSystems IRIS 分布式缓存和 ECP 的完整文档,请参见本指南末尾 " For More Information (更多信息)" 部分中的参考资料列表。
要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。

0 0
0 79

挑战一:缺乏一个统一的技术体系?
InterSystems IRIS 医疗版通过统一的数据库、互操作性/中间件、机器学习和FHIR等医疗行业特有的功能来简化开发,开箱即用。

挑战二:需要高性能的解决方案,可以定制适合医疗行业使用的案例
InterSystems IRIS for Health医疗版由医疗行业开发人员创建并为医疗服务服务,具有所需的性能、可扩展性和灵活性,大量的全球、全国大型顶级医院案例。全美排名前20医院,全国客户数百家,百强医院30余家;

挑战三:开源和专有软件缺乏灵活性,无法为医疗行业应用提供高可靠性。
InterSystems IRIS医疗版实现一套平台兼容专有和开源模块,同时开发人员可以选择自己喜欢的开发语言和灵活性,支持多种开发语言(ObjectScript,.net, Java, Sql, 等等)

挑战四:缺乏具有医疗卫生领域专业知识的供应商,也没有为开发人员提供持续的支持。
InterSystems IRIS 医疗版的产品开发能力、屡获殊荣的支持和长期深耕医疗的企业文化,确保开发人员持续成功。

0 0
0 79

亲爱的社区开发者们,大家好!

欢迎积极参与新一轮InterSystems开发者竞赛!

🏆 InterSystems 编程大赛:FHIR 加速器 🏆

提交在AWS上使用InterSystems的IRIS FHIR-as-a-service的应用程序,或帮助使用InterSystems IRIS FHIR加速器开发的解决方案。点击这篇文章,了解如何在AWS上申请应用InterSystems IRIS FHIR 加速器服务 (FHIRaaS) 。

    时间:2021年5月10日-6月6日

    奖金总额: $8,750 

    👉  点击登录活动页面 👈


    0 0
    0 78
    文章
    姚 鑫 · 三月 27, 2021 阅读大约需 11 分钟
    第十三章 使用动态SQL(五)

    第十三章 使用动态SQL(五)

    从结果集中返回特定的值

    要从查询结果集中返回特定的值,必须一次一行遍历结果集。
    要遍历结果集,请使用%Next()实例方法。
    (对于单一值,结果对象中没有行,因此%Next()返回0,而不是错误。)
    然后,可以使用%Print()方法显示整个当前行的结果,或者检索当前行的指定列的值。

    %Next()方法获取查询结果中下一行的数据,并将该数据放入结果集对象的data属性中。
    %Next()返回1,表示它位于查询结果中的某一行上。
    %Next()返回0,表示它位于最后一行(结果集的末尾)之后。
    每次调用%Next()返回1个增量%ROWCOUNT;
    如果游标定位在最后一行之后(%Next()返回0),%ROWCOUNT表示结果集中的行数。

    0 1
    0 76

    InterSystems IRIS、IRIS for Health和HealthShare Health Connect的2021.1版本的预览版现已发布。

    由于这是一个预览版,我们希望在下个月的通用版本发布之前了解您对这个新版本的体验。请通过开发者社区分享您的反馈,以便我们能够共同打造一个更好的产品。

    InterSystems IRIS数据平台2021.1是一个扩展维护(EM)版本。自2020.1(上一个EM版本)以来,在持续交付(CD)版本中增加了许多重要的新功能和改进。请参考2020.2、2020.3和2020.4的发布说明,了解这些内容的概况。

    这个版本的增强功能为开发人员提供了更大的自由度,可以用他们选择的语言构建快速和强大的应用程序,并使用户能够通过新的和更快的分析功能更有效地处理大量的信息。

    0 0
    0 75
    文章
    Michael Lei · 五月 24, 2021 阅读大约需 1 分钟
    大数据平台的五个等级

    作为一个软件架构师,如果要设计一个企业级的架构来满足当前的业务需求时,你需要达到5级的水平,这是一个巨大的挑战。有了InterSystems IRIS。
    这是有可能的。通过1个产品,你可以得到SQL + NoSQL + ESB + BI + Open Analytics + Real Time Virtual cubes + NLP + AutoML + ML(使用Python)和高级云支持 + Sharding支持。

    0 0
    0 74

         在软件开发和业务集成中,规则无处不在:会员折扣的计算规则、根据消息类型和内容将其路由到不同目标系统的路由规则。还有一个规则发挥重要作用的地方-  辅助决策规则,例如临床知识库和医疗质量指标规则。

    规则经常需要随业务调整和知识积累进行调整,而规则的调整是业务和行业专家定的。如果规则是以代码硬编码的,这些调整需要程序员改动,一来不直观、需要业务专家与程序员大量的沟通成本,二来硬编码改动会对应用伤筋动骨,甚至带来风险,三来没法控制新规则生效的时间 – 总不能让程序员在新规则生效的那一刻去编译和部署吧。

    1 0
    0 74
    文章
    姚 鑫 · 三月 1, 2021 阅读大约需 7 分钟
    第二章 InterSystems SQL基础

    第二章 InterSystems SQL基础

    本章概述了InterSystems SQL的特性,特别是那些SQL标准未涵盖的特性,或者与InterSystems IRIS®数据平台统一数据架构相关的特性。
    本教程假定读者具备SQL知识,并不是为介绍SQL概念或语法而设计的。

    本章讨论以下主题:
    - 表
    - 查询
    - 权限
    - 数据显示选项
    - 数据排序类型
    - 执行SQL

    在InterSystems SQL中,数据显示在表中。每个表都包含许多列。一个表可以包含零个或多个数据值行。以下术语大体上等效:

    1 2
    0 73
    文章
    姚 鑫 · 四月 13, 2021 阅读大约需 14 分钟
    第二章 定义和构建索引(一)

    第二章 定义和构建索引(一)

    概述

    索引是由持久类维护的结构,InterSystems IRIS®数据平台可以使用它来优化查询和其他操作。

    可以在表中的字段值或类中的相应属性上定义索引。(还可以在多个字段/属性的组合值上定义索引。)。无论是使用SQL字段和表语法还是类属性语法定义相同的索引,都会创建相同的索引。当定义了某些类型的字段(属性)时,InterSystems IRIS会自动定义索引。可以在存储数据或可以可靠派生数据的任何字段上定义附加索引。InterSystems IRIS提供了几种类型的索引。可以为同一字段(属性)定义多个索引,为不同的目的提供不同类型的索引。

    无论是使用SQL字段和表语法,还是使用类属性语法,只要对数据库执行数据插入、更新或删除操作,InterSystems IRIS就会填充和维护索引(默认情况下)。可以覆盖此默认值(通过使用%NOINDEX关键字)来快速更改数据,然后作为单独的操作生成或重新生成相应的索引。可以在用数据填充表之前定义索引。还可以为已经填充了数据的表定义索引,然后作为单独的操作填充(构建)索引。

    0 0
    0 73

    我本人和其他技术架构师经常需要向客户和供应商说明 Caché IO 要求以及 Caché 应用程序使用存储系统的方式。 在向客户和供应商说明典型的 Caché IO 配置文件和事务性数据库应用程序的要求时,下面的表格很有用。  原始表格由 Mark Bolinsky 创建。

    在以后的帖子中,我将讨论更多关于存储 IO 的内容,所以现在贴上这些表格也作为将来文章的参考。 


    本系列其他帖子的列表
     


    拥有设置良好的存储(如存储阵列)以提供可预测的磁盘 IO 性能,支持高可用性功能并为应用程序提供存储冗余、可伸缩性和可靠性,这几点至关重要。

    Caché 存储 IO 配置文件

    根据所选的存储阵列技术,物理层的磁盘存储可分为池或磁盘组。 如果可能,出于可用性和性能考虑,应根据预期的 IO 配置文件对存储进行分区。 例如,数据和日志(事务日志)应该在不同的物理磁盘组上,因为它们有不同的 IO 配置文件,这也是出于可用性考虑,因为数据磁盘组中的损坏可以通过与损坏隔离的单独磁盘组中的日志来恢复。

    0 0
    0 72