65.9K
CodeProject 正在变化。 阅读更多。
Home

Semantika DRM 入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (5投票s)

2014年6月23日

CPOL

8分钟阅读

viewsIcon

16040

downloadIcon

154

面向本体的数据访问和 Semantika 概念简介。

引言

这是我过去 9 个月开发的开源项目系列文章的第一篇。该项目本身是一个 Java 库,用于将传统的关系型数据库映射到领域模型,以创建无 SQL 的查询服务。第一篇文章将介绍面向本体的数据访问概念,然后概述 Semantika 及其主要组件。

在第二部分中,我将更详细地介绍映射模型和一些基本 API,以便开始使用该库。最后,在第三部分中,我将通过一个简短的“hello-world”教程来串联起这个项目的各个方面。

背景

这项工作背后的理论来自于计算逻辑的广泛研究。互联网上有许多过去和最近关于面向本体的数据访问的出版物供您搜索。我会在本文末尾提供一些作为阅读参考。在本文中,我将快速介绍该概念,省略其中的逻辑细节和理论。但是,我假设我的读者具备 Java 编程、关系数据库和 XML 的背景知识。了解本体(OWL)、RDF 和 SPARQL 等语义网技术是有益的,但并非必需。

什么是面向本体的数据访问?

但首先,什么是本体?本体在信息科学中(引自 Wikipedia.com):“本体是一种形式化的知识表示,[指定] 为一个领域内概念的层次结构,使用共享的词汇来表示这些概念的类型、属性和相互关系”。对于熟悉面向对象编程的人来说,本体与 UML 类图非常相似。实际上,两者具有相同的目的,即从概念角度对感兴趣的领域进行建模。然而,本体提供了更多以正式方式描述概念的功能。正式的意思是,描述中使用的每个字符串或符号都与特定的含义(或语义)和逻辑规则相关联。换句话说,本体类似于一本字典,里面充满了由其类和属性标签表示的单词。此外,这本“字典”可以被人类和机器共享和使用,以沟通数据。

为了让您有更好的理解,我举一个应用中的例子。下图显示了一个简单的人力资源领域本体。

应用时,通过引用“lastName”标签来获取每个员工的姓氏。其他不同(但相似)的标签,如“familyName”、“surname”或“cognome”,在使用时会触发错误。这些标签(或称领域词汇)提供了对所讨论主题的共享理解,消除了不同领域和语言之间的歧义。这是本体的一个关键方面。但是,我必须提到本体还有一个缺失且重要的方面,那就是本体可以承载知识。我将在稍后一个合适的时间解释这一点。

利用本体的这个基本思想,面向本体的数据访问(简称 OBDA)的含义是使用本体中列出的领域词汇来回答数据源的问题(或查询)。由于本体充当了一个高层全局模式,用户无需了解底层数据源的详细结构及其查询机制。这种抽象提供了数据访问的透明性。在系统上下文中,关于数据源的讨论将仅限于关系数据库。正如您稍后将遇到的,数据查询将不再使用 SQL 表达式,并且事先了解表名、列名和连接表达式是不必要的。

Semantika DRM

Semantika DRM(简称 Semantika)是一个用于 Java 应用程序的领域-关系映射和数据访问平台。它提供 SPARQL 语言的数据查询和检索功能。对于不熟悉 SPARQL(读作 sparkle)的人来说,它是一种用于 RDF 图数据的查询语言。如果您觉得这些术语陌生,不要担心,我们将在第三部分使用示例来介绍它们。

Semantika 本身是一个简单的 API。然而,最需要学习的是建模部分,特别是必需的资源——映射模型。总而言之,开发 Semantika 应用程序需要这三个组件:

  1. 运行中的数据库;
  2. 模型资源;
  3. 客户端 Java 代码。

运行中的数据库

这是显而易见的,因为 Semantika 是一个数据库数据访问平台。它在数据库表之上添加了一个语义层,以方便直观的查询。Semantika 使用 JDBC 适配器连接到不同的数据库引擎。目前,该平台支持 3 种数据库引擎,即 MySQL、PostgreSQL 和 H2。

模型资源

系统需要两种模型:领域模型(本体)和映射模型。Semantika 支持以 OWL/XML 格式读取本体文件。下面是人力资源本体的简化示例。

<Ontology>
    <Declaration>
        <Class IRI="Department"/>
    </Declaration>
    <Declaration>
        <Class IRI="Employee"/>
    </Declaration>
    <Declaration>
        <Class IRI="Manager"/>
    </Declaration>
    <Declaration>
        <Class IRI="Operational"/>
    </Declaration>
    <Declaration>
        <Class IRI="Technical"/>
    </Declaration>
    <Declaration>
        <ObjectProperty IRI="leads"/>
    </Declaration>
    <Declaration>
        <ObjectProperty IRI="memberOf"/>
    </Declaration>
    <Declaration>
        <DataProperty IRI="firstName"/>
    </Declaration>
    <Declaration>
        <DataProperty IRI="lastName"/>
    </Declaration>
    <Declaration>
        <DataProperty IRI="salaryAmount"/>
    </Declaration>
    <ObjectPropertyDomain>
        <ObjectProperty IRI="leads"/>
        <Class IRI="Manager"/>
    </ObjectPropertyDomain>
    <ObjectPropertyRange>
        <ObjectProperty IRI="leads"/>
        <Class IRI="Department"/>
    </ObjectPropertyRange>
    <ObjectPropertyRange>
        <ObjectProperty IRI="memberOf"/>
        <Class IRI="Department"/>
    </ObjectPropertyRange>
</Ontology>

我建议使用 Protege 作为您的本体编辑器。它有一个清晰的 GUI,可以从头开始开发本体。

下一个模型是映射模型。Semantika 配备了一种名为 Termal/XML 的原生 XML 映射格式。文档定义简单明了,使用任何常规文本编辑器都可以轻松编辑。下面是示例:

<program xmlns="http://www.obidea.com/ns/termal#"
   xmlns:tml="http://www.obidea.com/ns/termal#"
   xmlns:rr="http://www.w3.org/ns/r2rml#">
   <prefix tml:name="" tml:ns="http://obidea.com/ex/ontology/empdb#" />

   <uri-template tml:name="Department" tml:value="http://obidea.com/empdb/department/{1}" />
   <uri-template tml:name="Employee" tml:value="http://obidea.com/empdb/employee/{1}" />

   <mapping tml:id="TriplesMap1">
      <logical-table rr:tableName="EMPLOYEES"/>
      <subject-map rr:template="Employee(EMP_NO)"/>
      <predicate-object-map rr:predicate="birthDate" rr:column="BIRTH_DATE"/>
      <predicate-object-map rr:predicate="firstName" rr:column="FIRST_NAME"/>
      <predicate-object-map rr:predicate="lastName" rr:column="LAST_NAME"/>
      <predicate-object-map rr:predicate="gender" rr:column="GENDER"/>
      <predicate-object-map rr:predicate="hireDate" rr:column="HIRE_DATE"/>
   </mapping>
   <mapping tml:id="TriplesMap2">
      <logical-table rr:tableName="SALARIES"/>
      <subject-map rr:template="Employee(EMP_NO)"/>
      <predicate-object-map rr:predicate="salaryAmount" rr:column="SALARY"/>
   </mapping>
   <mapping tml:id="TriplesMap3">
      <logical-table rr:tableName="DEPARTMENTS" />
      <subject-map rr:class="Department" rr:template="Department(DEPT_NO)"/>
      <predicate-object-map rr:predicate="deptName" rr:column="DEPT_NAME"/>
   </mapping>
   <mapping tml:id="TriplesMap4">
      <logical-table rr:tableName="DEPT_EMP"/>
      <subject-map rr:template="Employee(EMP_NO)"/>
      <predicate-object-map rr:predicate="memberOf" rr:template="Department(DEPT_NO)"/>
   </mapping>
   <mapping tml:id="TriplesMap5">
      <logical-table rr:tableName="DEPT_MANAGER"/>
      <subject-map rr:class="Manager" rr:template="Employee(EMP_NO)"/>
      <predicate-object-map rr:predicate="leads" rr:template="Department(DEPT_NO)"/>
   </mapping>
</program>

其他支持的格式是 R2RML/Turtle 格式。这是 W3C 推荐的 RDB2RDF 映射规范的标准文档。但是,由于人们对 XML 的熟悉程度,我将在所有示例中使用 Termal/XML 格式。

请注意,在 Semantika 中,您可以选择在配置中不使用领域模型(或本体),而将领域词汇直接指定在映射模型中。

客户端 Java 代码

客户端代码是调用代码,是您的 Java 应用程序的一部分。API 非常简单,您只需要编写几行代码即可完成系统设置和查询执行。我将在第三部分向您展示一个客户端代码示例。

为什么这很重要?

这是一个有效的问题,值得一个令人信服的答案。我将通过三个要点来阐述开发此功能的动机,并向您展示一些可能符合您需求的应用场景。

  • 自助数据访问。 在数据密集型行业中,数据访问可能是一项艰巨的任务。例如,没有 IT 培训的工程师需要访问大量的企业数据存储来完成他们的工作。典型的解决方案是由 IT 部门以内部应用程序的形式提供一组预定义的查询,以处理大多数常见任务。但是,随着任务变得越来越复杂,该应用程序显然存在局限性,工程师自己编写新查询并非易事。此外,接下来可能会发生的情况是,IT 部门因工程师的请求而不堪重负,从而导致行业瓶颈。

    一个合适的解决方案是让工程师(或最终用户)能够自己进行数据访问。Semantika 提供了一个领域分层接口,它隐藏了数据模式,并将其简化到领域词汇的抽象级别,从而使数据查询成为一项直观的任务。

  • 以非侵入性解决方案应用新技术。最近,“大数据”和“语义网”等短语已成为 IT 界的热门词汇。已经提出了许多解决方案以实现更好的数据管理和提高性能。然而,许多这些解决方案需要将数据完全迁移到新平台,这既昂贵又充满风险。

    Semantika 提供了一种解决方案,它独立于现有数据基础设施,并且不触及记录数据本身。运行系统无需迁移或数据转换。这一特性使 Semantika 成为在完全转向新技术之前,首先尝试这些新技术选项的最佳选择。

  • 丰富数据库中的不完整信息。 这是 Semantika 与其他任何语义网解决方案的区别所在。如果您还记得我在前面关于本体可以承载知识的段落,那么现在是时候解释了。我将使用一个简单的用例。假设员工数据库包含关于职称是工程师助理工程师高级工程师的人员数据,并且本体提供了背景知识,规定这三个职称都属于技术人员,那么诸如“返回所有技术人员”之类的查询将返回一个非空结果,尽管数据模式中不包含明确引用技术人员的关联或属性。这个新的属性可以被注入到您现有的数据中,从而为查询添加更有意义的信息。

结论

阅读本文后您需要记住的重要事项

  • 有一个名为 Semantika 的优秀语义网 Java 库。
  • 本体对于共享您领域中的关键词很有用。将其视为人们用来沟通数据的书面字典。
  • 面向本体的数据访问为您提供了另一种直观查询数据库数据的解决方案。
  • Semantika 是非侵入性的,并且对您的宝贵数据没有风险。

延伸阅读

  • Calvanese, Diego, et al. "Ontology-based Database Access." SEBD. 2007. [PDF]
  • Poggi, Antonella, et al. "Linking data to ontologies." Journal on data semantics X. Springer Berlin Heidelberg, 2008. 133-173. [PDF]
  • Rodrıguez-Muro, Mariano, and Diego Calvanese. "Dependencies: Making ontology based data access work in practice." Proc. of the 5th Alberto Mendelzon Int. Workshop on Foundations of Data Management (AMW 2011). Vol. 749. 2011. [PDF]
  • Hannes Molsen 的一篇题为“Ontology Based Data Access”的论文。 [PDF]

历史

23-06-2014:

  • 原文

24-06-2014:

  • 修复图像 URL
© . All rights reserved.