大家好,
我们非常高兴地与大家分享,我们刚刚推出了一个新的免费互动教程,专门为那些刚刚接触 InterSystems IRIS 并希望了解其核心概念的人设计。
🧑🏫InterSystems IRIS 的数据模型🧑💻

大家好,
我们非常高兴地与大家分享,我们刚刚推出了一个新的免费互动教程,专门为那些刚刚接触 InterSystems IRIS 并希望了解其核心概念的人设计。
🧑🏫InterSystems IRIS 的数据模型🧑💻

在应用程序开发时,我们使用的大多数开发语言都是面向对象编程 object-oriented programming (OOP)语言,例如大家熟悉的Java、.NET。而TIOBE的2023年2月的最新开发语言流行排行榜上,前5大语言都是面向对象编程语言,连排名第六的Visual Basic都有了越来越多的OO特性:

为什么使用面向对象编程这么流行?因为它有诸多优势:
而这4个优势正是面向对象编程的核心特征。
虽然面向对象编程是绝对的主流,但数据通常被保存到关系型数据库中。关系型数据库的行和列二维关系与复杂的对象并不匹配:
这个项目是在我考虑如何通过Embedded Python让Python代码自然地处理IRIS globals所提供的可扩展的存储和高效的检索机制时想到的。
我最初的想法是使用globals创建一种Python字典的实现,但很快我就意识到,我应该首先处理对象的抽象问题。
所以,我开始创建一些可以包装Python对象的Python类,在globals中存储和检索它们的数据,也就是说,在IRIS globals中序列化和反序列化Python对象。
像 ObjectScript 的%DispatchGetProperty(), %DispatchSetProperty() 和%DispatchMethod()一样, Python 有委托对象的属性和方法调用的方式。
当你设置或获取一个对象属性时,Python 解释器让你通过方式 __setattr__(self, name, value) 和 __getattr(self, name)__来截获这个操作。
请看这个相当基本的例子。
>>> class Test:
. def __init(self, prop1):
. self.prop1 = prop1
.在我们开始谈论数据库和现有的不同数据模型之前,我们最好先谈谈什么是数据库以及如何使用它。
一个数据库是以电子方式存储和访问的有组织的数据集合。 它用于存储和检索通常与主题或活动相关的结构化、半结构化或原始数据。
每个数据库的核心至少存在一个用于描述其数据的模型。 并且根据它所基于的模型,一个数据库可能具有略微不同的特征并存储不同数据类型。
要写入、检索、修改、排序、转换或打印数据库中的信息,需要使用称为数据库管理系统 (DBMS) 的软件。
数据库及其各自的数据库管理系统的大小、容量和性能增加了几个数量级。 各个领域的技术进步使之成为可能,例如处理器、计算机内存、计算机存储和计算机网络。 一般来说,数据库技术的发展根据数据模型或结构分为四代:导航型、关系型、对象型和后关系型。


与以特定数据模型为特征的前三代不同,第四代包括许多基于不同模型的不同数据库。 它们包括列、图、文档、组件、多维、键值、内存等。所有这些数据库都由一个单一的名称 NoSQL 联合起来(没有 SQL,或者现在更准确地说不仅仅是 SQL)。
而且,现在出现了一个新的类,叫做NewSQL。 这些是现代关系数据库,旨在为在线事务处理工作负载(读写)提供与 NoSQL 系统相同的可扩展性能,同时使用 SQL 和维护 ACID。
顺便说一下,在这些第四代数据库中,有那些支持上述提及的多种数据模型的数据库。 它们被称为多模型数据库。
开始 - 请拉到页面底部查看该系列文章第一部分 .
3. 使用globals时结构的变体
一个结构,比如说一个有序排列的“树”,有各种特殊的情况。让我们来看看那些对使用globals有实际价值的情况。
各位领导、老师大家好。非常荣幸有机会参加这次由中国数字医学杂志社组织的陕西省医院数字化转型研讨会。
IT这个行业很有意思,就是大家都很喜欢造词。这几年有一个词特别火,叫做数智化底座,很多厂商都先后推出了自己的数智化底座解决方案。结合最近对整个行业的一些观察,今天借这个机会,跟各位领导和老师探讨一下,医疗行业的数字化有什么特点,到底什么样的底座或者平台比较符合我们医疗行业,以及我们在建设数智化底座的时候需要考虑哪些问题。结合我们最近的一些观察和思考,有不当之处,欢迎各位老师批评、指正。
首先一点就是我们做任何工作,首先要解决“为什么”的问题?第一个核心思路,我想数字化转型是为智慧医院服务的,归根结底,还是要通过数字化的手段,来实现医院的高质量发展。针对这一目标,国家卫健委制定了智慧医院发展的三大目标,就是智慧医疗、智慧管理和智慧服务,我想说白了,无非就是让医院、医护人员以及我们的患者过的更好,提高我们治疗和护理水平、降本增效,同时能够让我们的患者得到更好的服务。所有的数字化建设,不管是平台还是应用,都应该围绕这一核心目标。
.png)
第二个核心思路,我们认为软件要为人服务所谓的数字化转型,就是用软件来开展一切可以开展的业务,而软件是为人服务的,目的是提高我们的工作效率、认知水平和实现我们仅仅靠人力做不了的事情。
各位开发者们好,
InterSystems IRIS 数据平台的最大特点之一是它允许您创建自己的自定义,您可以使用InterSystems IRIS 中支持的所有其他模型,例如对象和关系结构,而无需创建任何自定义结构。
⏯ InterSystems Globals与灵活的数据建模 Globals

这篇文章是对我的 iris-globals-graphDB 应用的介绍。
在这篇文章中,我将演示如何在Python Flask Web 框架和PYVIS交互式网络可视化库的帮助下,将图形数据保存和抽取到InterSystems 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
#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)
#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
<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>
#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)
下面是关于此项目的 介绍视频:
开发者们大家好!
你可能已经注意到了在IRIS 2021 Global的名字是随机的。
如果你用DDL来创建类而且想给Global一个确定的名字,实际上是可以做的。
在CREATE Table 里使用 WITH %CLASSPARAMETER DEFAULTGLOBAL='^GLobalName' ,如文档。参考以下例子:
关于 "智慧医院 "的真正内涵,有很多误解在流传。术语 "智慧Smart "已经成为 "自动化 "或 "数字设备 "的同义词。然而,事实是,增加技术、设备和传感器并不一定能使建筑或者医院变得'智慧'。而且,在某些情况下,数字创新被强加于医院,而没有真正考虑到其效果。
这种情况导致了一系列的复杂性和矛盾。例如,一方面,人们对医院采用数字技术的期望越来越高,但另一方面,人们越来越担心数字医疗解决方案正在创造更多离散的、孤岛的生态系统。同样,尽管医院面临着实现实时医疗系统的更大压力,但往往受制于其运营模式的孤岛性质或围绕各种医疗信息系统的互操作性问题。
这些相互冲突的压力表明,需要一种更协同、更集成、更综合、更全面的数字化转型方法--一种将系统整合在一起并从各个角度考虑影响的方法。
智慧医院数字孪生的出现,证明了这一技术为解决这些日益严峻的挑战提供了可行的手段。
在过去的几年里,数字孪生已经有了很大的发展,成为一项值得期待的技术。然而,尽管数字孪生被炒得沸沸扬扬,但对于数字孪生是什么(不是什么)以及它是否能实现其承诺,仍然存在相当大的困惑。像许多新技术一样,数字孪生正在 "幻觉破灭 "中挣扎并且在某些情况下被错误地描述。
在本文中,我们将通过回答这六个关键问题来正面解决这种困惑。
概述:
随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。
应用链接:HealthInfoQueryLayer
关键应用:IRIS for Health、REST API、ObjectScript、Globals 、SQL、DATA LOOKUP TABLES
应用程序采用模型及应用介绍:
1.采用模型
1.1. Globals (key-value)
Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals。
工具:
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING
应用:
应用程序根据Globals的键值对、访问速度快的特性。
IRIS 中支持的四种方式:
SQL、Objects、REST 和 GraphQL
卡济米尔·马列维奇,《运动员》(1932)
>
> “你当然无法理解! 习惯了坐马车旅行的人怎么可能理解乘坐火车或者飞机旅行的人的感受和印象?”
>
> >
> 卡济米尔·马列维奇 (1916)
>
## 引言
我们已经讨论过为什么在主题领域建模使用对象类型优于使用 SQL。 当时得出的结论和总结的事实如今依然适用。 那么,我们为什么要退后到对象和类型之前的时代,讨论将对象的操作拖回到使用global的技术? 我们又为什么要鼓励面条式代码?难道是为了用它难以跟踪的错误考验开发者的技能熟练度?
目前有几种观点支持通过基于 SQL/REST/GraphQL 的 API 传输数据,而不是将其表示为类型/对象:
在讨论实现 API 之前,我们先来看一下底层的抽象层。 下图显示了数据在永久存储位置与处理并向应用程序用户呈现的位置之间的移动方式。