Jena学习笔记(2)——利用数据库保存本体
注明:本文档是使用Jena2.6.4,数据库为MySQL,数据库驱动版本为mysql-connector-java-5.1.13-bin.jar。
1 Jena的数据库接口
Jena提供了将RDF数据存入关系数据库的接口,Model、Resource、Query等接口可以用于访问和维护数据库里的RDF数据。在处理数据时,应用程序不必直接操作数据(而
是通过Jena的API),也不必知道数据库的模式。Jena提供了支持MySQL、HSQLDB、PostgreSQ、Oracle和Microsoft SQL Server的程序接口。有些第三方提供其他数据库接
口的支持。可以参考Jena数据库文档获得数据库版本以及对应的JDBC驱动说明。
2 Jena的数据库模式
关系数据库存储RDF数据的一般模式是“三元组”,表有三列(主体、谓词、客体)每个RDF陈述(sataement)占用一行。有时候,添加第四列以表示客体是字符常量还是
URI。Jena 2采用一种denormalized的三元组存储方法,是存储空间和访问时间的一种权衡方法(a space-time trade-off)。Jena使用两类七个表存储本体,第一类是
asserted statements,第二类reified statements。
Statement Tables 陈述表:
1) Asserted Statement Table (Jena_GiTj_Stmt):存储本体数据
2) Reified Statement Table (Jena_GiTj_Reif):经过处理的本体数据。System Tables 系统表:存储元数据和陈述表中使用的较长的文字或者资源
3) System Statement Table (Jena_Sys_Stmt):存储系统元数据
4) Long Literals Table (Jena_Long_Lit):存储陈述表中不便于直接存储的长字符创常量(Literals)
5) Long Resources Table (Jena_Long_URI):存储陈述表中不便于直接存储的长资源URI
6) Prefixes Table (Jena_Prefix):存储URI的前缀。前缀只存储一次,节省空间。
7) Graph Table (Jena_Graph):存储每一个用户图的名字和唯一标志符。
8) Lock Table (Jena_Mutex):一个没有内容的表。如果该表存在,在一定时间段里数据库被锁定。
可以参照\\Jena-2.6.4\doc\DB\layout.html获取各个表的详细信息。
3 创建本体的持久模型
Jena同时支持内存模型和数据库模型。一般来讲,创建内存模型只需要调用Jena的一些接口,但创建数据库模型,或者打开先前创建的模型,要求一些具体的步骤。
任何数据库的持久模型通过以下步骤创建:
1) 加载数据库JDBC驱动
2) 创建数据库连接
3) 为数据库创建一个ModelMaker
4) 为本体创建一个模型
4 将本体持久化存入MySQL中
1) 其中数据库的配置文件为:
jdbc.drivers=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/ontologies?useUnicode\=true&characterEncoding\=UTF-8
jdbc.username=root
jdbc.password=root
2) 实例类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException; import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.db.IDBConnection;
import com.hp.hpl.jena.db.RDFRDBException;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker; import edu.hrbeu.ontology.util.getDBPropeties; /**
* @purpose 本体数据库功能
* @author zhaohongjie
*
*/
public class OntologyDBImpl implements IOntologyDB { /**
* 数据库连接对象
*/
private IDBConnection conn = null;
/**
* 文件输入流对象
*/
private InputStreamReader in = null; /**
* 获取数据连接
* @return
*/
private IDBConnection getDBConn() { getDBPropeties getdb = new getDBPropeties(); try {
this.conn = new DBConnection(getdb.getUrl(), getdb.getUser(), getdb.getPassword(), "MySQL");
Class.forName(getdb.getClassDrive());
} catch (RDFRDBException e) {
System.out.println("Exceptions occur...");
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFoundException, Driver is not available...");
} return this.conn;
} /**
* 从数据流获取本体
* @param filePath
*/
public InputStreamReader getFileStream(String filePath) { FileInputStream inputSreamfile = null; try {
File file = new File(filePath); //"./Expert.owl"
inputSreamfile = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("Ontology File is not available...");
} try {
this.in = new InputStreamReader(inputSreamfile, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} return this.in;
} /**
* 将本体存入数据库
* @param ontoName
*/
public void toMySQL(String ontoName) {
ModelMaker maker = ModelFactory.createModelRDBMaker(getDBConn());
Model defModel = maker.createModel(ontoName); //"expert"
defModel.read(in,null);
defModel.commit();
closeDBResource();
} /**
* OntModelSpec
* @param maker
* @return
*/
private OntModelSpec getModelSpec(ModelMaker maker) { OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);
spec.setImportModelMaker(maker);
return spec; } /**
* 返回本体
* @param ontoName
* @return
*/
private OntModel getModelFromDB(String ontoName) { ModelMaker maker = ModelFactory.createModelRDBMaker(getDBConn());
Model base = maker.getModel(ontoName);
OntModel newmodel = ModelFactory.createOntologyModel(getModelSpec(maker), base);
return newmodel; } /**
* 获取本体对象
* @param ontoName
*/
public OntModel fromMySQL(String ontoName) { OntModel model = getModelFromDB(ontoName);
return model; } /**
* 关闭占用资源
*/
private void closeDBResource() {
closeFileStream();
closeDBConn();
} /**
* 关闭数据流
*/
private void closeFileStream() {
try {
this.in.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 关闭数据库连接
*/
public void closeDBConn() {
try {
if (this.conn != null) {
this.conn.close();
}
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
} }
3) mian函数
Jena学习笔记(2)——利用数据库保存本体的更多相关文章
- 在Jena框架下基于MySQL数据库实现本体的存取操作
在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据
机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...
- Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目
Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...
- SQLMAP学习笔记2 Mysql数据库注入
SQLMAP学习笔记2 Mysql数据库注入 注入流程 (如果网站需要登录,就要用到cookie信息,通过F12开发者工具获取cookie信息) sqlmap -u "URL" - ...
- matlab学习笔记4--MAT文件的保存和读取
一起来学matlab-matlab学习笔记4 数据导入和导出_1 MAT文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
- 【WPF学习笔记】之如何保存画面上新建的数据到数据库中并且删除画面上的数据和数据库的数据:动画系列之(五)
...... 承接系列四后续: 首先,我要在用户控件2中添加“保存”,“删除”按钮. XAML代码: <UserControl x:Class="User.uc_item" ...
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- Python学习笔记:利用爬虫自动保存图片
兴趣才是第一生产驱动力. Part 1 起先,源于对某些网站图片浏览只能一张一张的翻页,心生不满.某夜,冒出一个想法,为什么我不能利用爬虫技术把想看的图片给爬下来,然后在本地看个够. 由此经过一番初尝 ...
随机推荐
- Android中的消息通知(NotificationManager和Notification)
下面来谈谈notification,这个notification一般用在电话,短 信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这 ...
- 【C#进阶系列】10 属性
属性分为无参属性和有参属性(即索引器). 属性相对于字段的优点不仅仅是为了封装,还可以在读写的时候做一些额外操作,缓存某些值或者推迟创建一些内部对象,也适用于以线程安全的方式访问字段. 话说最基本的属 ...
- Titanium开发环境搭建第二个坑
1. build时总提示 --key-password <keypass> 参数没传,不填又说密码不对,填对了又说没传,应该是ide的问题,暂时不知怎样去设置该命令参数: 2. 继续去T ...
- php多版本管理phpenv
曾经有试过phpbrew的童鞋应该知道有多复杂 虽然这个好久没更新了,还是可以用的-- github:phpenv/phpenv 它的原理就是处理PATH变量,将你要求的php版本的路径加到PATH的 ...
- 一些经典===>>用SQL语句操作数据
用SQL语句操作数据 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言 ...
- 使用PowerQuery操作OData数据
Excel是我们耳熟的办公软件.PowerQuery是一个允许连接多种数据源的Excel插件.它能从一个网页上智能查询数据.使用PowerQuery能合并数据集使用join,merg ...
- Angularjs,WebAPI 搭建一个简易权限管理系统 —— WebAPI项目主体结构(四)
目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 5.0 WebAPI项目主体结构 5.1 总体结 ...
- StackOverflow Update: 560M Pageviews A Month, 25 Servers, And It's All About Performance
http://highscalability.com/blog/2014/7/21/stackoverflow-update-560m-pageviews-a-month-25-servers-and ...
- ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http
在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...
- 【干货分享】Node.js 中文资料导航
这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...