使用Jena将本体存入数据库

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>

总结:初次学习Jena,写的不对处望指出,共同进步!

发布了46 篇原创文章 · 获赞 42 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/102609893
今日推荐