一种基于openEHR模板的数据接口动态生成方法与流程

文档序号:11654667阅读:344来源:国知局
本发明涉及计算机软件数据接口生成
技术领域
:,具体涉及一种基于openehr模板的数据接口动态生成方法。
背景技术
::当今世界每天增速最快的毫无疑问是数据,各级各类医院亦是,每天的医疗活动所产生的数据量增速遥遥领先。人们希望这些数据发挥其价值,更好地为医疗卫生行业的管理、诊疗、科研和教学服务,从而提高医院业务效率,节省医疗资源,减少医疗成本,帮助临床学术研究,通过现有的医疗数据来解决更多医学难题。医院建立医疗数据存储中心,对医疗活动所产生的数据进行收集整合,医院在数据存储中心上建立各种应用系统,通过数据接口来访问这些数据,对这些数据加以利用,从而辅助医护人员的工作,帮助医护人员进行课题研究,方便实现医院的管理工作。但是随着医疗活动的进行,医院应用数据需求在不断的变化,具体体现在两个方面,一方面是数据资源种类的增加,这就需要医院数据中心增加这些数据资源的存储,并为应用提供这些数据访问服务,另一方面是在现有的数据资源种类中访问应用所需要所感兴趣的数据,每个应用的数据需求都不尽相同,这就需要医院数据存储中心所提供的数据接口能够灵活适应医院应用系统不断变化的数据需求。面对不断变化的应用数据需求,医院数据存储中心应对这些需求变化的常用方法是按需定制开发接口,而定制数据接口的过程主要涉及人员有应用系统开发人员、医院信息管理人员以及第三方临床数据中心维护人员,具体的开发过程为应用系统开发人员根据自身需求制定数据需求文档,提交给医院信息管理人员进行数据访问权限的审核;审核通过后,医院信息管理人员组织应用系统开发人员与第三方临床数据中心维护人员进行协商,讨论确定数据接口规范;双方根据数据接口规范分别进行开发,开发完成后,双方进行数据访问的系统联调;联调通过后应用系统开发人员才能最终完成对数据的访问。整个过程中由于理解差异,往往在联调或使用时发现数据接口不符合需求,需要临床数据中心的接口进行重新开发,导致接口开发流程耗时非常大。openehr规范是由openehr组织制定的描述电子健康数据管理、存储、获取和交换的电子健康档案标准规范,其核心是运用两层建模方法将医疗领域知识从具体的临床信息中分离出来,主要包括参考模型(rm),和原型模型(am),原型模型由原型(archetype)和模板(template)组成。参考模型定义了一组表达医学知识和概念的通用基础数据类型和数据结构,原型通过对参考模型添加约束来描述每个具体的医学知识和概念,模板根据实际应用需求对原型进一步添加约束来描述具体的数据需求。openehr规范主要解决医学知识和数据需求不断变化导致的信息系统维护和更新的问题。通过分层方法,信息系统基于稳定不变的参考模型建立,医学知识和数据需求通过原型和模板表达。当医学知识和数据需求发生变化的时候,通过修改和制定新的原型和模板来表达变化的部分,信息系统通过解析原型和模板实现功能的变化,而不用进行修改。目前,针对openehr规范应用的研究有很多,例如,openehr官方机构公布了一种领域查询语言aql(archetypequerylanguage)是专门用于查询和检索基于原型的ehr中临床数据的声明性查询语言,aql语法与sql语法类似,基于原型属性路径进行查询,返回openehr结构化数据,与具体的存储结构无关,只需要理解openehr原型所代表的领域知识即可。每当领域知识发生改变时,针对新的原型和原有原型一样只需要按照aql语法来进行查询即可获得相应的数据,不需要重新开发基于openehr的存储结构的数据访问接口。生物医学工程学报2014年04期上发表了一篇论文《基于openehr的原型关系映射方法》提出了将openehr原型映射为关系数据库表,并将原型属性映射为关系数据库字段的方法,同时对aql进行扩展,能够对基于openehr原型生成的关系数据库进行增删改查等数据访问操作,但是由于原型是对临床知识的最完整的定义,而模板是根据临床需要对原型的进一步约束,更符合临床的需要,因此在原型关系映射方法的基础上,将模板映射为关系数据库表,模板的属性映射为关系数据库字段,并且对aql再一次扩展,提出对模板的查询语言作为数据访问接口,但是领域查询语言专业要求太高,且返回数据格式为模板,临床应用需要对模板解析才能获得医疗数据,而且当数据量过大时,传输速度慢,不易使用,无法满足实际的临床应用需求。技术实现要素:本发明提供了一种基于openehr模板的数据接口动态生成方法,解决了现有数据接口因灵活性低而造成人力时间浪费以及openehr模板查询语言无法满足实际临床应用需求的问题。一种基于openehr模板的数据接口动态生成方法,包括:步骤1,解析openehr模板,并建立模板对象;步骤2,依据模板对象获取每个模板属性对应的关系型临床数据库结构,并创建数据接口对象;步骤3,解析客户端调用数据接口所发起http请求,并建立httprequest对象;步骤4,根据步骤2的数据接口对象和步骤3的httprequest对象,生成数据库操作sql语句;步骤5,针对基于openehr模板生成的关系型临床数据库,执行步骤4生成的sql语句,得到数据操作结果;步骤6,根据步骤5的数据操作结果构建httpresponse对象返回给调用方。作为优选,步骤2创建数据接口对象包括:自动创建数据接口对象和根据临床特定数据需求自定义数据接口对象两种方式,其中自动创建数据接口对象具体包括:每个openehr模板对应至少一张关系数据库表,以每张关系数据库表为资源自动创建数据接口对象,每个数据接口对象包括资源描述和请求方法信息:每个数据接口对象的资源描述为:模板/版本/数据库表名;每个请求方法包括:输入参数、输出参数、表达筛选条件的过滤器、以及表达关系型临床数据库中关系数据库表之间关系的逻辑关系。作为优选,自动创建数据接口对象的请求方法包括get、put、delete以及post,其中:get方法的输入参数为关系数据库表的主键字段,输出参数为关系数据库表的所有字段,过滤器为关系数据库表的主键值等于,处理逻辑为单张关系数据库表结构;put方法的输入参数为关系数据库表的所有字段,输出参数为执行结果,过滤器为关系数据库表的主键值等于,处理逻辑为单张数据库表结构;delete方法的输入参数为关系数据库表的主键字段,输出参数为执行结果,过滤器为关系数据库表的主键值等于,处理逻辑为单张数据库表结构;post方法的输入参数为关系数据库表的所有字段,过滤器为空,处理逻辑为单张数据库表结构。作为优选,自动创建数据接口对象方法中,若关系数据库表具有外键字段,则新建一个数据接口对象,该数据接口对象的资源描述为:模板/版本/数据库表名/referenceid,该数据接口对象的请求方法为get,该get方法的输入参数为关系数据库表的外键字段,输出参数为关系数据库表的所有字段,过滤器为关系数据库表的外键值等于,处理逻辑为单张数据库表结构。作为优选,根据临床特定数据需求自定义数据接口对象,具体包括:步骤2-1、定义数据接口对象的资源描述为:模板/版本/自定义名称;步骤2-2、指定请求方法,所述请求方法为get、put、delete的任意组合,基于模板属性,定义各请求方法的输入参数和输出参数;步骤2-3、在输入参数的基础上定义赋值对应的请求方法的过滤器属性;步骤2-4、依据所选的模板属性对应的关系型临床数据库结构创建数据接口对象的逻辑关系:若模板属性对应的数据库字段在同一张关系数据库表中,则逻辑关系设置为单表;若模板属性对应的数据库字段不在同一张关系数据库表中,针对涉及的所有关系数据库表,每两张关系数据库表对应一个逻辑关系;步骤2-5、将数据库字段名称按照驼峰命名法构建数据接口对象各参数的参数名。作为优选,步骤4生成数据库操作sql语句,具体包括:步骤4-1、解析httprequest对象,获取请求地址uri,根据uri与数据接口对象的资源描述匹配获取所要执行的数据接口对象;步骤4-2、根据httprequest对象的请求方式定位数据接口对象的请求方法,解析该请求方法的输入参数、输出参数、过滤器以及逻辑关系;步骤4-3、根据httprequest的输入参数值和数据接口对象的请求方法属性值生成数据库操作sql语句。作为优选,数据接口对象的请求方法为get时,生成数据库操作sql语句为select语句,具体生成方法如下:首先,依据数据接口对象的逻辑关系判断要操作的关系数据库表结构:若逻辑关系为1个,判断是否只有单表操作,若是,则为单表查询;若不是单表操作,则为多表级联查询;若逻辑关系为2个以上,则为多表查询,多表查询包括多表级联查询和多表非级联查询;其次,采用如下方法拼接sql语句:针对单表查询:a1、获取数据接口对象的请求方法的输出参数,构建目标表达式为:columnnameasparaname;a2、若orderby属性值不是null,取orderby属性值拼接sql语句中的排序要求,表达式为:columnnamedesc/asc;a3、from子句为该数据库表名;a4、获取数据接口对象的请求方法的逻辑关系、输入参数和过滤器,构建where子句的条件表达式为:relationcolumnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值;针对多表级联查询:b1、获取数据接口对象的请求方法的输出参数,构建目标表达式为:tablename.columnnameasparaname;b2、若orderby属性值不是null,取orderby属性值拼接sql语句中的排序要求,表达式为:tablename.columnnamedesc/asc;b3、将关系数据库表表名按照级联关系进行排序,按照关系数据库表表名序列使用左连接构建from子句;b4、获取数据接口对象的请求方法的逻辑关系、输入参数和过滤器,构建where子句的条件表达式为:relationtablename.columnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值;针对多表非级联查询:按照各表的级联关系拆分为多条多表级联查询,或多个单表,或单表和多表级联查询的组合。作为优选,数据接口对象的请求方法为put时,生成数据库操作sql语句为update语句,具体生成方法如下:首先,依据数据接口对象的逻辑关系判断要操作的关系数据库表结构:若逻辑关系为1个,判断是否只有单表操作,若是,则为单表更新,否则为多表更新;若逻辑关系为2个以上,则为多表更新;其次,采用如下方法拼接sql语句:针对单表更新:a-1、根据输入参数的columnname和paraname确定set子句,set子句的列名为columnname的属性值,set子句的表达式为从httprequest对象中获取到的相应paraname值;a-2、根据数据接口对象的请求方法的逻辑关系、输入参数和过滤器,构建where子句的条件表达式为:relationcolumnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值;针对多表更新:b-1、将关系数据库表表名按照级联关系进行排序,按照关系数据库表表名序列使用左连接构建from子句;b-2、每条update语句每次更新一张关系数据库表表的内容,update语句的列名由输入参数的tablename和columnname属性值确定,表达式为相应的paraname值;b-3、获取数据接口对象的请求方法的逻辑关系、输入参数和过滤器,构建where子句的条件表达式为:relationtablename.columnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值。作为优选,数据接口对象的请求方法为delete时,生成数据库操作sql语句为delete语句,具体生成方法如下:首先,依据数据接口对象的逻辑关系判断要操作的关系数据库表结构:若逻辑关系为1个,判断是否只有单表操作,若是,则为单表删除,否则为多表删除;若逻辑关系为2个以上,则为多表删除;其次,采用如下方法拼接sql语句:针对单表删除:获取数据接口对象的请求方法的逻辑关系、输入参数和过滤器,构建where子句的条件表达式为:relationcolumnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值;针对多表删除:a1、将多张关系数据表使用左连接构建from子句;a2、针对每张关系数据库表,根据from子句和where子句创建相应的临时表;所述where子句根据请求方法的输入参数和过滤器创建,where子句的条件表达式为:relationcolumnnameoperationvalue/paraname;式中,用relation属性值连接条件表达式;columnname值为过滤器参数名称对应的数据库字段列名;operation值对应相应的操作符,如果value属性值不是null,直接获取value属性值;如果value属性值为null,则从httprequest对象中获得value属性值;a3、为每张关系数据库表创建删除语句,除了要删除的关系数据表,其余关系数据库表的删除语句中的from子句和where子句中的表名替换为临时表表名,每条删除语句执行完成后,删除临时表。作为优选,数据接口对象的请求方法为post时,生成数据库操作sql语句为insert语句,具体生成方法如下:获取数据接口对象的请求方法的逻辑关系和输入参数,依据逻辑关系中的数据库表名和输入参数代表的字段名称构建into部分,根据输入参数字段对应的参数名称在http的请求消息中获取参数值构建values部分字段值。与现有技术相比,本发明的有益技术效果为:(1)通过openehr模板创建数据接口对象,根据数据接口对象来动态生成数据接口,当有新的数据接口需求时,不再需要第三方临床数据中心维护人员进行代码实现,只需要制定符合自己需求的数据接口对象即可,可以节省大量人力时间;(2)当医学知识变化时,导致新的模板产生,本方法可以针对新模板自动生成相应的数据接口对象,实现系统动态适应知识变化。附图说明图1为本发明数据接口对象的结构示意图;图2为关系数据表的逻辑关系示意图;图3为请求方法为get时生成select语句的流程示意图;图4为请求方法为put时生成update语句的流程示意图;图5为请求方法为delete时生成delete语句的流程示意图;图6为本发明中openehr模板到数据接口对象转换方法的流程图;图7为本发明解析openehr模板并建立模板对象的流程示意图;图8为本发明数据接口对象自动创建的详细流程图;图9为用户根据需求自定义数据接口对象创建的详细流程图;图10为本发明中数据接口对象动态生成数据接口的流程图;图11为本发明基于openehr模板的数据接口动态生成方法的流程图。具体实施方式下面结合附图,对本发明基于openehr模板的数据接口动态生成方法做详细描述。一种基于openehr模板的数据接口动态生成方法,所述数据接口是符合rest风格的restfulwebapi,主要用于对基于openehr模板生成的关系型临床数据库进行数据访问,其中openehr模板包括:openehr原型文件、openehr模板文件、以及模板与所生成关系型数据库的对应关系,数据接口具体包括查询、更新、添加以及删除操作,如图11所示,所述动态生成方法包括以下步骤:(1)解析openehr模板(template)并建立模板对象;(2)根据步骤(1)所述的模板对象,获取每个模板属性对应的关系数据库结构(包括数据表及对应字段),然后创建数据接口对象;(3)解析客户端调用数据接口而发起http请求,并建立httprequest对象;(4)根据步骤(2)的数据接口对象和步骤(3)的httprequest对象生成数据库操作sql语句;(5)针对基于openehr模板生成的关系型临床数据库执行步骤(4)所生成的sql语句得到相应的数据操作结果;(6)根据步骤(5)的数据操作结果构建httpresponse对象返回给调用方。本发明基于openehr模板的数据接口动态生成方法中,每个数据接口对象基于单个模板对象创建,一个openehr模板可以对应多张关系数据库表,因此基于单个模板可以有多个数据接口对象,表达了临床应用对临床数据存储中心的数据需求,每当数据需求发生变化,只需要根据openehr模板创建符合该数据需求的数据接口对象即可,且restfulwebapi能够适用于多种平台,是轻量级架构,易于使用。所述步骤(1)解析openehr模板并建立模板对象包括:解析模板名;解析模板所约束的openehr原型,包括基本类型属性的属性名、属性路径;解析模板集合类型属性的属性名、路径以及该集合下的所有属性;解析archetypeslot类型属性的属性名、路径、目标原型以及该属性下的所有属性。所述步骤(2)创建数据接口对象包括:每个数据接口对象主要包括资源描述信息、请求方法信息,其中每个请求方法信息中包含输入参数、输出参数、过滤器以及逻辑关系等属性,其中过滤器指的是筛选条件,逻辑关系指的是数据库中表与表之间的关系。具体结构如图1所示,每个资源描述信息可以唯一确定一个数据接口对象,每个模板属性获得的关系型数据库结构信息主要包括该属性对应的数据库字段名,以及该字段的数据类型、是否为主键、是否为外键、是否允许为空、数据库表名;如果该模板对应多张数据库表结构,可以获得该模板对应的表与表之间的关系。获取一个openehr模板对应的关系数据库结构,一个模板可能对应多张关系数据库表,以每张关系数据库表为资源来创建标准数据接口对象,每个数据接口对象的资源描述为“模板/版本/数据表名”,请求方法为get、put、delete以及post,其中:get方法的输入参数是该表的主键字段,输出参数是该表的所有字段,过滤器是该表的主键值等于,处理逻辑是单张数据库表结构;put方法的输入参数为所有字段,过滤器为主键值等于,输出参数为执行结果,处理逻辑是单张数据库表结构;delete方法的输入参数为主键字段,过滤器为主键值等于,输出参数为执行结果,处理逻辑是单张数据库表结构;post方法的输入参数为所有字段,过滤器为空,处理逻辑是单张数据库表结构;如果该数据库表有外键字段,新建一个数据接口对象,其资源描述为“模板/版本/数据表名/referenceid”,请求方法为get,该请求方法的输入参数是该表的外键字段,输出参数是该表的所有字段,过滤器是该表的外键值等于,处理逻辑是单张数据库表结构。每个参数的参数名是将数据库字段名称按照驼峰命名法进行构建。当临床应用有其特定数据需求时,基于单个openehr模板对象来创建符合自己需求的数据接口对象:(1)该数据接口对象的资源描述为“模板/版本/自定义名称”,用户根据自己需要为资源描述添加自定义的名称;(2)请求方法由用户指定,可以是get、put、delete方法的任意组合,基于模板属性,为每个请求方法定义输入参数、输出参数;(3)每个请求方法的过滤器属性在其输入参数的基础上进行定义赋值,用户可以制定多个过滤器,创建该数据接口对象的过滤器属性,根据自己需要设置过滤器的关系(relation)为“and”或者“or”,具体的操作设置为“=”、“>”、“<”、“<=”、“>=”、“in”、“like”、“!=”中的任一操作符;(4)根据用户选择的模板属性所对应的关系数据库结构来创建该数据接口的逻辑关系,如果所选择的模板属性对应的数据库字段在同一张数据库表结构中,逻辑关系设置为单表;如果所选择的模板属性对应的数据库字段不在同一张数据库表结构中,对于所涉及的所有数据库表名,每两张表之间的关系对应一个逻辑关系,具体为两张表的主外键关系以及两张表是不是为一对多的关系。(5)该数据接口对象的每个参数的参数名是将数据库字段名称按照驼峰命名法进行构建。如果指定输入参数是区间参数,则参数名会在数据字段名的基础上添加“lowerlimit“或者”upperlimit“;(6)如果请求方法为get方法,用户可以指定按照某个输出参数将输出结果升序或者降序进行排序。所述步骤(3)解析http请求包括:读取用户发出的数据接口请求,包括请求的uri、请求方法以及请求参数等数据,构建一个httprequest对象。所述步骤(4)生成数据库操作sql语句包括:解析httprequest对象,获取请求地址uri,根据uri与数据接口对象的资源描述匹配获取所要执行的数据接口对象,根据httprequest对象的请求方式来定位数据接口对象的请求方法,解析该请求方法的输入参数、输出参数、过滤器以及逻辑关系等,根据httprequest的输入参数值和数据接口对象该请求方式属性值生成数据库操作表sql语句,所述数据库表操作sql语句为select、insert、update或delete语句。其中请求方法为get对应select语句,具体生成方法如图3所示:获得数据接口对象,按照逻辑关系情况来判断要操作的表关系结构,可分为单表查询和多表查询,其中多表查询又分为多表级联查询和多表非级联查询。首先根据数据接口对象中逻辑关系个数进行判断,如果关系个数为1个,判断是否为单表,如果是单表,则为单表查询。如果不是单表,则两张表的关系为图2中所示的连接1,即a表与b表有主外键关系,将两张表用leftjoin连接为一个关系,构建from子句。而逻辑关系个数为多个的时候需要对逻辑关系进行判断,如果是图2中连接2,a表与b表存在着主外键关系,b表与c表存在着主外键关系,若a表与c表也存在着主外键关系,但是对于a表、b表、c表的连接没有实际意义,因此在进行连接时将该逻辑关系进行删除。图2中的连接1和连接2属于多表级联查询。如果逻辑关系如图2中的连接3,表示a表与b表、a表与c表是主外键关系,且是一对多的,但是b表与c表没有关系,此时a表与b表的逻辑关系和a表与c表的逻辑关系是并列的,a表、b表、c表不能构成一个关系,因此将a表与c表的逻辑关系重新构建一个sql语句,图2中的连接3和连接4属于多表非级联查询。具体的sql语句拼接算法分别如下:(1)单表查询:查询目标是单张表,即数接口信息get请求方式的“issingle”属性为true。获取该数据接口get方法的输出参数,根据“columnname”与“paraname”构成目标列表达式,目标表达式的形式为如表1所示:表1columnnameasparaname目标表达式之间用“,”隔开,如果“orderby”属性不是null,取“orderby”的属性值拼接sql语句中的排序要求,如表2所示:表2columnnamedesc/asc排序要求之间用“,”隔开。获取数据接口get请求方式中的逻辑关系,只获取表名即可。获取数据接口get请求方式中的输入参数和过滤器,构建where子句的条件表达式如表3所示:表3relationcolumnnameoperationvalue/paraname用“relation”属性值连接条件表达式,“columnname”值是过滤器参数名称对应的数据库字段列名,“operation”值对应相应的操作符,如果“value”属性值不是null,直接获取“value”属性值,如果为null,则从request对象中获得该参数的值。from子句为该数据库表名。(2)多表级联查询:查询目标涉及多张表,且这些表之间的关系是级联的,如图2中的连接2,可以看到a与b、b与c有一对多的主外键关系,a表与c表或者有主外键关系,或者无直接关系,要对a、b、c三张表进行级联查询,首先根据该请求方式的输出参数来获取目标表达式如表4所示:表4tablename.columnnameasparaname目标表达式之间用“,”隔开,如果“orderby”属性不是null,取“orderby”的属性值拼接sql语句中的排序要求如表5所示:表5tablename.columnnamedesc/asc排序要求之间用“,”隔开。获取api文件中的逻辑关系,将表名按照级联关系进行排序,(若a表与c表的也存在主外键关系,可以看到在三张表进行连接是无关的,因此可以直接去掉)使用左连接构建from子句如表6所示:表6aleftjoinbona.column=b.columnleftjoinconb.column2=c.column2按照表名序列添加“leftjoin”;获取数据接口对象get方法中的输入参数和过滤器,构建条件表达式如表7所示:表7relationtablename.columnnameoperationvalue/paraname用“relation”属性值连接条件表达式,“columnname”值是过滤器参数名称对应的数据库字段列名,“operation”值对应相应的操作符,如果“value”属性值不是null,直接获取“value”属性值,如果为null,则从request对象中获得该参数的值。(3)多表非级联查询:查询目标涉及多张表,且这些表之间的关系不是级联的,如有三张表a,b,c,三张表级联关系如图2中的连接3,可见a与b、a与c形成一对多的关系,且b与c是没有关联的。按照各自的级联关系拆分成多条级联查询的sql语句,a,b,c三表的查询构建成两条sql语句,首先是根据数据接口对象a,b两表关系拼接from子句如表8所示:表8aleftjoinbona.column1=b.column1在数据接口对象get请求方式中,筛选a表、b表的输入参数、输出参数以及过滤器,按照级联查询拼接sql语句,按照同样的方式拼接a、c两表的查询语句。请求方法为put对应update语句,具体生成方法如图4所示:按照逻辑关系情况来判断要操作的表关系结构,可分为单表更新和多表更新,生成方法分别为:(1)单表更新:更新操作的对象为单张数据库表,即数据接口文件put请求方式中逻辑关系的“issingle”为true,根据输入参数的“columnname”以及“paraname”来确定set子句,列名为“columnname”的属性值,表达式为从request对象中获取到的相应“paraname”的值;根据api文件中的输入参数与过滤器的属性来拼接where条件子句,与get方法中的单表查询的条件子句采取一样的拼接算法。(2)多表更新:当要更新的数据项涉及多张表,需要多表联合更新,多表联合更新的语法如表9所示:表9采用如get方法的多表查询关系拼接一样,根据图2中的连接情况进行关系连接,确定from子句,但是update语句一次更新只能更新一张表的内容,因此更新多表需要多条update语句来完成,这些update语句的列名由输入参数的“tablename”和“columnname”属性来确定,即“tablename.columnname”,表达式为相应的paraname值,where条件子句的拼接算法与多表查询的where条件子句一样。请求方法为delete对应delete语句,具体生成方法如图5所示:按照逻辑关系情况来判断要操作的表关系结构,可分为单表删除和多表删除,分别生成方法为:(1)单表删除:删除的资源是单张数据库表,根据数据接口对象delete请求方法的逻辑关系“issingle”属性为true,确定表名,与get方法一样,根据delete请求方法的输入参数与过滤器拼接where子句。(2)多表删除:当删除的资源涉及到多表时,sqldelete语句的格式如表10所示:表10首先判断delete请求方式中的逻辑关系,对于本文提出的四种连接情况,无论是级联还是非级联,都通过“leftjoin”将多张表关系连接成一个关系,构建from子句,然后根据输入参数和过滤器拼接where子句。如果依次执行delete语句,由于已经删除部分资源,from子句连接将不存在,则其他删除语句执行删除资源为0,不符合删除的需求。因此,创建多表删除的sql语句首先根据from子句和where子句来创建每张表相应的临时表,from子句与delete语句中的from子句相同,如表11所示:表11每张表的临时表名命名规则是在每张表名的后面添加“temp”,然后按照多表联合删除的格式为每张数据库表创建删除语句,每条删除语句的from子句和where子句的表名,除了要删除的表之外,其他的数据库表的表名全部替换为相应的临时表名(#tablenametemp),每张表删除语句执行完成后,将创建的临时表删除,删除临时表的sql语句格式为如表12所示:表12droptable#临时表名假设在数据接口对象的delete请求方式中两张数据库表a、b的关系为一对多的主外键关系,主键和外键字段名称都是“acolumn1”,如图2的连接1,而输入参数为a表的字段“acolumn”和b表的“bcolumn2”字段,他们分别是各自表的主键字段,并且同时作为了delete的过滤条件,http请求消息中参数acolumn1的值为“1”,bcolumn2的值为“b2”,根据上述数据接口对象得到的sqldelete语句组如表13所示:表13请求方法为post对应insert语句,具体生成方法为:获取数据接口对象该请求方法中的逻辑关系和输入参数,将逻辑关系中的数据库表名和输入参数该表的字段名称(即“columnname”),构建into部分,根据该字段对应的参数名称(即“paraname”)在http的请求消息中获取参数值构建values部分字段值。通过jdbc执行构建的sql语句,如果put和delete方法涉及多表操作,将生成的多条sql语句在一个数据库事务中执行,将执行结果以json格式返回。基于执行结果构建一个httpresponse对象返回给用户。图6为本发明中openehr模板到数据接口对象转换方法的流程图,其中,步骤s601为解析openehr模板并建立模板对象,图7展示详细流程为:s701,读取openehr模板文件,s702,解析模板所约束的原型名;s703,根据原型名获取原型文件,解析原型;s704,根据模板文件对原型的约束解析原型文件;s705,判断其属性是否在模板文件中进行了约束,如果约束出现次数max=0,则s706,将原型中该属性隐藏不再使用,如果未添加约束,则s707,解析属性的路径值,s708解析属性名。图6中的步骤s602是获取根据openehr模板对象生成的临床数据存储中心的关系型临床数据库结构。图6中的步骤s603是按照一定的规则自动生成该模板的数据接口对象,图8为数据接口对象自动创建的详细流程:s802根据模板和模板对应的关系型临床数据库结构创建数据接口对象,首先每个关系数据库表对应一个数据接口对象,其uri为“/模板名/版本/数据库表名”。s803为每个关系数据库表创建了get方法、put方法、delete方法、post方法,分别为针对该表的查询、更新、删除以及添加操作,对于每个数据库表字段,如果字段是主键,则依次进行s805、s806、s807,具体为:s805,创建get方法、put方法、post方法、delete方法的输入参数,参数名为字段名参考驼峰命名法,将主键字段名首字母由大写转换为小写,即图1中的“paraname”属性,将该openehr模板对象属性名作为领域概念名即图1的“concertionattname”属性,路径值作为领域概念路径,即图1的“conceptionattribute”属性,将字段数据类型作为参数数据类型,即图1中的“datatype”属性,将表名作为该参数的表名,即图1中的“tablename”属性,将字段名作为该参数的字段名,即图1的“columnname”属性,将是否为主键值作为参数的是否为主键属性值,即图1中的“iskey”属性,将是否外键作为参数的是否为外键属性值,即图1中的“islink”属性,将是否允许为空作为参数的是否允许为空属性值,即图1中的“isnull”属性。s806,创建get方法、put方法、delete方法的过滤器,参数名是以主键作为输入参数的参数名,操作为等于,即图1中的“operation”属性,值为该参数变量的值,即图1中的“value”属性,设为空,过滤器之间的关系为and,即图1中的“operation”属性;s807,根据该主键字段创建get方法的输出参数,参数对象格式与输入参数一样。如果字段是外键,s811,判断是否已经创建该数据库表的外键数据接口对象,如果没有,s812,创建新的数据接口对象,uri为“/模板名/版本/数据库表名/referenceid”,s814,该数据接口的请求方法为get,如果该表的数据库字段为外键,s816,根据外键字段创建该请求方法的输入参数,s817,创建该请求方法的过滤器,s818,创建该请求方法的输出参数。如果表的字段既不是主键字段也不是外键字段,则s809,根据该字段创建put方法和post方法的输入参数,s810,创建get方法的输出参数;而数据接口对象以单张数据表为资源,因此每个数据接口对象的逻辑关系为单表,即图1中的“issingle”为“true”;每个数据接口对象的初始版本为1。图6中的步骤s604是根据临床特定数据需求创建数据接口对象,图9为用户根据需求自定义数据接口对象创建的详细流程:s902,用户根据自己的数据需求选择openehr模板进行编辑符合自己需求的数据接口对象,获取到模板对象以及模板对应的关系数据库结构,s903,创建数据接口对象资源地址,其uri为“/模板名/版本/自定义名称”,s904,用户根据自己数据操作需求制定数据接口对象请求方法,可以是get方法、put方法、以及delete方法,如果是get方法,s906,用户根据模板对象属性创建请求方法的输入参数,根据该模板对象的属性、路径值以及该属性对应的关系数据库字段结构为图1中的输入参数属性进行赋值,s907,根据模板对象属性来创建该方法的输出参数,根据该模板对象的属性、路径值以及该属性对应的关系数据库字段结构为图1中的输出参数属性进行赋值,输入参数和输出参数属性的创建方法与步骤s603中输入参数、输出参数创建方法一致;s908是在该请求方法的输入参数中进行过滤器的编辑,将输入参数的参数名作为过滤器的参数名,选择操作符“=”、“>”、“<”、“<=”、“>=”、“in”、“like”、“!=”的一个操作符作为过滤器的操作符,即图1中的“operation”属性,值可以为具体值作为筛选条件,也可以为空,表示参数值作为具体的筛选条件,选择“and”或者“or”作为过滤器间的关系,即图1中的“relation”属性;s909在该请求方法的输出参数上制定查询结果的排序方式,可以为“asc”或者“desc”,分别表示输出结果按照该输出参数升序或者降序排序,即图1中的”orderby“属性;如果是put方法,s911与s906采用同样的方法来创建put方法的输入参数,步骤s912与s908采用一样的方法在输入参数上指定put方法的过滤器;如果是delete方法,同put方法一样为delete方法来创建输入参数和过滤器。图10为本发明中数据接口对象动态生成数据接口的流程图,本发明中进行动态数据接口的生成主要是基于servlet来执行,用户发出数据接口调用的http请求,步骤s1002是一个运行的servlet程序,获取到用户发送的http请求,构建一个httprequest对象,步骤s1003根据httprequest对象,获取发出的http请求的地址,获取资源描述地址uri和请求方法,根据uri和请求方法来获取数据接口对象内容,根据数据接口对象内容和http请求的输入参数来构建相应的sql语句,步骤s1004使用jdbc来执行所生成的sql语句,并获得执行结果,步骤s1005按照servlet构建httpresponse对象方法将数据操作结果构建一个httpresponse对象返回给用户。表14是用户发送的一个http请求:表14servlet根据http请求构建响应的httprequest对象,可以看到该请求的uri为:/apibyopenehr/instruction.request-lab_test/v1/getlabtestbypid;其中“apibyopenehr”是servlet程序名称,“/instruction.request-lab_test/v1/getlabtest-bypid”是数据接口对象的资源描述地址,“patientidentifier_id=00552846”是查询字符串,请求方法是get,因此根据“/instruction.request-lab_test/v1/getlabtestbypid”和get请求方法可以获取数据接口对象,get方法对应于数据查询操作,根据输出参数创建查询目标列,根据逻辑关系创建from子句,根据输入参数、过滤器以及http请求的输入参数“00552846”来创建条件表达式。步骤s1005连接到openehr模板生成的数据库服务器,将sql语句执行,执行结果;步骤s1006根据数据结果构建一个httpresponse对象,以json格式返还给用户。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1