导入本体到Jena TDB数据库
本体的存储方法或称本体持久化,大致分为基于内存的方式、基于文件的方式、基于数据库的方式和专门的管理工具方式4种(傅柱等, 2013)。其中,基于数据库的方式又有基于关系数据库、基于面向对象数据库、基于Native XML数据库和基于NoSQL的三元组数据库(Triple Store)4种主要方式。基于数据库的本体持久化方式充分利用了数据库的安全可靠(数据保密、数据完整性、并发控制、故障恢复等)、高效、易于管理并易于与应用系统集成等优点,是主要的本体持久化方式。
在本体中,数据被表示为一系列由主语(subject)、谓词(predicate)和宾语(object)组成的陈述(statement),即三元组(triple)的集合。基于关系数据库的本体持久化使用二维表对本体的三元组进行处理,不可避免地需要对本体中的复杂关系进行不自然的分解,而查询时又需要将基于图的查询转换为关系查询(傅柱等, 2013) ,需要进行大量的关联、连接操作,因而,现有基于关系数据库的本体存储方法都存在大规模存储、更新、修改和查询效率低、数据库操作代价大等问题(李勇和李跃龙, 2008)。因此,效率、性能更优越的专门或扩展了RDF存储、查询甚至推理能力的非关系型三元组数据库(Triple Store,或称图数据库),如GraphDB (OWLIM) [1]、Virtuoso Universal Server[2]、AllegroGraph[3]、Jena TDB(Triple DB)等(Rohloff et al., 2007)目前已逐渐成为本体存储主流工具。本文采用基于Jena TDB的方式。
TDB存储的本体数据集由node表、Triple和Quad索引、prefixes表组成,存放在指定的文件系统目录下。TDB采用B+树维护三种基本形式的Triple索引:SPO、POS和OSP(S、P、O分别代表Subject、Predicate和Object)。若存在命名图(Named Graph),则同时维护相应的Quad索引(G表示Graph):GOSP、SPOG、GSPO、OSPG、GPOS和POSG。

如上图所示,本体应用程序首先通过URI(Uniform Resource Identifier)地址映射文件实现本体URI与其对应的本体模块文件存放的文件系统地址的映射,然后使用自定义的Java类TDBPortal通过程序或配置文件读取各本体模块文件持久化到TDB。TDB中数据可通过TDBPortal实现增删改查操作,和进一步应用于本体查询与推理等操作;或作为SPARQL(SPARQL Protocol and RDF Query Language)服务器Jena Fuseki的数据源,对外提供基于HTTP的SPARQL查询服务。
下面介绍TDBPortal
package cn.geodata.ont.tdb; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.apache.commons.lang3.StringUtils;
import org.apache.jena.riot.RDFDataMgr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import cn.geodata.ont.file.OntFile; import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.ReadWrite;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.tdb.base.file.Location; /**
* @TODO TDB CRUD操作,包含事务
* @author Zhiwei HOU
* @date 2015年12月2日
*/
public class TDBPortal
{
final static Logger logger = LoggerFactory.getLogger(TDBPortal.class); // 必须close
Dataset ds = null; /**
* 连接TDB
*
* @param tdbPath TDB目录或配置文件tdb-assembler.ttl路径. tdbPath可以通过配置文件进行设置
* @param useAssemblerFile 是否使用配置文件连接
*/
public TDBPortal(String tdbPath, boolean useAssemblerFile)
{
if (!useAssemblerFile)
{
Location location = Location.create(tdbPath);
ds = TDBFactory.createDataset(location);
}
else
ds = TDBFactory.assembleDataset(tdbPath);
} public TDBPortal(String tdbPath)
{
Location location = Location.create(tdbPath);
ds = TDBFactory.createDataset(location);
} /**
* 往模型中添加内容。不载入引用本体
*
* @param modelUri 本体的uri
* @param sourcePath 本体文件实际地址
* @param override 是否覆盖
* @return
* @Houzw at 2016年4月1日下午11:36:13
*/
public int loadModel(String modelUri, String sourcePath, Boolean isOverride)
{
Model model = null;
ds.begin(ReadWrite.WRITE);
try
{
if (ds.containsNamedModel(modelUri))
{
if (isOverride)// 覆盖
{
removeModel(modelUri);//只是移除地址,实际数据不会移除
loadModel(modelUri, sourcePath, false);
}
}
else
{
model = ds.getNamedModel(modelUri);// 没有则创建一个,model不会为null
model.begin();
RDFDataMgr.read(model, sourcePath);
model.commit();
}
// 已有,但是不覆盖,则直接返回
ds.commit();
logger.info("本体模型数据已经导入");
return 1;
}
catch (Exception e)
{
return 0;
}
finally
{
if (model != null)
model.close();
ds.end();
}
} /**
* 导入本体。OntModel不支持事务。同时载入引用本体
*
* @param modelUri 模型uri
* @param sourcePath 本体文件(集成文件)地址
* @param override 是否覆盖
* @return
* @Houzw at 2016年4月1日下午11:36:09
*/
public int loadOntModel(String modelUri, String sourcePath, Boolean isOverride)
{
OntModel model = ModelFactory.createOntologyModel();// 不支持事务
ds.begin(ReadWrite.WRITE);
try
{
if (ds.containsNamedModel(modelUri))
{
if (isOverride)// 覆盖
{
removeModel(modelUri);
loadOntModel(modelUri, sourcePath, false);
}
}
else
{
model = OntFile.loadOntModelWithLocMapper(sourcePath);//导入本体文件
ds.addNamedModel(modelUri, model); }
// 已有,但是不覆盖,则直接返回
ds.commit();
System.out.println(modelUri + " 已导入");
logger.info(modelUri + " 已导入");
return 1;
}
catch (Exception e)
{
System.out.println(e.getLocalizedMessage());
logger.error(e.getLocalizedMessage());
return 0;
}
finally
{
ds.end();
}
} public Model getDefaultModel()
{
ds.begin(ReadWrite.READ);
Model model;
try
{
model = ds.getDefaultModel();
ds.commit();
}
finally
{
ds.end();
}
return model;
} /**
* 获取指定模型
*/
public Model getModel(String modelUri)
{
Model model = null;
ds.begin(ReadWrite.READ);
try
{
model = ds.getNamedModel(modelUri);
}
finally
{
ds.end();
}
return model;
} public void loadDefaultModel(String sourcePath)
{
Model model = null;
ds.begin(ReadWrite.WRITE);
try
{
model = ds.getDefaultModel();
model.begin();
if (!StringUtils.isBlank(sourcePath))
RDFDataMgr.read(model, sourcePath);
model.commit();
ds.commit();
}
finally
{
if (model != null)
model.close();
ds.end();
}
} public void removeModel(String modelUri)
{
if (!ds.isInTransaction())
ds.begin(ReadWrite.WRITE);
try
{
ds.removeNamedModel(modelUri);
ds.commit();
System.out.println(modelUri + " 已被移除");
logger.info(modelUri + " 已被移除");
}
finally
{
ds.end();
}
} /**
* 列出所有模型的uri
*/
public List<String> listModels()
{
ds.begin(ReadWrite.READ);
List<String> uriList = new ArrayList<>();
try
{
Iterator<String> names = ds.listNames();// DefaultModel没有name
String name = null;
while (names.hasNext())
{
name = names.next();
uriList.add(name);
}
}
finally
{
ds.end();
}
return uriList;
} /**
* 必须关闭TDB连接
*/ public void close()
{
ds.close();
}
}
以上简单介绍了基于Jena TDB的本体存储。目前我对AssemblerFile配置文件的配置还没有深入的研究,了解的朋友可以告诉我,O(∩_∩)O谢谢
——————————————————————————————————————
补充:
TDB 也提供了命令行的方式导入本体数据,具体参考官方文档或参考http://blog.csdn.net/rk2900/article/details/38342181
水平有限,错误难免,多指教。TDB 的具体内容可查阅其官方文档
[1] http://ontotext.com/products/graphdb/
[2] http://www.openlinksw.com/
[3] http://franz.com/
导入本体到Jena TDB数据库的更多相关文章
- Jena TDB 101 Java API without Assembler
Update on 2015/05/12 ongoing tutorials site on https://github.com/zhoujiagen/semanticWebTutorialUsin ...
- Jena TDB 102
1 Introduction TDB is a RDF storage of Jena. official guarantees and limitations TDB support full ra ...
- Jena TDB assembler syntax
1 introduction Assembler is a DSL of Jena to specify something to build, models and dataset, for exa ...
- paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
paip.导入数据英文音标到数据库mysql为空的问题之道解决原理 #---原因:mysql 导入工具的bug #---解决:使用双引号不个音标括起来. 作者 老哇的爪子 Attilax 艾龙, E ...
- 一、导入、导出远程Oracle数据库
一.导入.导出远程Oracle数据库 其语法实示例如下: imp/exp [username[/password[@service]]] 其中service是服务实例名,关于如何创建服务实 ...
- paip.将数据导入到在英语语音数据库mysql道路解决空原则问题
paip.将数据导入到在英语语音数据库mysql道路解决空原则问题 #---原因:mysql 导入工具bug #---解决:不要使用双引号括注音. 笔者 老哇爪 Attilax 艾龙. EMAIL: ...
- EXCEL导入GridView,然后再汇入数据库.
原文:EXCEL导入GridView,然后再汇入数据库. 近日项目中有一个多笔料号要输入,我做了一个用javascript复制输入框的功能,可以输入多笔料号. 但是使用者反馈,料号太多,可能几百个料号 ...
- 【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中
[exp/imp]将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后 ...
- (转)如何将 Excel 文件导入到 Navicat for MySQL 数据库
场景:工作中需要统计一段时间的加班时长,人工统计太过麻烦,就想到使用程序实现来统计 1 如何将 Excel 文件导入到 Navicat for MySQL 数据库 Navicat for MySQL ...
随机推荐
- bootstrap+Ajax+SSM(maven搭建)表单增删改查
前后端分离,前端利用ajax调用后端API接收json数据,进行表单的增删改查 软件架构 IDE:IDEA 数据库:mysql jdk:1.8 tomcat:9 后端:springmvc,mybati ...
- NSURLSession学习笔记(一)简介
一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain ...
- shell编写总结
变量引用 $(VAR): 会将VAR当做一条命令来执行 '$VAR': 单引号中包含的变量, 不会被引用, 仍然输出$VAR "$VAR": 双引号中包含的变量, 会被引用成$VA ...
- 从数据库导出数据到excel之List<map>导出
说明:很多时候取出来的数据是封装为List<Map<String,Object>>,可以直接导出excel表格 项目说明就在 “上一篇” 直接上代码(数据层和业务层不用说了,查 ...
- web 前端 html
1,什么是web 在网络中,大量的数据需要有一个载体,而很多人都能够访问这个载体,利用浏览器的这个窗口链接一个有一个载体,这个载体就是网站也就是web的前身. 1,web标准:结构标准,表现标准,行为 ...
- CF 1093G Multidimensional Queries——线段树(消去绝对值符号)
题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝 ...
- happynear_caffe编译时,缺少头文件caffe.pb.h的问题
由于一些问题,需要编译caffe 的windows版本,用的是happynear的caffe版本,在caffe.pb.h遇到了问题 如何生成 caffe.pb.h 将protobuf 里的 proto ...
- ORACLE用户的加锁、解锁
在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用户解锁的操作方法,通过几条简单的解锁语句就能完成此项工作.下面是具体的过程: 默认的scott用户是 ...
- JVM内存管理之GC算法精解(五分钟教你终极算法---分代搜集算法)
引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...
- Oracle数据库clob字段导出为sql insert插入语句
oracle数据库的clob字段导出为sql insert插入语句可以分三种情况:1,clob没有换行符:2,clob有换行符但不以分号结尾:3,clob有换行符并且以分号结尾. clob没有换行符使 ...