关系到领域映射建模





5.00/5 (1投票)
这是关于 Semantika 的第二篇文章。本文将详细介绍 Semantika 中使用的映射模型。
引言
这是我最近开发的一个名为 Semantika 的开源项目的 3 部分系列中的第二篇文章。如果您还没有阅读第一篇文章,请跳转到下面的链接,并在阅读完毕后返回此处。
在本文中,我将介绍 Semantika 使用的关系到域映射建模概念及其语言特性。语言语法将采用 Termal/XML 格式。请注意,可以从 Termal 文档生成等效的 R2RML 文档,反之亦然。
背景
我假设我的读者在 Java 编程、关系数据库和 XML 方面有一些基础。了解 OWL、RDF 和 SPARQL 等语义 Web 技术将是有益的,但并非必需。
基本概念
域到关系映射的概念可以粗略地理解为一种形式规范,它定义了域词汇和数据库中的数据模式之间的关系。它用于将数据库中的数据映射到本体中的类实例和属性。概念上来说,映射模型包含一个公式,当应用该公式时,可以为源表或 SQL 视图中的每一行生成对象实例。
为了说明,假设我有如下表中的员工数据。
EMP_NO | BIRTH_DATE | FIRST_NAME | LAST_NAME | GENDER | HIRE_DATE |
---|---|---|---|---|---|
10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
使用上述映射模型,该模型能够生成如下所示的等效对象实例。
在 Semantika 中,每个映射语句称为一个 **映射公理 (mapping axiom)**。这些公理通过将每个查询部分转换为本机 SQL 查询字符串来帮助回答用户查询。然后,查询执行将转到底层数据库引擎并返回结果。
语言特性
Semantika 使用 XML 文档来读取映射语句。文档定义很简单,易于手动编辑。如果您熟悉 R2RML 规范,那么本节只是一个简单的演练。如果您不熟悉,这只是关于文档配置的另一种介绍。
下面是 Termal/XML 格式的映射文档示例。绿色项目符号是将在后面进行注释的部分。
1. 前缀 (Prefix)
前缀用于简化编写长名称的格式。通常,前缀的命名空间使用 URI 字符串以保证其唯一性。例如,而不是编写像
http://obidea.com/ex/ontology/work#Employee
http://obidea.com/ex/ontology/work#lastName
您可以通过指定 emp
前缀引用 http://obidea.com/ex/ontology/work#
的 URI 命名空间,来简化为 emp:Employee
和 emp:lastName
。
请注意,上面的示例使用了空前缀。这是一个定义 **默认前缀 (default prefix)** 的特殊概念。这意味着如果资源名称没有指定前缀,则假定使用默认前缀。
2. URI 模板 (URI Template)
URI 模板是构建对象标识符的全局定义,并且高度可重用。它由一个名称和一个模板字符串组成。模板字符串具有特殊的语法,通过将整数放在大括号 (“{” 和 “}”) 中来引用列。任何映射都可以通过 **模板调用 (template call)** 使用特定的 URI 模板。
下面的示例定义了一个名为“Employee”的 URI 模板和一个包含两个列引用的模板字符串。主语映射 (subject-map) 使用 DEPT_NO 和 EMP_NO 列作为标识符组件进行了模板调用。
<uri-template tml:name="Employee"
tml:value="http://obidea.com/ex/ontology/work?department={1}&employee={2}>
<mapping>
...
<subject-map rr:template="Employee(DEPT_NO,EMP_NO)"/>
</mapping>
您应该注意到,这种方法类似于编程范式中的函数调用,其中函数名与模板名相关联,而参数是列引用。
3. TriplesMap (示例 1)
在我们深入研究每个示例案例之前,请允许我简要介绍 TriplesMap 中的几个重要元素。
A. 逻辑表 (Logical Table)
logical-table 元素的內容代表将映射到对象实例的数据行。指定逻辑表有两种方法:
- 使用
rr:tableName
属性来指定用于映射的 SQL 表。该值必须是有效的模式限定名称,指向输入数据库中存在的表或视图。 - 编写 SQL 查询以选择用于映射的特定数据区域。查询字符串必须是有效的 SQL 语言 SELECT 查询,可以在输入数据库上执行。
B. 主语映射 (Subject Map)
主语映射 (subject-map) 的作用是为逻辑表中的每一行分配一个对象标识符。该映射可以有一个类 IRI(即由 rr:class
属性表示)来显式声明对象类型。
C. 谓语对象映射 (Predicate Object Map)
谓语对象映射 (predicate-object-map) 用于将类属性或关系映射到逻辑表中的特定列。请注意,属性和关系是两个不同的概念,即 **属性 (attribute)** 与类型化值相关联,而 **关系 (relation)** 与对象引用相关联,由对象标识符表示。
回到示例案例,第一个映射向您展示了一个用于捕获员工配置文件的简单映射模型。
<mapping>
<logical-table rr:tableName="EMPLOYEES"/> (1)
<subject-map rr:class="Employee" rr:template="Employee(EMP_NO)"/> (2)
<predicate-object-map rr:predicate="firstName" rr:column="FIRST_NAME"/> (3)
<predicate-object-map rr:predicate="lastName" rr:column="LAST_NAME"/> (4)
<predicate-object-map rr:predicate="hireDate" rr:column="HIRE_DATE"/> (5)
</mapping>
第 (1) 行指定 EMPLOYEES 表用作映射数据源。
第 (2) 行指示 Employee(EMP_NO) 用于标识 EMPLOYEES 表中的行,并且所有生成的实例都属于 Employee
类。
第 (3)、(4)、(5) 行指定了 Employee
类的几个属性映射。
4. TriplesMap (示例 2)
第二个映射向您展示了一个 **关系 (relation)** 映射的示例。
<mapping>
<logical-table rr:tableName="DEPT_EMP"/> (1)
<subject-map rr:template="Employee(EMP_NO)"/> (2)
<predicate-object-map rr:predicate="worksIn" rr:template="Department(DEPT_NO)"/> (3)
</mapping>
第 (1) 行指定 DEPT_EMP 表用作映射数据源。
第 (2) 行指示 Employee(EMP_NO) 用于标识 DEPT_EMP 表中的行。但是,生成的实例将没有类型。
第 (3) 行指定了一个 worksIn
关系,该关系介于由 Employee(EMP_NO) 标识的对象和由 Department(DEPT_NO) 标识的另一个对象之间。
5. TriplesMap (示例 3)
第三个映射向您展示了使用 SQL 查询作为逻辑表的示例。
<mapping>
<logical-table> (1)
<![CDATA[ (2)
select EMP_NO (3)
from TITLES (4)
where TITLE = 'Staff']]> (5)
</logical-table> (6)
<subject-map rr:class="Staff" rr:template="Employee(EMP_NO)"/> (7)
</mapping>
第 (1)-(6) 行指定了用作映射数据源的 SQL 查询。该查询返回所有职位为“Staff”的员工。
第 (7) 行指示 Employee(EMP_NO) 用于标识 SQL 查询返回的行,并且所有生成的实例都属于 Staff
类。
结论
我希望我以一种清晰易懂的方式传达了这篇文章,让所有读者都能轻松理解映射模型的基本用法。根据您的领域复杂性和数据模式大小,开发映射模型可能是一项具有挑战性但最终有益的任务。此外,映射模型的形状会影响查询性能。(也许我会在另一篇文章中介绍一些技巧和窍门)。
因此,总结本文:
- 定制映射模型需要对领域和数据库都有深入的理解。
- 将映射模型视为公司资产。它是一种知识资产,指定了您的业务领域与数据之间的联系。
- 掌握了映射模型,就相当于学会了 Semantika 的 80%。
请访问 http://obidea.com/semantika 下载 API。我期待您对映射模型的问题、反馈或评论。您可以通过我的电子邮件地址 josef [dot] hardi [at] gmail [dot] com 与我联系,或参与我们的 用户社区。
历史
24-06-2014:
- 原文