以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  将OWL本体文件存储到MySQL数据库过程中“创建一个模型制造器”时抛异常[求助]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=88028)


--  作者:baiz_2010
--  发布时间:11/29/2010 3:05:00 PM

--  将OWL本体文件存储到MySQL数据库过程中“创建一个模型制造器”时抛异常[求助]

根据dorothyle前辈发的《[原创]实现将OWL本体文件存储到MySQL数据库》这个帖子,做了个测试,

用的是mysql。

把其中相应的参数修改完后,run的时候,在  
Model defModel = maker.createModel("Animal"); 这句的时候报错。

错误为:
[color=#FF0000]
驱动程序已经安装。
数据库连接成功。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/eclipse/owl_workspace/owlWebTest/WebContent/WEB-INF/lib/slf4j-log4j12-1.5.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/eclipse/owl_workspace/owlWebTest/WebContent/WEB-INF/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Exception in thread "main" com.hp.hpl.jena.shared.JenaException: The database appears to be unformatted or corrupted - could not find value
for "long object length" in Jena system properties table.
If possible, call IDBConnection.cleanDB().
Warning: cleanDB will remove all Jena models from the databases.
 at com.hp.hpl.jena.db.impl.DriverRDB.throwBadFormat(DriverRDB.java:406)
 at com.hp.hpl.jena.db.impl.DriverRDB.getSystemSpecializedGraph(DriverRDB.java:339)
 at com.hp.hpl.jena.db.DBConnection.containsModel(DBConnection.java:196)
 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 com.inspur.owl.Persistent.main(Persistent.java:32)[/color]


在网上也没找到相应的异常处理办法。

小弟刚刚接触OWL,还望各位高手指点,感激不尽。


附代码:
   import java.io.*;
import java.sql.SQLException;
import com.hp.hpl.jena.db.*;
import com.hp.hpl.jena.rdf.model.*;

public class Persistent {
public static final String strDriver = "com.mysql.jdbc.Driver";
public static final String strURL = "jdbc:mysql://localhost:3306/protege_db";
// localhost的后面要直接写冒号,再写3306;
public static final String strUser = "root";
public static final String strPassword = "root";
public static final String strDB = "MySQL";

public static void main(String[] args){
  try {
   DBConnection connection = new DBConnection(strURL, strUser, strPassword, strDB);
   // 创建连接时,第四个参数需要指定所用的数据库类型;也就是说strDB的值应该是“MySQL”
   try {
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("驱动程序已经安装。");
   } catch (ClassNotFoundException e){
    System.out.println("ClassNotFoundException, Driver is not available");
    }
   System.out.println("数据库连接成功。");
   
   // 从此处开始读入一个OWL文件并且存储到数据库中;
  
   ModelMaker maker = ModelFactory.createModelRDBMaker(connection);
// 使用数据库连接参数创建一个模型制造器
[color=#FF0000] Model defModel = maker.createModel("Animal");
     // 创建一个默认模型,命名为Costume,因为我要存入的OWL文件名是Costume
   
   FileInputStream read = null;
   try{
    File file = new File("E:/owl/Animal.owl");
    read = new FileInputStream(file);
   }catch (FileNotFoundException e){
    e.printStackTrace();
    System.out.println("未找到要存储的本体文件,请检查文件地址及名称");
   }
   System.out.println("已将本体文件转换为字节流文件。");
   
   InputStreamReader in = null;
   try {
    in = new InputStreamReader((FileInputStream)read, "UTF-8");
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    System.out.println("不支持上述字符集。");
   }
   System.out.println("已将字节流文件转换为UTF-8编码。");
   
   defModel.read(in,null);
   try {
    in.close();
   } catch (IOException e){
    e.printStackTrace();
    System.out.println("无法关闭字节流文件。");
   }
   System.out.println("已将字节流文件关闭。");
   
   defModel.commit();
   System.out.println("数据转换执行完毕,已将本体文件存入数据库。");
   try{
    connection.close();
   } catch (SQLException e){
    e.printStackTrace();
    System.out.println("文件无法关闭。");
   }
  } catch (RDFRDBException e){
   System.out.println("出现异常");
   }
  System.out.println("已将本体文件持久化到数据库中");
  }
}


--  作者:baiz_2010
--  发布时间:11/29/2010 6:10:00 PM

--  
总算解决了,额...也不算是解决。糊里糊涂的就能读到mysql里了。现把我今天从遇到问题到所做的操作列一下:
一、根据网上的代码,修改成我本机对应的信息。
二、增加上相应的jar包,如:mysql的。
三、出现刚才那个问题。
四、重启eclipse和 mysql数据库,  还是这个异常。
五、更换mysql的驱动包, 还是报这个异常。
六、把jdbc信息换成oracle的,  成功存放到数据库中。  同时排除了jena包的问题。
七、然后再把jdbc信息改回成mysql的, 竟然成功了!! 真洗具~~~
--  作者:admin
--  发布时间:11/29/2010 11:25:00 PM

--  
以下是引用baiz_2010在2010-11-29 18:10:00的发言:
总算解决了,额...也不算是解决。糊里糊涂的就能读到mysql里了。现把我今天从遇到问题到所做的操作列一下:
一、根据网上的代码,修改成我本机对应的信息。
二、增加上相应的jar包,如:mysql的。
三、出现刚才那个问题。
四、重启eclipse和 mysql数据库,  还是这个异常。
五、更换mysql的驱动包, 还是报这个异常。
六、把jdbc信息换成oracle的,  成功存放到数据库中。  同时排除了jena包的问题。
七、然后再把jdbc信息改回成mysql的, 竟然成功了!! 真洗具~~~

感谢分享成功解决经验!


--  作者:Avansky
--  发布时间:11/30/2010 9:43:00 AM

--  
Jena持久化本体到MySQL数据库
 要实现Jena持久化本体到MySQL数据库,便于以后更好地对本体的操作,首先必须在Myeclipse中配置好MySQL,接着就可以在Myeclipse中实现持久化本体。首先完成数据库的连接,代码如下所示:
public static IDBConnection connectDB(String DB_URL, String DB_USER,  String DB_PASSWD, String DB_NAME)

       return new DBConnection(DB_URL, DB_USER, DB_PASSWD, DB_NAME);
}  
接着就可以实现本体存入数据库的操作,从文件读取本体并将其存入数据库的代码如下所示:
public static OntModel createDBModelFromFile(IDBConnection con, String name, String filePath)

     ModelMaker maker = ModelFactory.createModelRDBMaker(con); 
     Model base = maker.createModel(name); 
     OntModel model = ModelFactory.createOntologyModel(getModelSpec(maker), base);
     model.read(filePath); 
     return model;
}
再者,存入数据库的本体如果不能被方便的利用,那么就失去了把本体持久化到数据库的意义。从数据库中得到已存入本体代码如下所示:
public static OntModel getModelFromDB(IDBConnection con, String name)
{    
       ModelMaker maker = ModelFactory.createModelRDBMaker(con);    
       Model base = maker.getModel(name);    
       OntModel model = ModelFactory.createOntologyModel(getModelSpec(maker), base);          
       return model;
}

public static OntModelSpec getModelSpec(ModelMaker maker)
{    
       OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);           
       spec.setImportModelMaker(maker);    
       return spec;
}
最后需要测试把文件持久化到数据库中和从数据库中读出操作的具体实现。代码如下:
public static void test() {    
     String DB_URL = "jdbc:mysql://localhost/avan";    
     String DB_USER = "root";    
     String DB_PASSWD = "root";    
     String DB = "MySQL";    
     String DB_DRIVER = "com.mysql.jdbc.Driver"; 
   
     try {           
              Class.forName("com.mysql.jdbc.Driver");    
      } catch (ClassNotFoundException e) {            
              e.printStackTrace();    
      }    
     String filePath = "file:C://Animal//Animal.owl";    
     IDBConnection con = Jena2SQL.connectDB(DB_URL,DB_USER, DB_PASSWD, DB);       
     Jena2SQL.createDBModelFromFile(con, "Animal",filePath);      
     OntModel Model = Jena2SQL.getModelFromDB(con, "Animal");       
     Jena2SQL.SimpleReadOntology(Model);
}

public static void SimpleReadOntology(OntModel model) {    
     for (Iterator i = model.listClasses(); i.hasNext();)
     {        
            OntClass c = (OntClass) i.next();          
            System.out.println(c.getLocalName());    
      }
}
其中SimpleReadOntology()方法实现的效果是读取本体中类的简单操作。


--  作者:Avansky
--  发布时间:11/30/2010 9:45:00 AM

--  
    
抱歉,所有以上的全部去掉
--  作者:scu86792090
--  发布时间:5/6/2015 4:19:00 PM

--  [讨论]文章中所附代码放在哪里运行?
你好,请问你在文中所附的代码应该放在哪里运行?还有就是能不能告知这段代码为什么要这么写,有没有参考资料推荐?非常感谢!!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
17,246.090ms