利用Neo4j存储中医皮肤病“病-证-治”本体方法的研究*

2020-11-25 03:09王明强崔一迪陈欣然李国正
世界科学技术-中医药现代化 2020年8期
关键词:定义域皮肤病实例

王明强,张 磊,崔一迪,陈欣然,李国正

(1. 中国中医科学院中医药信息研究所 北京 100700;2. 中国中医科学院中医临床基础医学研究所 北京100700;3. 中国中医科学院中医药数据中心 北京 100700)

本体作为一种概念框架,可对概念及概念间关系进行形式化表示[1]。领域本体属于本体中的一种,表示对限定领域范围内概念及其关系的形式化描述[2]。从组成来看,领域本体一般包含一系列重要的领域概念,用于描述概念的概念属性、概念间关系(分类关系与非分类关系)以及属性关系约束等部分[3]。通常采用资源描述框架(RDF)、网络本体语言(OWL)、属性图等模型进行本体的表示。本体数据的存储实质是指RDF 有向图数据的存储,其存储的基本单位是RDF三元组[4],通常表示为“(Subject,Project,Object)”的形式,其中Subject 由统一资源标识符(Uniform resource identifiers, URI)或空白节点构成,表示三元组中的主体部分;Project 一般为统一资源标识符,表示三元组中连接主客体间的关系;Object为统一资源标识符、空白节点或带有数据类型的值,表示三元组中客体部分。通过三元组形式可以表示出领域中的特定知识,大量的三元组有机地联系组合在一起则构成领域本体。随着三元组规模的不断扩大,传统的基于关系型数据库的存储方法会出现许多问题,诸如直接存储RDF 数据时出现大量自连接、稀疏属性下形成大量空白单元格、信息检索效率不断下降甚至难以实现复杂关系查询等问题。从功能上来看,本体模式层面的概念与关系一旦被表述清晰,其所对应的实例层面各个实例及之间关系便得以有继承性且规范化表达,这反映了本体对实例数据及其间关系一致性的约束。因此选择合适的本体存储方式并实现对存储数据进行一致性检验是合理应用领域本体的基础。

Neo4j 属于图数据库,随着现实世界中相互联系的数据规模的不断扩大,图数据库为信息存储提供了高效的解决方案[5],其采用属性图的结构存储数据,这种存储形式特别适合路径查询与模式发现[6]。属性图的组成方式主要为具有属性的节点通过关系相互联系,每个节点可以被赋予一个或多个表示所属类型的标签,每一个关系必须有起始节点及其所指向的终节点,节点和关系上均可以添加以“键-值”对形式存在的“属性-属性值”对。这种数据结构可以高效地实现数据建模,从而使Neo4j 数据模型在表达能力上表现出众。RDF 数据模型具有天然的图结构,以属性图模型存储可以避免RDF 逻辑数据模型到物理数据模型转换时的信息缺失[7]。同时,Neo4j 能够有效解决多维RDF 数据中属性个数不一带来的内存浪费问题,通过给边赋予属性灵活地扩展网络模型,通过深度遍历接口以相同的速度遍历节点与关系,从而解决了出现大量连接查询时性能衰退的问题[8]。Cypher 语言是Neo4j 所使用的图形查询语言,具有语法简单、功能强大的特点,能构建出高度复杂的数据库查询语句,从而使用户专注于所关注的领域而非如何访问数据库的问题上[9]。因此,利用Neo4j 存储领域本体并通过Cypher 语言构建命令,以实现数据一致性检验,这种方法被视为构建领域本体的方法之一。

中医药领域本体是疾病、病因病机、症状、证候、治法、方药等相关概念及其属性、关系的网络化整合,国家知识基础设施(National knowledge infrastructure,NKI)课题将中医本体分为30多种类别[10]。目前,已有学者开展了领域本体构建的相关研究,例如,田甜等[11]构建以五脏为中心的知识本体,以用于挖掘肺与大肠间疾病证治规律;曹馨宇等[12]从梳理中医冠心病养生相关知识的角度入手,利用多个医学术语系统或集合规范多数据来源术语及语义关系,初步构建了面向养生需求的冠心病知识本体;李新龙等[13]通过研究指南、标准、教材等具有较高公认性的文献,梳理并构建了包含临床表现、诊疗、疗效在内的中医师辨证论治体系顶层本体;于彤等[14]构建了面向中医药领域的规范化顶层本体,为中医药学语言系统中的概念提供了一体化的概念框架并形成了相关国际标准;龙海等[15]提出了在通用形式化本体基础上构建中医药顶层本体的思路与研究方向。研究者对中医药局部或顶层本体构建研究倾注了大量心血,但由于中医药领域概念繁多,相互间关系错综复杂,构建完全覆盖所有概念、关系以期构建中医药领域本体的难度非常大。因此,本研究主要集中于构建中医皮肤病在“疾病-证候-治法”范围内的领域本体,通过较小规模的领域本体构建以及对所构建本体的数据一致性进行检验研究,初步实现利用Neo4j 构建、存储具有一定扩展性和较高准确性的领域本体,为后续更大规模领域本体的构建工作奠定基础。

1 材料

中医皮肤病实例参考《全国中医药行业高等教育“十二五”规划教材·全国高等中医药院校规划教材(第9版):中医外科学》[16]皮肤疾病部分内容。

本体存储工具使用Neo4j Desktop 1.1.9客户端(包含Neo4j 数据库3.4.8版)。

2 方法与结果

2.1 中医药皮肤病领域本体RDF模型设计

本研究主要研究的领域本体对象为中医皮肤病“疾病-证候-治法”概念及其之间的关系。此处疾病主要指中医临床常见皮肤病,证候指临床辨证常见的证候类型,治疗方法包括:内治法、外治法。前者指在辨明证候后采用内服方药方法针对该病证候进行治疗的方法,后者指针对该皮肤病所采取的体外治疗方法。

从模型角度来看,该领域本体包括了类(Class)、属性(Property)以及实例(Individual)三种元素。

类(Class),是指构成研究领域本体的相关概念,属于RDF 模型中的主体(Subject)或客体(Object)。可表示为(中医皮肤病,rdfs:type,Owl:Class),即“中医皮肤病”的类型属于“类”,其他如“中医疾病”“证候”“治法”“内治法”“外治法”等均属于类。

属性(Property)包含了数据属性(Data property)与对象属性(Object property)。数据属性指领域本体概念自身所具有的属性,如疾病的内涵、发病部位、发病时间等均为反映疾病自身特点的属性。对象属性用于描述领域概念间或实例间所具有的关系,通常具有限定的定义域(Domain)与值域(Range)。定义域中的数据类型可以为类(Class)、空白节点(Blank node),值域中的数据类型可以为类(Class)、空白节点(Blank node)以及带有数据类型属性的值(Literal)。常见的对象属性有父子关系(SubClassOf)以及类与实例间关系(rdf :type)。如SubClassOf(中医皮肤病,中医疾病)表示中医皮肤病是中医疾病的子类;type(接触性皮炎,中医皮肤病)表示接触性皮炎的疾病类型是中医皮肤病。

实例(Individual)指临床中具体发生的疾病、证候、治法,如接触性皮炎,血虚风燥证,养血润燥、祛风止痒等分别为前述类下的实例。可表示为(接触性皮炎,rdfs:type,owl:Namedindividual)等类似结构。

结合对前文概念的认识,构建了对应的对象属性与数据属性,并对其定义域、值域进行了限定。具体结果见表1。

根据对类、属性、实例的认识与设计,以常见中医皮肤病:接触性皮炎为例,构建出对应的RDF 模型图,具体结果见图1。

表1 中医药皮肤病“病-证-治”本体属性的设计

图中实例节点为接触性皮炎及其相关证候、内治法、外治法实例,相互间关系通过预定义的对象属性进行关联,并与对应的类节点进行联系;中医疾病、中医皮肤病、证候、治法、内/外治法等类节点间有层次关系(SubClassOf)或预定义的对象属性关系,在类间为突出对象属性的方向性,特将对象属性设定为节点并指明其定义域与值域,同时这种表达也将为后续进行数据一致性检验奠定基础。

图1 中医常见皮肤病“病-证-治”本体的RDF模型

2.2 利用Neo4j存储RDF模型

RDF 模型以(Subject, Project, Object)三元组形式存在,与 Neo4j 由“节点 1”-“关系”->“节点 2”构成的有向的基本数据模型相类似,故可采用将RDF 模型映射到Neo4j 数据模型的方式将之存入Neo4j 中。为方便理解,将RDF 模型表示为“节点名称(s , p , o)”,节点名称可从相应的URI中提取。

本研究所构建的相关映射规则如下:

(1)RDF 模型中表示类的节点C(URI,rdfs:type,OWL : Class),在 Neo4j 中将节点标签映射为“Class”,属性至少包含“label:C”与”uri:URI”,如C 有数据属性,也应映射到Neo4j相应节点中。

RDF模型:

C(URI,rdfs:type,OWL:Class)

映射至Neo4j模型:

(: Class{label : C , uri : URI , property : datatype property})

(2)RDF 模型中表示实例的节点I (URI , rdf :type,C),在Neo4j 中将节点标签映射为“C”,属性至少包含“name:I”与“uri:URI”,如 I 有数据属性,也应映射到Neo4j相应节点中。

RDF模型:

I(URI,rdf:type,C)

映射至Neo4j模型:

(: C{name : I , uri : URI , property : datatype property})

(3)RDF 模型中表示对象属性的节点OP (URI ,rdfs:type,OWL:ObjectProperty),在 Neo4j中将节点标签映射为“ObjectProperty”,属性至少包含“label :OP”与“uri :URI”,由于RDF 模型中实际表示对象属性时是显示在连接两节点的边上,并不具有数据属性,故没有数据属性项需要映射。

RDF模型:

OP(URI,rdfs:type,OWL:ObjectProperty)

映射至Neo4j模型:

(:ObjectProperty{label:OP,uri:URI})

(4)RDF 模型中表示对象属性/关系的边rdf(s) :OP(URI),在 Neo4j 中将标签映射为“OP”,属性为“uri:URI”。

RDF模型:

rdf(s):OP(URI)

映射至Neo4j模型:

(:OP{uri:URI})

依照上述映射规则,将已构建的RDF 模型映射并存储至Neo4j 中,得到如图2 所示结果:紫色节点表示RDF 模型中的中医皮肤病“疾病-证候-治疗”相关的类节点,类间满足父子关系的以SubClassOf关系连接;蓝色节点表示自定义的三种对象属性(syndrome_differentiation, treatment_of_syndrome, treatment_of_disease),通过DOMAIN、RANGE 关系指向相应的类以明确对象属性的定义域(Domain)、值域(Range)约束;红色节点表示中医皮肤病下的疾病实例,绿色节点、粉色节点分别表示每个“中医皮肤病”实例“辨证为”的“证候”实例以及“对病治疗”的“外治法”实例;黄色节点表示每个“证候”实例“对证治疗”的“内治法”实例。

2.3 对Neo4j中数据进行一致性检验

由类节点与对象属性节点及其间关系构成的本体模式层,实现了对对象属性定义域、值域的约束,如对象属性:“辨证为”被约束定义域为“中医皮肤病”、值域为“证候”,结合实例中如“接触性皮炎”-“辨证为”->“血虚风燥证”,利用Cypher语言编写检验“辨证为”在实例层中其定义域与值域是否符合模式层的约束,通过对所有对象属性的定义域、值域进行检验实现对已添加在实例层中数据的一致性验证,快速发现隐藏在实例层中的错误表述,及时反馈给相关人员以便修正。

2.3.1 针对对象属性定义域(DOMAIN)的数据一致性检验

检验思路如下:

(1)匹配符合由对象属性节点op通过DOMAIN 关系指向类节点c的所有模式,并返回对象属性节点、类节点的 uri、label属性值。

(2)匹配(n)-[r]->()模式,找出关系r与定义的对象属性op.label 一致,但实例节点类型n:Label 不在本体模式层所定义的类c.label 范围者,即找出DOMAIN 所指向的实例不符合类的约束者。

(3)返回定义域错误的节点、关系,提示正确的归类。

对应的Cypher语句实现如下:

图2 由RDF模型映射并存储在Neo4j中的中医皮肤病领域本体示例图

表2 对象属性定义域(DOMAIN)的数据一致性检验,存储的实例定义域指向错误时的结果

MATCH (c: Class) <- [: DOMAIN]- (op:ObjectProperty)

WITH c.uri as class, c.label AS classLabel, op.uri AS prop,op.label AS propLabel

MATCH (n)-[r]->() WHERE type(r)=propLabel AND NOT classLabel in Labels(n)

RETURN id(n) AS Node_ID, n.name AS Node_name,'domain of ' + propLabel + ' [' + prop + ']' AS 'Check Failed','Node labels:('+reduce(s='',l IN Labels(n)|s+''+l)+')should be'+classLabel AS ExtraInfo

经一致性检验,当存储的实例出现定义域指向错误时,如出现类似“湿疹<-辨证为-湿热内蕴证”的表达时,则会给出如表2的结果。

提示ID 为81 的节点“湿热内蕴证”作为“证候”类不应出现在“辨证为”关系的定义域中,真正的定义域应为中医皮肤病类下的实例。该Cypher 语句可以较快地遍历相关数据,找出不符合模式层所给定的对象属性定义域约束的实例并给出其所在位置(Node ID)及名称(Node name),方便人工干预,提高领域本体的准确性。

2.3.2 针对对象属性值域(RANGE)的数据一致性检验

与前述对象属性定义域(DOMAIN)的数据一致性检验思路类似,构建的Cypher语句如下:

MATCH(c:Class)<-[:RANGE]-(op:ObjectProperty)

WITH c.uri as class, c.label AS classLabel, op.uri AS prop,op.label AS propLabel

MATCH (n)-[r]->() WHERE type(r)=propLabel AND NOT classLabel in Labels(n)

RETURN id(n) AS Node_ID, n. name AS Node_name, ' range of ' + propLabel + ' [' + prop + ']' AS 'Check Failed', ' Node labels: (' + reduce(s = '', l IN Labels(n) | s + '' + l) + ') should be ' + classLabel AS ExtraInfo

当对象属性值域出现错误时,给出类似于定义域数据一致性检验的错误信息及提示。操作人员可以根据反馈的一致性检验结果快速查找到错误节点并进行修正。

本体的模式层是对领域本体及其间关系的高度总结,而上述数据一致性检验仅与本体模式层的构建形式相关,与具体的类或对象属性类型无关。因此,将对象属性构建为节点,以DOMAIN、RANGE 作为对象属性指向相应类间的关系,以这样的模式构建本体模式层,利用前述给出的Cypher 语句来实现数据一致性检验,可以快速检验本体间关系的准确性,且这种检验方式通用性、可迁移性强,可以用在除中医药领域外的其他不同领域,从而提升了已有本体、以及新存储实例的数据准确性,并能快速定位错误节点或关系,利于及时修正。

3 讨论

本研究以中医皮肤病在“疾病-证候-治疗”范围内相关的类及关系为基础,确定了中医皮肤病、证候、内治法、外治法等类以及自定义的“辨证为”“对证治疗”“对病治疗”等关系为研究对象,通过分析类间关系、实例与类的对应关系构建RDF 模型,形成对中医皮肤病“疾病-证候-治疗”领域本体的具体认识及规范化表达,为避免基于关系型数据库存储方式带来的大量自连接、稀疏属性且扩展性有限的缺点,故选择具有能够以属性图形式存储具有复杂关系数据且扩展性强特点的Neo4j 作为存储领域本体的数据库。为检验已存入数据的准确性,利用Neo4j 的查询语言Cypher 构建了对对象属性定义域、值域进行数据一致性检验的语句,实现对预定义关系矛盾点的检测定位与修正提示,方便研究者快速、准确地进行人工干预。该命令具有较好的迁移性与适应性,即使领域本体在后续研究中不断增加新的类或对象类型或需要迁移至其他领域本体,这些语句均可进行适当修改以完成对数据一致性的检验。

由构建RDF 模型分析领域本体间关系到通过映射规则将本体存储至Neo4j 中、并对存储数据一致性检验的研究方法,既实现了领域本体的规范化表达,又满足了本体扩展性与数据可靠性的要求,从而为构建准确性较高的中医药领域本体提供了参考。但该研究也存在一定局限性:其一,所研究的领域本体规模较小、本体间关系复杂度有限,对应的映射规则也较为简单,更大规模的本体需要考虑构建更为复杂的映射规则,一旦出现错误映射将导致本体间在逻辑上冲突[17],这种错误也会误导一致性检验语句的构建;其二,本研究未涉及对数据属性以及SubClassOf层次关系的数据一致性检验,前者检验方法类似于对象属性数据一致性检验方法,后者则是目前尚未解决的问题。因此,在后续研究中本课题组将继续扩大领域本体范围,不断提高模型复杂度,借鉴学习国内外研究者在相关领域中的研究,构建更为完善的映射规则与数据一致性检验方法,以期能够更好地利用Neo4j 存储中医药领域本体,为实际应用奠定基础。

猜你喜欢
定义域皮肤病实例
如何求抽象函数的定义域
牛结节性皮肤病的防控措施
运用中药对药治疗皮肤病瘙痒症状浅析
抽象函数定义域的四种类型
Poincare映射的定义域
归纳复合函数定义域的求法
你想不到的“椎”魁祸首:皮肤病可能与脊椎有关
完形填空Ⅱ
完形填空Ⅰ