摘要:讨论了中医经络学内在的网络结构模型,提出一种通过层次模型和关系模型混合存储经络和穴位的方法,在db2数据库中采用purexml数据格式实现存储,并利用xquery技术对人体经络数据在数据库中进行增、删、改、查,实现了人体经络学习系统。
关键词:人体经络;数据库;purexml;xquery
1 人体经络学的现状
经络学是我国传统中医学的一个重要分支,是体会中医的实质、快速进入中医殿堂的捷径。经络由经和络组成,经是干线,络是分支,人体有12条主干线,又称为“十二正经”,再加上奇经八脉,共有三百六十多个穴位,此外还有无数的脉络,经络纵横交错。这些经络通往五脏六腑,内脏有任何问题都会在经络相关的穴位上有所反映。有效地掌握和运用经络学知识能够增强人们的体质,抵御疾病的侵袭。
目前的人体经络学是我国几千年传统医学的积累,是无数医学家智慧的结晶。虽然其具有一定的科学理论依据,但是大部分内容还是几千年经验的积累,对于大多数人,甚至是中医学院的学生来说,想熟练掌握经络学的知识都是非常困难的一件事情。
当电子计算机出现之后,其在医学领域得到了广泛的应用。将计算机技术应用于经络学,尤其是制作出一套人体经络学学习系统和查询系统是一个非常有现实意义的工作,有利于弘扬祖国的传统文化。但经络本身是一个极其复杂的系统,与阴阳五行、四季更迭有密切的关系,不同的经络、不同的穴位能够治疗不同的疾病,同时,与中西医的其他分支也有紧密的联系。用计算机来存储各个经络、各个穴位的结构会有很多不同之处,而且不同的用户可能根据自己的经验向系统中加入自己的经验,其内容也会经常发生变化。而目前主流的数据库管理系统都是关系模型的,以二维表为基本的存储结构,这种结构要求存储结构保持相对稳定、一致,并不适合用于存储经络和穴位。
2 purexml数据格式的优势
purexml技术的出现为经络、穴位的描述提供了有效的手段。purexml是具有良好格式的xml数据,其具有层次化的结构,支持dtd和xml schema,非常适合存储异构的数据。研发人体经络学习系统采用xml数据格式作为后台的数据存储方式比关系数据库更加有优势。
目前xml的存储方式主要有以下几种:
将xml文档分解成关系数据库中的一系列表,在需要的时候再把相关字段抽取出来组合成xml文档。这种方式适用于xml内容非常规范,并且业务需求变化不大的系统;
以文本方式保存在文件系统中,这种方式需要使用dom或者sax方式对xml进行解析,效率不高,而且由于需要程序员自行维护文件系统,增加了编程的难度,系统也不够通用;
把一个xml文件作为一个大文本存储在关系数据库的一个字段中,很多数据库管理系统都支持存储最大达到2g的大文本,但是采用这种方式丧失了xml文档固有的层次特性,无法对其内部进行分析检索,如果分析其内部结构,又与第二种方式相似,造成效率低下,通用性降低;
把xml文档存储在支持xml解析和检索的数据库中,通过xquery这种针对xml文档的专用语言,来检索xml文档。这种方式可以保留xml文档原有的层次结构,而且可以高效地定位到xml文档中特定的节点,是最具有潜力的xml存储方式。
目前ibm、oracle、微软等数据库主要研发厂商都在自己的数据库管理系统最新版本中增加了xml特性,其中ibm的db2 v9及后续版本是ibm最新推出的“混合型”数据库管理系统,除了支持传统的关系数据,还支持purexml这种层次化的数据,用户可以在一个表中混合存储关系数据和purexml数据,还可以使用sql和xquery语言自由地查询和处理这两种数据,是目前对purexml数据支持程度最高、与标准化组织制订的标准最为接近的数据库管理系统。
3 用关系、层次混合模型存储经络和穴位
人体中12条正经、奇经八脉、360多个穴位本身的名称、位置等性质已经固定,适合使用关系模型进行存储,而各个穴位独特的属性、点按的手法、适合的病症等信息存在很大差异,而且存储结构本身也经常发生变化,适合采用xml格式的层次模型进行存储。
根据人体经络学习系统的需求,设计关系模型如下:
表1中所有字段都是固定的,适合于采用关系模型进行存储。
表2中的最后一个字段cure,保存能够治疗的疾病以及治疗的方法,其内容随着穴位的改变会有很大不同,不适合采用固定结构的字段存储,所以采用xml结构。
此外还包括药品表、时令表、治疗手法表等其他若干张表格,用于与经络表和穴位表相关联,因为中医各个分支是相辅相成的,不能完全割裂开来。限于篇幅,此处省略其他表格的结构定义。
4 使用xquery操纵purexml数据
首先给出purexml中几个基本定义。
定义一:标签。用户自定义的、用一对尖括号括起来的内容,称为标签,在purexml中,标签是成对出现的,结尾标签与起始标签同名,但在名字前面加上斜线(/)。
定义二:元素。在purexml文档中,一对首尾标签所包含的完整部分(包括标签本身)作为一个元素。
定义三:属性。在purexml文档中,每个元素都可以拥有自己的若干属性,属性由“属性名=属性值”构成,属性写在元素名称所在的标签中,属性与元素名称之间、属性与属性之间使用空格进行分隔。
定义四:文本。元素的一对首尾标签之间所包含的内容称为文本(不包括标签)。如果文本没有内容,则首尾标签可以简写为一个标签,在标签名后面加上一条斜线(/)。
下面是穴位表points中cure字段的一个例子:
<穴位 id="101">
<名称>筑宾穴名称>
<功效>补肾功效>
<含义>“筑”为建筑房屋之意,与“杵”相通,是生活中捣蒜、捣米的工具。“宾”通“膑”,指膝盖骨。“筑宾”指在膝盖骨旁边再搭一个柱子,起强身健骨的作用。含义>
<主治>
<强健>膝盖发软强健>
<神智>抑郁症,癫痫,恐惧神智>
<解毒>解烟毒、装修气味毒、长期服药体内淤毒,化痰,活血,祛湿解毒>
<尿酸>痛风,结石尿酸>
主治>
<手法>按揉手法>
<相关>太冲穴相关>
穴位>
在这个例子中,所有用尖括号括起来的都是标签,标签都是成对出现的。每一对标签所包含的内容就是一个元素,如“<功效>补肾功效>”,一个元素中可能包含若干子元素。元素的属性在元素名称后面,如<筑宾穴 id="101">当中的id="101",表示属性id的值为101。元素除去标签之外的部分为文本,如“<功效>补肾功效>”中的“补肾”。
xquery相对于xml,就类似sql相对于二维关系表,使用xquery可以实现对xml数据中节点、属性以及文本的增加、删除、修改和查询。下面以人体经络学习系统中几个实际例子说明xquery的主要用法:
4.1 xml数据的查询
如果要查询哪个穴位可以治疗结石,可以采用如下xquery语句:
select name, position,
xmlcast(xmlquery('$i/穴位/主治' passing cure as "i")as char(50)) as cure,
xmlcast(xmlquery('$i/穴位/手法' passing cure as "i")as char(50)) as method
from points
where xmlexists('$i/穴位/主治[contains(尿酸, "结石")]' passing cure as "i");
其中,xmlquery函数是能够使用路径表达式或flwor表达式来进行xquery查询并返回结果的函数,而xmlcast是将xquery查询结果转换为普通字符数据类型的函数,xmlexists函数能够判断一个xml文档内部是否满足一定的查询条件。
4.2 xml数据的修改
假设要把筑宾穴的尿酸项目改为“<尿酸>痛风,肾结石尿酸>”,可以采用类似如下的xquery语句:
update points
set cure=xmlquery(
'transform copy $new:=$i modify do replace value of
$new/穴位/主治/尿酸 with "痛风,肾结石" return $new' passing cure as "i")
where name='筑宾穴'
4.3 向xml文档中插入一个节点
假设要在“手法”元素后面插入一个新的元素“<适用人群>所有人适用人群>”,可以采用类似如下的xquery语句:
update points
set cure=xmlquery(
'copy $new:=$i modify do insert <适用人群>所有人适用人群>
after $new/穴位/手法
return $new' passing cure as "i")
where name='筑宾穴'
4.4 从xml文档中删除一个节点
假设要将“<强健>膝盖发软强健>”这个节点删除掉,可以采用类似如下的xquery语句:
update points
set cure=xmlquery(
'copy $new:=$i modify do
delete $new/穴位/主治/强健
return $new' passing cure as "i")
where name='筑宾穴'
5 人体经络学习系统的难点与实现
人体经络学习系统最困难的部分在于对中医的理解,只有对经络学以及与之相关的中医、中药、五行、时令等多方面内容深入理解,才能够建立起全面、高效的模型,并基于此编程实现,解决这个困难最好的方法是与医院或者中医相关部门合作,并反复对项目的需求进行讨论。
其次,该系统前台通过java实现,后台数据库采用db2 9.0以上的版本,db2 9.0以上的版本能够较好地支持xquery,但前台的显示需要提供足够的灵活性和便捷性,使用户操作起来既不能很繁琐,又可以实现很多自己定义的内容,从而体现出xml数据格式的优势。实现便捷性的思路是在页面上大多数选项提供默认值,使用户直接点击“下一步”按钮即可,实现灵活性的思路是在页面上提供用户自定义链接或按钮,允许用户增加自己命名的选项并赋予相应的值。
再次,要实现java与purexml的结合,即要在java环境中使用purexml,这可以通过选择java xquery api(简称xqj)来实现,该api可以从datadirect下载免费的试用版,按照说明文档进行安装,然后把xqj jar添加到类路径中,接下来就可以编写java代码运行xquery了。每个程序包含两个部分:建立/访问xquery数据源;执行xquery。核心代码如下:
package ibm.dw.xqj;
import com.ddtek.xquery3.xqconnection;
import com.ddtek.xquery3.xqexception;
import com.ddtek.xquery3.xqj.ddxqdatasource;
private string filename;
private ddxqdatasource datasource;
private xqconnection conn;
datasource = new ddxqdatasource();
conn = datasource.getconnection();
首先建立一个新的数据源,该对象的类型是com.ddtek.xquery3.xqj.ddxqdatasource。然后使用数据源得到新的com.ddtek.xquery3.xqconnection对象。该对象可以接受查询字符串并执行。运行查询需要经过以下步骤:
(1)从xqconnection创建一个xqexpression对象。
(2)使用xqexpression对象的bindxxx()方法把变量绑定到查询。
(3)执行查询,结果保存到xqsequence对象中。
以下是查询代码:
string xmlfilename = args[0];
xquerytester tester = new xquerytester (xmlfilename);
tester.init();
final string sep=system.getproperty("line.separator");
string querystring =包含xquery的字符串;
xqexpression expression = conn.createexpression();
expression.bindstring(new qname("docname"), filename,conn.createatomictype
(xqitemtype. xqbasetype_string));
xqsequence results = expression.executequery(querystring);
return results.getsequenceasstring(new properties());
通过以上方法,就可以利用java技术实现xquery查询,从而实现该系统。
6 小结与未来改进方向
本文讨论了通过xquery技术对以xml格式存储的人体经络数据进行管理的方法,实现了人体经络学习系统。xquery技术对purexml数据进行存取,其固有的层次型结构大大增强了人体经络学习系统的灵活性,并且能够与传统的关系模型良好地结合与转换,该技术必然会成为下一代信息管理系统的核心技术。
但目前xquery技术还存在一些不足,主要体现在以下几个方面:一是语法过于复杂,程序员学习的难度曲线很大;二是xquery技术在数据库设计方面不像关系模型那样有成熟的理论基础;三是目前各个厂商对统一的标准规范支持程度不一,给程序的迁移造成了困难。相信这些问题会随着该技术的深入应用而逐步得到解决的。
下一步,人体经络学习系统将在前台增加flash格式的人体经络显示,并且能够与用户进行交互,允许用户通过点击形象的flash图像来得到相关信息;同时在后台增加智能学习算法,在数据库中数据量达到一定规模之后,根据一些预定义的规则进行推理,从而得出一些新的治疗方案,供专业医师参考。
参考文献
[1]matthias nicola, uttam jain. update xml in db2 9.5[eb/ol].[2007-10-11]. /developerworks/data/library/techarticle/dm-0710nicola/
[2]brett mclaughlin. use xquery from a java environment[eb/ol].[2008-5-29]. /developerworks/xml/library/x-xjavaxquery/?s_tact=105agx52&s_cmp=content
[3]susan malaika, jan-eike michels, christian pichler. xquery update[eb/ol].[2008-10-09]. /developerworks/data/library/techarticle/dm-0810malaika/
[4]中里巴人.求医不如求己[m]. 北京:中国中医药出版社,2007.
[5]中里巴人.求医不如求己[m]. 江苏:江苏文艺出版社,2007.
[6]中里巴人.求医不如求己[m]. 江苏:江苏文艺出版社,2008.
[7]马悦凌.不生病的智慧[m]. 江苏:江苏文艺出版社,2008