以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  向高手求救:如何将创建好的本体数据导入MySQL中[求助]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=84284)


--  作者:白色闪电
--  发布时间:4/13/2010 5:18:00 PM

--  向高手求救:如何将创建好的本体数据导入MySQL中[求助]
大家好!
请问如何将创建好的本体数据导入MySQL中,请求 详细的导入方法,谢谢!
--  作者:Avansky
--  发布时间:4/13/2010 10:20:00 PM

--  
在Myeclipse中实现Jena
可以在Jena的主页(http://jena.sourceforge.net/downloads.html)下载Jena的最新版本,目前是Jena2.4版本。Jena是Java API,所以需要Java运行环境。本文使用的是jdk1.5.0_04和Eclipse3.2。
1)将下载的Jena-2.4.zip解压到任意路径,解压之后生成Jena2.4文件夹,将Jena2.4\lib下的jar文件全部加入CLASSPATH,这样就可以在任意的Java编辑器中调用Jena API了。在解压目录下有一个test.bat文件,用于配置的测试。在控制台运行此程序,如果你的配置正确,测试将顺利完成。
2)如果使用Eclipse,则可以通过修改工程的Java创建路径的方法导入Jena jar文件。在Eclipse下创建Java工程(eg:OWL_SQL.java),右健单击工程名字,选择“属性/Properties”,在打开的对话框中选择“Java创建路径/Java Build Path”,在右边标签中选择“库/Libraries”,之后选择“添加外部文件/Add Extenal JARs”,找到Jena2.4\lib目录下的所有jar文件并将其添加到工程。这样就可以运行Jean文档中的例子了。
3)在Eclipse中用同样的方法导入mysql-connector-java-5.0.8-bin.jar到工程OWL_SQL.java中。
import java.io.*;
import java.sql.SQLException;
import com.hp.hpl.jena.db.*;
import com.hp.hpl.jena.rdf.model.*;

public class OWL_SQL1{
     public static final String strDriver ="com.mysql.jdbc.Driver"; // path of driver class
     public static final String strURL ="jdbc:mysql://localhost:3306/avan"; // URL of database
     public static final String strUser ="root"; // database user id
     public static final String strPassWord ="root"; // database password
     public static final String strDB="MySQL"; // database type

     public static void main(String[] args){
         try{// 创建一个数据库连接
              IDBConnection conn = new DBConnection ( strURL, strUser, strPassWord, strDB );
            // 加载数据库驱动类,需要处理异常
              try{
                   Class.forName(strDriver);
              }catch(ClassNotFoundException e) {
                   System.out.println("ClassNotFoundException, Driver is not available...");
              }
            // 使用数据库连接参数创建一个模型制造器
              ModelMaker maker = ModelFactory.createModelRDBMaker(conn);
              // 创建一个默认模型,命名为 MyOntology
              Model defModel = maker.createModel("TNB");
              // 准备需要存入数据库的本体文件,建立输入文件流
              FileInputStream inputStreamfile = null;
              try {
                   File file = new File("D:\\Program Files\\Protege_3.1\\TNB.owl");
                   inputStreamfile = new FileInputStream(file);
              } catch (FileNotFoundException e) {
                   e.printStackTrace();
                   System.out.println("Ontology File is not available...");
              }
              InputStreamReader in = null;
              try {
                   in = new InputStreamReader(inputStreamfile, "UTF-8");
              } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
              }
            // 读取文件
            defModel.read(in,null);
            // 关闭输入流读取器
            try {
                   in.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
              // 执行数据转换,将本体数据存入数据库
            defModel.commit();
            // 关闭数据库连接
              try {
                   conn.close();
              } catch (SQLException e) {
                   e.printStackTrace();
              }
         }catch(RDFRDBException e){
              System.out.println("Exceptions occur...");
         }
     }
}

二,Jena Ontology API
Jena2.4的Ontology API包含在ontology包(com.hp.hpl.jena.ontology)中,可以在目录\\Jena-2.4\src\com\hp\hpl\jena\ontology下查看所有程序的代码,Jena本体部分的说明网页是\\Jena-2.4\doc\ontology\index.html,本部分内容以及程序的编写主要参考这两个文档。
在语义网上有很多表示本体信息的本体语言,其中表达能力最强的是OWL,OWL按复杂程度分为 OWL Full、OWL DL和OWL Lite三个版本。其他的本体语言还有RDFS、DAML+OIL。Jena Ontology API为语义网应用程序开发者提供了一组独立于具体语言的一致编程接口。
Jena提供的接口本质上都是Java程序,也就是.java文件经过javac之后生成的.class文件。显然,class文件并不能提示本体创建使用的语言。为了区别于其他的表示方法,每种本体语言都有一个自己的框架(profile),它列出了这种语言使用的类(概念)和属性的构建方式和URI。因此,在DAML框架里,对象属性()的URI是daml:ObjectProperty,而在OWL框架里却是owl:ObjectProperty。RDFS并没有定义对象属性,所以在RDFS框架里,对象属性的URI是null。
在Jena中,这种框架通过参数的设置在创建时与本体模型(Ontology Model)绑定在一起。本体模型继承自Jena中的Model类。Model允许访问RDF数据集合中的陈述(Statements),OntModel对此进行了扩展,以便支持本体中的各种数据对象:类(classes)、属性(properties)、实例(个体individuals)。
本部分简单介绍要用到的几个java类或者接口。

1.本体模型OntModel
本体模型(OntModel)是对Jena RDF模型的扩展(继承自RDF模型),提供了处理本体数据的功能。使用Jena处理本体首先就是要建立一个本体模型,之后就能够通过本体模型中所定义的方法操作模型,比如导入子模型()、获取模型中本体的信息、操作本体属性以及将本体的表示输出到磁盘文件等等。Jena通过model包中的ModelFactory创建本体模型,ModelFactory是Jena提供用来创建各种模型的类,在类中定义了具体实现模型的成员数据以及创建模型的二十多种方法。一个最简单的创建本体模型的语句如下:
OntModel ontModel = ModelFactory.createOntologyModel();
该语句不含参数,应用默认设置创建一个本体模型ontModel,也就是说:它使用OWL语言、基于内存,支持RDFS推理。可以通过创建时应用模型类别(OntModelSpec)参数创建不同的模型,以实现不同语言不同类型不同推理层次的本体操作。例如,下面的语句创建了一个使用DAML语言内存本体模型。直观地讲,内存模型就是只在程序运行时存在的模型,它没有将数据写回磁盘文件或者数据库表。
OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.DAML_MEM );
更多类型设置可以参照OntModelSpec类中的数据成员的说明。
我们所使用的本体是从OWL文件获得的,也就是说,是从磁盘读取的。读取的方法是调用Jena OntoModel提供的Read方法。例如
ontModel.read("file:D:/temp/Creatrue/Creature.owl");
就是读取位于D盘相应目录下的Creature.owl文件以建立本体模型。Read方法也有很多重载,上面调用的方法以文件的绝对路径作为参数。其他的方法声明如下
read( String url );
read( Reader reader, String base );
read( InputStream reader, String base );
read( String url, String lang );
read( Reader reader, String base, String Lang );
read( InputStream reader, String base, String Lang );

2.文档管理器Document manager
本体文档管理器(OntDocumentManager)是用来帮助管理本体文档的类,它包含了导入本体文档创建本体模型、帮助缓存下载网络上的本体等功能。每个本体模型都有一个相关联的文档管理器。在创建本体模型时,可以创建独立的文档管理器并作为参数传递给模型工厂(ModelFactory)。文档管理器有非常多的配置选项,基本可以满足应用的需求。首先,每个文档管理器的参数都可以通过Java代码来设置(注:OntDocumentManager有五种重载的构造函数)。另外,文档管理器也可以在创建的时候从一个RDF格式的策略文件读取相应设定值。
下面的例子创建一个文档管理器并将它与以创建的本体模型关联。
OntModel m = ModelFactory.createOntologyModel();
OntDocumentManager dm = m.getDocumentManager();

3.接口OntClass
这个接口中定义了本体中与概念(也就是类Class)相关的操作,通过OntModel中的listClasses()便可以返回模型中的所有概念组成的迭代器(Iterator),然后调用OntClass的各种方法具体进行具体操作。OntoClass对概念之间的各种关系都有相应的定义方法,典型的有添加子类、添加约束、创建互斥概念、迭代返回某种类型的概念以及相关的逻辑判断等等。
第四部分的例子主要是应用这个类的方法。

4.基本本体类型OntResource
所有本体API中用于表示本体的类继承自OntResource,这样就可以在OntResource中放置所有类公用的功能,并可以为一般的方法设置通用的返回值。Java接口OntResource扩展了Jena的RDF资源接口,所以任何可以接受资源或者RDFNode的方法都可以接受OntResource,并且也就可以接受任何其他本体值。虽然这个类涵盖了涉及本体的所有类,在例子中并没有使用它。从Jena Java Doc可以获得它的详细信息。

例子的主要代码如下列出。
// 创建使用OWL语言的内存模型
OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
ontModel.read("file:./Creature.owl"); // 读取当前路径下的文件,加载模型
// 定义一个类作为模型中Animal类的等等价类,并添加注释
OntClass cls = ontModel.createClass(":DongwuClass");
cls.addComment("the EquivalentClass of Animal...", "EN");
// 通过完整的URI取得模型中的Animal类
OntClass oc = ontModel.
getOntClass("http://www.owl-ontologies.com/marine.owl#Animal");
oc.addEquivalentClass(cls); // 将先前定义的类添加为Animal的等价类

// 迭代显示模型中的类,在迭代过程中完成各种操作
for (Iterator i = ontModel.listClasses(); i.hasNext();) {
OntClass c = (OntClass) i.next(); // 返回类型强制转换
if (!c.isAnon()) { // 如果不是匿名类,则打印类的名字
System.out.print("Class");
// 获取类的URI并输出,在输出时对URI做了简化(将命名空间前缀省略)
System.out.println(c.getModel().getGraph().getPrefixMapping().shortForm(c.getURI()));
                            
// 处理Animal类
if (c.getLocalName().equals("Animal")) { // 如果当前类是Animal
       System.out.println("  URI@" + c.getURI()); // 输出它的完整URI                
// 取得它的的等价类并打印
       System.out.print("  Animal's EquivalentClass is "+ c.getEquivalentClass());
// 输出等价类的注释
System.out.println(" [comments:" + c.getEquivalentClass().getComment("EN")+"]");
}// 处理Animal结束
// 迭代显示当前类的直接父类
for (Iterator it = c.listSuperClasses(); it.hasNext();)
{
       OntClass sp = (OntClass) it.next();
       String str = c.getModel().getGraph().getPrefixMapping().shortForm(c.getURI()) // 获取URI
                            + "'s superClass is " ;
       String strSP = sp.getURI();
       try{ // 另一种简化处理URI的方法
              str = str + ":" + strSP.substring(strSP.indexOf('#')+1);
              System.out.println("  Class" +str);
       }catch( Exception e ){}
} // super class ends
// 迭代显示当前类的直接子类
for (Iterator it = c.listSubClasses(); it.hasNext();){
System.out.print("  Class");
OntClass sb = (OntClass) it.next();
System.out.println(c.getModel().getGraph().getPrefixMapping()
                                          .shortForm(c.getURI())+ "'s suberClass is "
                                          + sb.getModel().getGraph().getPrefixMapping()
                                          .shortForm(sb.getURI()));
}// suber class ends
// 迭代显示与当前类相关的所有属性
for(Iterator ipp = c.listDeclaredProperties(); ipp.hasNext();){
       OntProperty p = (OntProperty)ipp.next();
       System.out.println("  associated property: " + p.getLocalName());
       }// property ends
}// anonymity ends
else {}// 是匿名类
}// for ends


--  作者:白色闪电
--  发布时间:4/14/2010 10:41:00 AM

--  
非常感谢,我试试您说的方法
下面这个例子看过,总之,谢啦
--  作者:angleangleangle
--  发布时间:4/20/2010 5:26:00 PM

--  
楼上的说法,运行结果是Exceptions occur...

--  作者:Avansky
--  发布时间:4/21/2010 6:14:00 PM

--  
兄弟,你好!
1)在window---->Prefrences---->MyEclipse Edition------>Database Explorer----->Database Drivers中添加与数据库的链接。
2)必须在Myeclipse项目中,Referenced Libraries中导入mysql-connector包。
--  作者:Avansky
--  发布时间:4/21/2010 6:19:00 PM

--  
MyEclipse和Mysql的配置!!
下面是别人的博客,讲的很详细!

Java中使用JDBC访问MySQL数据库:
http://hi.baidu.com/laoxiumu/blog/item/d21580a77d317892d1435858.html


--  作者:angleangleangle
--  发布时间:5/4/2010 10:14:00 PM

--  
存储数据库那个输出什么也没有
[此贴子已经被作者于2010-5-5 15:09:55编辑过]

--  作者:angleangleangle
--  发布时间:5/4/2010 10:25:00 PM

--  
mydb mydb mydb 
  
20000908 honey 21
[此贴子已经被作者于2010-5-5 15:07:32编辑过]

--  作者:lyfsemanticweb
--  发布时间:9/7/2010 7:47:00 PM

--  
弱弱的问一下怎么将用protege构建的本体保存到SQL server数据库中啊?
--  作者:qxr777
--  发布时间:9/12/2010 9:33:00 PM

--  
将OWL文件导入DB,效率真的能够比导入内存高吗?
我们有一个2M左右的owl,持久化到MySQL后,再从MySQL中载入内存,居然大约得花10分钟的时间;而直接从owl文件载入内存则快得多。
--  作者:ylzhu
--  发布时间:9/13/2011 8:37:00 PM

--  
我现在在做本体存储的实验,我想把已经建立好的本体存入SQL2005中。我使用的是MyEclipse-8.6  jena-2.8.5
但是我的程序报错:
Exception in thread "main" com.hp.hpl.jena.db.RDFRDBException: Failure to instantiate DB Driver:SQLServer java.lang.ClassNotFoundException: com.hp.hpl.jena.db.impl.Driver_SQLServer
 at com.hp.hpl.jena.db.DBConnection.getDriver(DBConnection.java:272)
 at com.hp.hpl.jena.db.DBConnection.containsModel(DBConnection.java:195)
 at com.hp.hpl.jena.db.impl.GraphRDBMaker.hasGraph(GraphRDBMaker.java:132)
 at com.hp.hpl.jena.db.impl.GraphRDBMaker.createGraph(GraphRDBMaker.java:94)
 at com.hp.hpl.jena.rdf.model.impl.ModelMakerImpl.createModel(ModelMakerImpl.java:46)
 at com.hp.hpl.jena.rdf.model.impl.ModelMakerImpl.createModel(ModelMakerImpl.java:49)
 at benticunchu.ReadOntologyFromMysql.ceateDBModelFromFile(ReadOntologyFromMysql.java:56)
 at benticunchu.ReadOntologyFromMysql.main(ReadOntologyFromMysql.java:142)
Caused by: java.lang.ClassNotFoundException: com.hp.hpl.jena.db.impl.Driver_SQLServer
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClassInternal(Unknown Source)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Unknown Source)
 at com.hp.hpl.jena.db.DBConnection.getDriver(DBConnection.java:267)
 ... 7 more

哪位大侠帮帮我解决一下这个问题吧!非常感谢啊!


--  作者:glcyming
--  发布时间:3/5/2012 10:09:00 PM

--  protege直接导入mysql数据库错误
我用protege直接导入mysql数据库,为什么说字节过长之类的错误,是怎么回事啊?请高手指教啊!
--  作者:yimi_lai
--  发布时间:5/10/2012 5:30:00 PM

--  
同9楼,怎么将用protege构建的本体保存到SQL server数据库中啊?求指导。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
156.250ms