基于关系型数据库的本体持久化

关系型数据库技术成熟、使用广泛,支持工具丰富而功能强大,数据存储、查询效率高,因此在语义数据存储尚未成熟、无有效工具出现时,很自然地被广泛应用于本体数据的存储。由于本体模型和关系模型的差异,基于关系型数据库的本体存储存在多种模式(李曼等, 2005):

(1) 水平模式
      该模式在数据库中只用一张表来表示本体,表中列为本体的属性,表中的一个记录对应本体中的每个实例。由于在本体的更新、进化过程中,本体属性数量和名称都可能发生变化,且并非所有实例都具有相同属性。因此,此模式数据表列需要经常变化,且存在大量空值,只适用于小规模的静态的本体。
(2) 垂直模式
     这种模式只包含一张三元组表,表中每个记录对应一个三元组,用三元组的形式来描述本体全部信息。此模式结构稳定,但是可读性差,难以构造SQL以进行查询,不利于本体应用。

(3) 分解模式
       基本思想是将数据库进行模式分解。现有的分解模式的方法中,第一种是基于类的分解模式,即以类名为表名,类的属性为表的列,为本体中的每个类都创建一张单独的表;另外一种是基于属性的分解模式,即以属性名为表名,表中包含两列,分别代表RDF 中的Subject 和Object,为本体中的每个属性创建一张单独的表。此模式需随着本体的更新、修改不断新建、删除数据表,效率低,代价大,也不利于本体的应用。

(4) 其他模式
      包括将上述几种模式混合使用的混合模式和将OWL 描述词汇映射为数据表以存储存在此关系的本体资源、提高查询效率的模式等。

语义网开发框架Jena 的SQL 数据库引擎SDB 采用一种混合模式,将本体内容存储到4 个相互关联的数据表中:节点表nodes、前缀表prefixes、四元组表quads 和三元组表triples。SDB 将本体视为图(Graph)的集合,RDF 中的Subject、Predicate 和Object 都是图中的结点,一个数据集可以有多个图。因此,顾名思义,nodes 存储本体中的结点,其列记录结点数据类型、语言等基本的属性;prefiexes 存储本体中定义的前缀;quads 存储命名图(Named Graph)和对应的RDF 记录;triples 存储RDF 三元组,其值为nodes 表中的主键值,实例属性和关系全部采用s-p-o(subject、predicate 和object)形式表达。SDB 模式表结构稳定、以一定的存储空间代价换取较高的数据增删改查效率,是一种较为优秀的本体关系数据库存储模式。

SDB 中存在“layout2/hash”和“layout2/index”两种主要的表模式,其区别是:“layout2/index”模式中的nodes 表以“id”列为主键,以“hash”列为索引;而“layout2/hash”没有“id”列,以“hash”列为主键。SDB 数据库连接信息、布局模式等内容可以在SDB 的配置文件(如下)中进行指定。

# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
# 前缀定义
@prefix sdb:     <http://jena.hpl.hp.com/2007/sdb#> .
@prefix rdfs:     <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .

<#store> rdf:type sdb:Store ;
    sdb:layout         "layout2" ; # "layout2", "layout2/hash" or "layout2/index"
    sdb:connection     <#conn> ;
.
<#conn> rdf:type sdb:SDBConnection ;
    sdb:sdbType        "postgresql" ; # "oracle", "postgresql", "mysql"
    sdb:sdbHost        "localhost";#"localhost:1521";# 地址,可加端口 :port
    sdb:sdbName        "sdb_test";
    sdb:sdbUser        "user";
    sdb:sdbPassword    "pw";
    sdb:driver         "org.postgresql.Driver" ;#"oracle.jdbc.driver.OracleDriver";# 数据库驱动

采用配置文件设置数据库连接信息之后,采用如下方法读取本体文件并存储到数据库相应数据表中。

String file = "src/main/resources/CCS.owl";//本体文件地址

// 连接数据库,使用配置文件
Store store = SDBFactory.connectStore("src/main/resources/sdb-pgsql.ttl");
// 创建数据库表
store.getTableFormatter().create();

Model model = SDBFactory.connectDefaultModel(store);

// 读取owl文件到model中
try{
    FileManager.get().readModel(model, file, "OWL");
}
catch (Exception e){
    throw new IllegalArgumentException("文件不存在!");
}
// System.out.println(model.size());

// 关闭连接和储存,释放资源
store.getConnection().close();
store.close();

SDB 中的三元组表只记录结点的hash 或id 值,可读性差,难以直接构造SQL语句进行查询。但实际上SDB 设计目也不在于基于传统SQL 语句的本体查询,而是作为Jena 框架的关系数据库引擎,实现本体持久化存储。本体数据的查询则借助于Jena 的查询组件,使用本体查询语言SPARQL 实现。SDB 中利用SPARQL 语句实现本体查询的具体算法如下所示:

String queryString = "Select * {?s ?p ?o}";
Store store = SDBFactory.connectStore(ttl); //连接数据库,使用配置文件
Query query = QueryFactory.create(queryString); // 创建查询
Dataset dataset = DatasetStore.create(store);
QueryExecution qe = QueryExecutionFactory.create(query, dataset);
ResultSet resultSet = qe.execSelect();
ResultSetFormatter.out(resultSet); //控制台格式化输出查询结果
qe.close(); //关闭查询
store.getConnection().close(); //关闭连接
store.close();

                              ——摘自《地学数据时间本体及其在语义检索中的应用——以地质年代本体为例》

时间: 2024-10-04 10:57:56

基于关系型数据库的本体持久化的相关文章

在Jena框架下基于MySQL数据库实现本体的存取操作

在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统.其中对本体的操作部分,我使用的是Jena框架:数据模型是基于本体的语义模型:数据存储则是MySQL 5.5.9版本.由此看来,将本体模型存入数据库和从数据库中取出模型是常用的操作,这里总结一下我学到的方法. 我使用的开发环境是Eclipse3.6,在开发前要将必要的与jena有关的类包加入java

Linux FTP服务器的搭建与配置+基于关系型数据库实现用户认证

一.服务器端的安装: yum install vsftpd 1)查看安装后生成的哪些文件 [[email protected] ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd  <==========主志日志文件 /etc/pam.d/vsftpd<==================认证文件 /etc/rc.d/init.d/vsftpd<=============服务脚本 /etc/vsftpd<======================

非关系型数据库(NoSQL)——Redis安装及部署详解

在现在的互联网大潮中,NoSQL可谓是家喻户晓,Redis作为NoSQL中及其重要的一员,使我们走向架构道路的一条必经之路.作为运维工程师来说,是必须要掌握的! 既然提到了Redis数据库是非关系型数据,并且需要掌握Redis数据库.那么关于关系型数据库与非关系型数据库的基本概念是必须要了解的. 一.关系型数据库与非关系型数据库的基本概念: 数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库,我们统称为非关系型数据库. 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关

图数据库与关系型数据库的区别与联系

最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数据库所难以解决的一系列问题.通常情况下,这些NoSQL数据库分为Graph,Document,Column Family以及Key-Value Store等四种.这四种类型的数据库分别使用了不同的数据结构来记录数据.因此它们所适用的场景也不尽相同. 其中最为特别的便是图形数据库了.可以说,它和其它的

关系型数据库同步

1).全量同步 比如从oracle数据库中同步一张表的数据到Mysql中,通常的做法就是分页查询源端的表,然后通过数据库引擎批量(比如JDBC)插入到目标表,这个地方需要注意的是,分页查询时,一定要按照主键id来排序分页,避免重复插入. 2).基于数据文件导出和导入的全量同步,这种同步方式一般只适用于同种数据库之间的同步,如果是不同的数据库,这种方式可能会存在问题. 3).基于触发器的增量同步 增量同步一般是做实时的同步,早期很多数据同步都是基于关系型数据库的触发器trigger来做的. 使用触

Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列

Atitit.提升软件稳定性---基于数据库实现的持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1. 用一个游标last 来指示 (指针表字段last ),麻烦的,不推荐 1 1.2. (简单,推荐)使用循环次数来指示,每循环加1   (字段cirTimes),order by cirtimes 1 4. 表格设计id, cirTimes,createtime,handlerID,recID,d

基于分布式关系型数据库,实现轻松应对百亿级数据分析场景解决方案

MyCat是什么? 从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库读写分离,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里.也可以指定多个写库多个读库. MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端

基于spark的关系型数据库到HDFS的数据导入

package com.shenyuchong; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession; import java.net.HttpURLCon

写给开发者看的关系型数据库设计

目录 一 Codd的RDBMS12法则——RDBMS的起源 二 关系型数据库设计阶段 三 设计原则 四 命名规则 数据库设计,一个软件项目成功的基石.很多从业人员都认为,数据库设计其实不那么重要.现实中的情景也相当雷同,开发人员的数量是数据库设计人员的数倍.多数人使用数据库中的一部分,所以也会把数据库设计想的如此简单.其实不然,数据库设计也是门学问. 从笔者的经历看来,笔者更赞成在项目早期由开发者进行数据库设计(后期调优需要DBA).根据笔者的项目经验,一个精通OOP和ORM的开发者,设计的数据