基于R2RML的医学主题词表RDF转换实现*
2019-06-19吴思竹修晓蕾李艳梅
吴思竹 修晓蕾 李艳梅 钱 庆
(中国医学科学院医学信息研究所 北京 100020)
1 引言
2001年Bernerslee T 等人首次提出语义网概念[1]。随着语义网的兴起,关联数据得到越来越多的发展[2],图书馆界已意识到关联数据和语义网络是公开集合数据更好的手段,而源描述框架(Resource Description Framework,RDF) 是更适合于语义网的数据模型。为将关系数据库中的数据融入到语义网中需要将其转换成RDF,这一转换过程被称为RDB2RDF。
作为国际上最具代表性、使用最广泛的受控医学综合性叙词表——医学主题词表(Medical Subject Headings,MeSH)[3],一些机构尝试从不同出发点、利用不同转换技术和语义模型进行MeSH的RDF转换。2004年Van Assem等人利用简单知识组织系统(Simple,SKOS)的RDF模型,首次将MeSH转换成RDF[4],2006年科学共享研究人员对Van Assem转换模型进行稍微修改,实现MeSH主题词-副主题词的组配[5],2006年Bio2RDF项目采用Web语义技术对MeSH转换[6-7]及BioPortal对其进行尝试。这些机构的尝试仅涵盖MeSH功能的一部分,缺少原始资源中一些细节,如主题词-副主题词的组配、上下位关系等。2009年美国国立医学图书馆(National Library of Medicine,NLM)的医学本体研究组织(Medical Ontology Research,MOR),利用扩展样式表转换语言(Extensible Stylesheet Language Transformations,XSLT)将MeSH的可扩展标记语言(Extensible Markup Language,XML)表示形式转换成RDF且对其定期维护更新至今[8]。该版本保留MeSH的 3级概念结构,实现上下位关系,具有一定的权威性和借鉴性。但MeSH结构太复杂,限制在XML版本中明确呈现MeSH特征的RDF表示方式不能很好地表达一些重要特征(包括主题词之间的层级关系),也不能实现主题词-副主题词组配。
2 R2RML映射语言
2003年W3C发布了调查报告"Mapping Semantic Web Data with RDBMSes"[9],其中分析进行RDB2RDF需要解决的主要问题及现有解决方案和相关工具,指出RDB2RDF的关键是定义一种映射语言。2012年W3C推 荐 Direct Mapping和R2RML两种映射语言。Direct Mapping为直接映射,将关系数据库表结构和数据直接输出为RDF图,RDF图中用于表示类和谓词的术语与关系数据库中的表名和字段名保持一致,完全是关系数据库数据结构的反映,且不可更改[10];而R2RML则有高度的可定制性。R2RML映射是指从关系库中检索数据的逻辑表(LogicalTable),如基本表、视图或有效结构化查询语言(Structured Query Language,SQL)查询,然后使用三元组映射(TriplesMap)将每个逻辑表映射为RDF[11]。三元组映射是指主语映射(SubjectMap)、谓语映射(PredicateMap)和宾语映射(RefObjectMap) 或引用客体映射(RefObjectMap)。R2RML逻辑框架,见图1。
图1 R2RML逻辑框架[5]
3 医学主题词表(MeSH)
3.1 结构
MeSH具有一套完整的数据体系结构,包括主题词表、副主题词表、增补概念词表、树形结构表等部分,采用3级概念结构模式进行组织,第1层由主题词、副主题词和补充概念记录(SCR)组成,第2层由念的同义术语组成,第3层由术语组成。3级结构可以将MeSH的语义关系明确清晰地标识出来,描述信息也从原来的主题词级别细分到主题词、概念、术语级别。这种结构有利于计算机理解和处理,支持从多个维度组织和查询生物医学信息资源,有助于整体提升MeSH的易用性及性能。
3.2 解析
从NLH官网下载XML格式的MeSH词表(2017版),通过解析MeSH的XML获得主题词表、副主题词表、补充概念记录表、概念表等多个词表,导入数据库中。为减少数据库冗余度和RDB2RDF的时间消耗及避免空白节点,对MeSH数据库的原始表格重新进行数据建模和适当的拆分合并,最终共建立21个表格。统计解析后的MeSH词表,共有主题词28 472个,副主题词80个,主题词术语115 845个,与官网数据相一致[12]。MeSH各个词表数据关系,见图2。其中descriptor1表存储的是descriptor基本属性中一对一的属性,descriptor2表中存储的是descriptor基本属性中一对多或多对多的属性;同理表concept1、concept2、scrs1和scrs2。这样有利于减少节点冗余度和时间消耗。
图2 MeSH各词表数据关系
4 R2RML映射文档
4.1 步骤
本实验在将MeSH从RDB格式转换RDF的过程中,借鉴NLM在利用XSLT将MeSH的XML表示形式转换成RDF过程中对MeSH类和谓语的规定,通过R2RML映射规则将其转换成RDF。根据MeSH体系结构规定16个类,各类之间的关系,见图3。
图3 MeSH各类之间的关系
根据MeSH的XML表示形式解析情况规定abbreviation、allowableQualifier、altLabel、annotation、broaderConcept、broaderDescriptor 等47个谓语。相较于NLM对MeSH谓语的规定,本实验少了两个谓语meshv:active和meshv:lastActiveYear。因查找MeSH的XML格式及XSD格式均未查到这两个属性。根据MeSH各词表在关系数据库中的存储情况及上述规定的各个类和谓语,分别定义R2RML映射文档,将存储在关系数据库表中的数据转换为RDF数据。书写映射文档,首先需定义R2RML的命名空间rr以及MeSH医学主题词表数据描述使用的命名空间ex及RDF语法模式的命名空间rdf、rdfs等。在映射文档中需要定义一系列RDF术语,如语言标签rr:language、数据类型rr:datatype等。根据R2RML映射模式将数据库中MeSH词表的所有映射文档分为4类。
4.2 一表对一表映射
即主题词表、副主题词表、补充概念记录词表、概念表等的基本属性表,其无需与其他表进行关联,现以term基本属性表为例。模式1:为表创建三元组映射,指定表名对应rr:logicalTable的值。在TriplesMap中使用rr:template创建rr:subjectMap来定义每一行的URI template,具有映射文档如下:
这是一个表映射的直接映射。对于表的本体类,用户可以在主语映射rr:subjectMap中利用rr:class为映射表设置相应本体类(如
4.3 一属性对一属性的映射
各MeSH词表中无需与其他列进行关联的各列的映射,如DateCreated、DateEstablished、DateRevised、HistoryNote等,现以treenumber表为例。模式2:给定一个TriplesMap,为该属性创建rr:predicateObjectMap,对于本体属性和rr:objectMap属性只有一个rr:predicate,具有映射文档如下:
这是属性映射的一个直接映射,可为各个属性自动生成一个唯一的本体属性。
4.4 两表之间含外键映射
MeSH中含外键的两表之间的映射,如主题词表、副主题表与概念表、术语表等之间的映射,主题词表、副主题表均含有外键PreferredConcept、PreferredTerm,现以concept表与term表之间的映射为例。模式3:给定两张表,一张表视为子类,另一张表则是父类。为每个表创建一个TriplesMap。给子类TripleMap创建一个rr:predicateObjectMap,除rr:predicate外还有一个rr:objectMap,其具有一个rr:parentTripleMap和一个rr:joinCondition。rr:parentTripleMap将指向父类TripleMap,rr:joinCondition将有一个rr:child和rr:parent,分别表示子表和父表中的连接属性。具有映射文档如下:
4.5 含外键的多表之间映射
模式4: 创建一个具有R2RML视图的TriplesMap,该视图由rr:logicalTable组成,rr:logicalTable包含一个rr:sqlQuery,其包含一个表示连接的SQL查询,其R2RML映射模式如下:
如果是两个表之间的映射可以使用模式4,但多个表之间的映射则必须使用模式4的SQL查询。模式4与模式3不同的是:模式3用户需要添加额外的三元组实例来映射连接两表的属性;而模式4用户是通过修改SQL查询来增加连接属性。
4.6 链接多个表之间的映射
模式5:为多对多表创建TriplesMap。指定rr:logicalTable,其值对应于多对多表的表名。在TriplesMap中使用rr:template创建一个rr:subjectMap,以定义多对多关系中一个表的URI template。创建一个rr:predicateObjectMap实例,其具有本体属性的rr:predicate。最后使用rr:template创建一个rr:objectMap来定义多对多关系的另一个表的URI template,具体如下:
5 系统实现
在进行数据转换的过程中通过调研和比较选择的编程语言是Java,数据库服务器使用MySQL,转换工具选择第3方工具DB2Triples。DB2Triples[13]是由Antidot公司开发的用于从关系型数据库中抽取数据并将其转换为RDF三元组存储的开源工具。其同时支持R2RML和Direct Mapping两种映射语言标准。DB2Triples支持数据实体化的映射实现方式,但不提供数据查询方式。实体化后的RDF图可以RDF/XML、 N3、N-Triples或Turtle格式进行序列化。在Direct Mapping模式下可选择使用来自SPARQL文件的查询以转换RDF图。根据上述书写好的R2RML映射规则,基于MySQL数据库和Java编程语言,利用DB2Triples实现RDB2RDF的转换。现以Descriptor表为例,简单介绍其数据转换过程:新建eclipse的工作区workplace和java project;将DB2Triples工具包导入eclipse。代码如下:
将上述映射文档descriptor1.ttl存储在java project中;运行descriptor1.java代码,输出RDF文件descriptor1.n3。其RDF片段如下:
6 结语
本文基于R2RML映射语言,利用R2RML Tool工具实现医学主题词表的RDF转换。无论关系数据库表结构如何都可以进行映射转换。关系数据库相较于XML格式的数据存储,其数据组织更加灵活。但正因如此原始的关系数据模型与RDF数据模型往往会存在不完全匹配的情况[13]。因此为达到更优的映射效果,不仅需要构建好的映射规则,在应用R2RML映射规则进行RDB2RDF数据转换之前不要受当前关系数据库表结构的局限,根据所映射的RDF实体之间的关系适当对原有关系表进行拆分和合并,重新进行数据建模,做好关系数据库的设计,构建好数据库的主外键关联关系,以通过R2RML标准映射规则的编写达到相对合适的转换要求,保证转换效果。
R2RML提供一种将关系数据库中数据结构映射为RDF数据模型的便捷方法,提高不同工具平台之间的互操作性,有利于促进RDF数据以及关联数据的产生和更广泛的应用。R2RML映射规则还存在一定的不可移植性以及非健壮性[14],如当关系数据库模式发生变化时R2RML映射文档基本需要重新映射和修改。