现在的位置: 首页 > 综合 > 正文

关于jena OWL持久化 Table ‘jena.jena_sys_stmt’ doesn’t exist的解决

2019年05月08日 ⁄ 综合 ⁄ 共 1206字 ⁄ 字号 评论关闭








      最近两天刚接触jena,其实就是想解析将owl入库,很快就从网上找到了程序,但是一直不能通过,一直的问题是
     WARNING: Problem formatting database
     com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jena.jena_sys_stmt' doesn't exist

     貌似又有很多人没有遇到这个问题,因为解决方案没找到。
     找到的程序博主说用的是jena2.5,反正我刚开始下的版本是2.11,包都已经找不到了,只能用低版本。
     废话不多说,重点:
     下载下来的jena包都可以看看,首先要把scr里所有程序都加载进来,这些对应的是lib里的各个包,但是这个可以看到源代码
      里面有很多 example,其中jena.examples.ontology.persistentOntology这个包里就是把数据持久化的例子,修改好一些参数后,发现出现的异常还是一个,于是顺着程序慢慢找。(如果从一开始下载的那个程序找,会发现找到的是抽象类,没有具体方法)
     最终在SQLCache.java里面找到了runSQLGroup(String opname, String [] attr)这个方法,问题就在这里~!!!
     捕获异常时有一句:System.out.println("Exec failure: " + op + ": " + e);被屏蔽了,去掉屏蔽就发现问题啦~~
     其实异常时对表里的字段建立索引的时候出现的,但是要建索引的表不存在。。。。
     
     op是执行的sql语句,把所有的op输出,可发现根源问题不是建索引的时候,而是 建表的时候!!
      可能是数据库版本问题,有些语句是不符合的,如
CREATE TABLE jena_g11t0_reif (
    //此处省略一万字。。。
    ) TYPE = INNODB
    我用的mysql 5.5 ,最后的“TYPE = INNODB”不执行,所以每次新建表的时候就出现异常。。

     解决办法:
     我的数据库可以识别  ENGINE=InnoDB。。。不过我没有用,根据需要可以把op 的最后一句替换掉,我只是在execute(op)之前加了个替换:  
                if(op.indexOf("TYPE  = INNODB") > 0){
op = op.substring(0,op.indexOf("TYPE  = INNODB"));
}
if(op.indexOf("TYPE = INNODB") > 0){
op = op.substring(0,op.indexOf("TYPE = INNODB"));
}

   这两句if条件有区别吗?有! 第一个等号前有两个空格,第二个只有一个空格。。。。。我也没有深入查看op到底是怎么拼成的,反正op真的有这两种情况。。。。然后就ok啦~~~~
    



抱歉!评论已关闭.