以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  [加急]请教jena查询本体的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=75377)


--  作者:kingskim
--  发布时间:6/14/2009 9:44:00 AM

--  [加急]请教jena查询本体的问题
下面我是我写的一个查询OWL文件的代码,sparqlpath是我在前面定义的文件路径。整个程序在MYECLIPSE下能正常运行,但是我把这代码移植到JSP中后,就出现问题了。整个情况是这样的:
index.html我输入关键字,点击提交按钮,用Ajax调用我的TOMCAT上的一个JSP文件(该文件的功能是:连接一个WEB服务,获取返回结果,把结果中的有用部分提取出来,转移到另一个文件book.owl中[我定义了一个超级简单的本体,这里没有问题],然后调用JENA API+SPARQL查询查生成的这个book.owl文件),JSP文件返回的结果我放在index.html中的一个div里。

整个流程就是这样的,而且也用运行。但是有个大问题:部署后,打开IE,第一次能正常运行,在不关闭IE的情况下,第二次,第三次都不出结果,除非关键字还是第一次的时候输入的关键字(这种情况下还是会出结果,但是结果和第一次一样)。关闭IE,重新打开后也是第一次能运行,往后就不能运行了。经检查发现,其实,[连接一个WEB服务,获取返回结果,把结果中的有用部分提取出来,转移到另一个文件book.owl中,]这都没问题,的确新生成了文件,但是查询结果不更新。是怎么回事呢?
Ajax调用的时候,我加了随机函数,也不行。所以我怀疑是我在导入本体的后,文件没释放。但是自己没查出错误来,请高手指点一下,帮我看看是哪儿出问题了。
OntModel model = ModelFactory.createOntologyModel();
 FileInputStream file = new FileInputStream(sparqlpath);
 InputStreamReader infile = new InputStreamReader(file, "gb2312");
 model.read(infile, null);
 String prefix = "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
   + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
   + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
   + "PREFIX  base:<http://www.owl-ontologies.com/book.owl#> ";
 String slect = "SELECT DISTINCT ?name ?author ?isbn ?book_price ?book_summary ";
 String where = "WHERE { " + " ?k" + " base:author ?g ." + "OPTIONAL { "
   + "?k" + " base:title ?name ." + "}" + "OPTIONAL { " + "?k"
   + " base:creators ?author ." + "}" + "OPTIONAL { " + "?k"
   + " base:isbn ?isbn ." + "}" + "OPTIONAL { " + "?k"
   + " base:price ?book_price ." + "}" + "OPTIONAL { " + "?k"
   + " base:summary ?book_summary ." + "}" + "FILTER regex(?g, '"
   + keywords + "', 'i') " + " }" + "ORDER BY ASC(?book_price)"// ORDER
                  // BY,排序,可以指定多个排序,比如例子可以改为,ORDER
                  // BY
                  // ASC(?name)
                  // DESC(?age)。默认排序是
                  // ASC。
   // +"LIMIT 2"//将返回结果限定在 2 条,类似于 SQL 中的 SELECT TOP 2
   // +"OFFSET 1"//掠过前边的 1 条,从 第 2 条开始返回。这个功能比 SQL 强大,SQL
   // 要自己写翻页。优先级比LIMIT高
 ;
 Query query = QueryFactory.create(prefix + slect + where);
 Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
 InfModel inf = ModelFactory.createInfModel(reasoner, model);
 QueryExecution qe = QueryExecutionFactory.create(query, inf);
 ResultSet results = qe.execSelect();
 for(;results.hasNext();){ QuerySolution a=
   (QuerySolution)results.next();
   out.print("<hr>");
   out.println(a.get("?name")+"
");
   out.println(a.get("?author")+"
");
   //out.println(a.get("?isbn")+"
");
   out.println(a.get("?book_price")+"
");
   out.println(a.get("?book_summary")+"
");
   }
 qe.close();
 inf.close();
 infile.close();
 file.close();
 model.close(); 


--  作者:duxiong
--  发布时间:6/14/2009 10:08:00 AM

--  
如果程序在本机调试通过,部署后出现这种情况,很有可能是服务器缓存的问题。你注意一下。
--  作者:achenal
--  发布时间:6/14/2009 10:39:00 AM

--  
用SPARQL查询,最好用FireFox浏览器。
--  作者:jpz6311whu
--  发布时间:6/16/2009 11:36:00 AM

--  
试试tomcat下的work文件夹中的内容删除掉
--  作者:Humphrey
--  发布时间:7/10/2009 8:52:00 AM

--  
版主的处理方法,以前曾有幸接触过。印象中是Web服务的问题,不过不知道为什么一定要那样处理才行。
如果清理之后还是出现类似的情况就不好办了。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms