1.什么是Jena?
官方描述:Apache Jena(或简称Jena)是一个用于构建语义Web和关联数据应用程序的自由和开源的Java框架。 该框架由不同的API组成,用于处理RDF数据
2.如何使用Jena?
步骤(一)
在pom.xml文件中引入jar包
<dependency>
<groupId>com.hp.hpl.jena</groupId>
<artifactId>jena</artifactId>
<version>2.6.4</version>
</dependency>
步骤(二)
启动下面的代码,会往数据库里新增7张表,其中rdf模型主要保存在jena_g1t1_stmt这张表中,具体表含义可自行百度
public class RDF2Mysql {
private static Logger log = LoggerFactory.getLogger(RDF2Mysql.class);
public static final String strDriver = "com.mysql.jdbc.Driver";
public static final String strURL = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&useSSL=false";
public static final String strUser = "root";
public static final String strPassWord = "root";
public static final String strDB = "MySQL";
public static final String PATH = "D:/test/testJena/r1.rdf";
public static final String MODILE_NAME ="MyOntology";
public static void main(String[] args) throws UnsupportedEncodingException {
try {
// 创建一个数据库连接
IDBConnection conn = getConnection(strURL, strUser, strPassWord,strDB);
// 加载数据库驱动类,需要处理异常
Class.forName(strDriver);
if(conn!=null){
log.debug("-------mysql数据库连接成功~");
}
//1.将本地保存到数据库中
// createModel(conn,"MyOntology",PATH);
//2.如何取出数据库中存储的本体
// OntModel model = getModelFromRDB(conn, MODILE_NAME);
// getTriples(model);
//3.读取Ontology所有的类和属性执行下面方法
OntModel model = getModelFromRDB(conn, MODILE_NAME);
getClasses(model);
//
} catch (RDFRDBException e) {
e.printStackTrace();
log.debug("RDFRDBException occur...");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.debug("ClassNotFoundException occur...");
}
}
/**
* 获取数据连接
* @param dbUrl
* @param dbUser
* @param dbPwd
* @param dbName
* @return
*/
public static DBConnection getConnection(String dbUrl, String dbUser, String dbPwd, String dbName) {
return new DBConnection(dbUrl, dbUser, dbPwd, dbName);
}
/**
* 读取ontology本体,创建模型,存储到RDB中
* @param conn
* @param name
* @param filePath
*/
public static void createModel(IDBConnection conn, String name,
String filePath) {
try{
// 使用数据库连接参数创建一个模型制造器
ModelMaker maker = ModelFactory.createModelRDBMaker(conn);
// 创建一个默认模型,命名为 MyOntology
Model defModel = maker.createModel(name);
// 准备需要存入数据库的本体文件,建立输入文件流
FileInputStream inputSreamfile = null;
try {
File file = new File(filePath);
inputSreamfile = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
log.debug("Ontology File is not available...");
}
InputStreamReader in = new InputStreamReader(inputSreamfile,"UTF-8");
// 读取文件
defModel.read(in, null);
// 关闭输入流读取器
in.close();
// 执行数据转换,将本体数据存入数据库
defModel.commit();
// 关闭数据库连接
conn.close();
log.debug("----ontology-store--database--success~");
} catch (RDFRDBException e) {
e.printStackTrace();
log.debug("RDFRDBException occur...");
} catch (IOException e) {
e.printStackTrace();
log.debug("IOException occur...");
} catch (SQLException e) {
e.printStackTrace();
log.debug("SQLException occur...");
}
}
/**
* 从数据读取OntModel
* @param con
* @param name
* @return
*/
public static OntModel getModelFromRDB(IDBConnection con,String name){
ModelMaker maker = ModelFactory.createModelRDBMaker(con);
//读取我们之前创建的MyOntology模型
Model model = maker.getModel(name);
//这里是指定的RDF格式
OntModelSpec spec = new OntModelSpec(OntModelSpec.RDFS_MEM);
OntModel ontModel = ModelFactory.createOntologyModel(spec,model);
return ontModel;
}
/**
* 获取数据库中的本体
* @param model
*/
public static void getTriples(OntModel model) {
StmtIterator stmIter = model.listStatements();
while (stmIter.hasNext()) {
Statement stmt = stmIter.nextStatement();
RDFNode object = stmt.getObject();
//主要为了判定RDFNode是Resource还是Literal
if (object instanceof Resource) {
log.debug(stmt.getSubject().getLocalName() + "--"
+ stmt.getPredicate().getLocalName() + "--"
+ object.asResource().getLocalName());
} else {
log.debug(stmt.getSubject().getLocalName() + "**"
+ stmt.getPredicate().getLocalName() + "**"
+ object.toString());
}
}
}
/**
* 读取Ontology的本体所有的类和属性
* @param model
*/
public static void getClasses(OntModel model) {
for (ExtendedIterator<OntClass> ei = model.listClasses(); ei.hasNext();) {
OntClass oc = ei.next();
System.out.println(oc.getLocalName());
for (ExtendedIterator<OntProperty> eip = oc
.listDeclaredProperties(); eip.hasNext();) {
OntProperty op = eip.next();
log.debug(op.getLocalName());
}
}
}
/**
* 输出类信息,
* @param model
*/
public static void printModel(OntModel model){
for (Iterator<OntClass> i = model.listClasses(); i.hasNext();) {
OntClass oc = i.next();
log.debug(oc.getLocalName());
}
}
}
步骤(三) r1.rdf
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#">
<rdf:Description rdf:about="http://somewhere/MattJones/">
<vCard:FN>Matt Jones</vCard:FN>
<vCard:N rdf:parseType="Resource">
<vCard:Family>Jones</vCard:Family>
<vCard:Given>Matthew</vCard:Given>
</vCard:N>
</rdf:Description>
<rdf:Description rdf:about="http://somewhere/RebeccaSmith/">
<vCard:FN>Becky Smith</vCard:FN>
<vCard:N rdf:parseType="Resource">
<vCard:Family>Smith</vCard:Family>
<vCard:Given>Rebecca</vCard:Given>
</vCard:N>
</rdf:Description>
<rdf:Description rdf:about="http://somewhere/JohnSmith/">
<vCard:FN>John Smith</vCard:FN>
<vCard:N rdf:parseType="Resource">
<vCard:Family>Smith</vCard:Family>
<vCard:Given>Jones</vCard:Given>
</vCard:N>
</rdf:Description>
<rdf:Description rdf:about="http://somewhere/SarahJones/">
<vCard:FN>Sarah Jones</vCard:FN>
<vCard:N rdf:parseType="Resource">
<vCard:Family>Jones</vCard:Family>
<vCard:Given>Sarah</vCard:Given>
</vCard:N>
</rdf:Description>
</rdf:RDF>