以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (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=74918)


--  作者:Lexxuan
--  发布时间:5/19/2009 4:23:00 AM

--  [原创]Jena下本体的简单检索
以下代码实现的具体功能为:
读入三个不同但相关联的本体,设定1个关键词(此关键词在某本体内为类名,在另一本体内为实体名),查询出跟这关键词相关的总共三个本体内的内容.
希望此代码能帮助初学者了解Jena下使用SPARQL实现本体的查询,以此举一反三.同时也欢迎交流与指错.
(注意:勿忘运行前设好Jena的classpath)
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.reasoner.*;
public class MyOntology{
  public static void main(String[] args) {
    OntModel text_ontmodel = ModelFactory.createOntologyModel();
       OntDocumentManager dm = text_ontmodel.getDocumentManager();
       dm.addAltEntry("http://www.owl-ontologies.com/Ontology1241779535.owl#","file:" + "Family.owl");
       text_ontmodel.read("file:C:/Protege_3.4/Family.owl");
       String k=" base:Julia ";
       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/Ontology1241779535.owl#> ";
       String slect =  "SELECT ?son ?daughter ?father ?mother ?sister ?brother ?marry_with ";
       String where =  "WHERE { "+
                         "OPTIONAL { "+ k +
                                  " base:son ?son ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:daughter ?daughter ."+
                         //for <daughter xml:lang="en">Lily</daughter> in <married rdf:ID="Julia">
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:father ?father ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:mother ?mother ."+
                         " }"+     
                         "OPTIONAL { "+ k +        
                                  " base:sister ?sister ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:brother ?brother ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:marry_with ?marry_with ."+
                         " }"+
                               //can test "?x rdfs:subClassOf ?y ." +
                               //and "?y base:son \"Jack\"@en ."+
                        " }";
       Query query = QueryFactory.create(prefix + slect + where);
       Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
       InfModel inf = ModelFactory.createInfModel(reasoner, text_ontmodel);
       QueryExecution qe = QueryExecutionFactory.create(query,inf);
       ResultSet results = qe.execSelect();
       ResultSetFormatter.out(System.out,results,query);
       qe.close();
       
       
       
       
       OntModel text_ontmodel2 = ModelFactory.createOntologyModel();
       OntDocumentManager dm2 = text_ontmodel.getDocumentManager();
       dm2.addAltEntry("http://www.owl-ontologies.com/Ontology1241779535.owl#","file:" + "Family2.owl");
       text_ontmodel2.read("file:C:/Protege_3.4/Family2.owl");
       String prefix2 = "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/Ontology1241779535.owl#> ";
       String slect2 =  "SELECT ?relationship ?with ";
       String where2 =  "WHERE { "+
                                "?x owl:onProperty ?relationship ." +
                                //here for <owl:ObjectProperty rdf:ID="daughter_is"/> in <owl:onProperty> in <owl:Restriction> in <owl:Class rdf:ID="Julia">
                                "?x owl:allValuesFrom ?with ."+ k +
                                " rdfs:subClassOf ?x ."+
                                
                        " }";
       Query query2 = QueryFactory.create(prefix2 + slect2 + where2);
       Reasoner reasoner2 = ReasonerRegistry.getOWLReasoner();
       InfModel inf2 = ModelFactory.createInfModel(reasoner2, text_ontmodel2);
       QueryExecution qe2 = QueryExecutionFactory.create(query2,inf2);
       ResultSet results2 = qe2.execSelect();
       ResultSetFormatter.out(System.out,results2,query2);
       qe2.close();
       
       
       
       

       OntModel text_ontmodel3 = ModelFactory.createOntologyModel();
       OntDocumentManager dm3 = text_ontmodel3.getDocumentManager();
       dm3.addAltEntry("http://www.owl-ontologies.com/Ontology1241772983.owl#","file:" + "human_being.owl");
       text_ontmodel3.read("file:C:/Protege_3.4/human_being.owl");
       String prefix3 = "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/Ontology1241772983.owl#> ";
       String slect3 = "SELECT ?birthday ?firstname ?familyname ?nationality ";
       String where3 = "WHERE { "+
                         "OPTIONAL { "+ k +
                                  " base:birthday ?birthday ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:firstname ?firstname ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:familyname ?familyname ."+
                         " }"+
                         "OPTIONAL { "+ k +
                                  " base:nationality ?nationality ."+
                         " }"+     
                       " }";
       Query query3 = QueryFactory.create(prefix3 + slect3 + where3);
       Reasoner reasoner3 = ReasonerRegistry.getOWLReasoner();
       InfModel inf3 = ModelFactory.createInfModel(reasoner3, text_ontmodel3);
       QueryExecution qe3 = QueryExecutionFactory.create(query3,inf3);
       ResultSet results3 = qe3.execSelect();
       ResultSetFormatter.out(System.out,results3,query3);
       qe3.close();       


  }
}

附件里面有本代码应用到的三个本体owl文件,另外还有4个关系图帮助理解三本体,其中Ktiiy应为Kitty



此主题相关图片如下:
按此在新窗口浏览图片


此主题相关图片如下:
按此在新窗口浏览图片
此主题相关图片如下:
按此在新窗口浏览图片
此主题相关图片如下:
按此在新窗口浏览图片


[此贴子已经被作者于2009-5-19 14:23:05编辑过]

--  作者:heather_0209
--  发布时间:5/21/2009 4:43:00 PM

--  
太好了,谢谢LZ了

--  作者:zhangjiazimei
--  发布时间:5/25/2009 10:29:00 AM

--  
楼主太好了
--  作者:xiaoxiaoxia
--  发布时间:5/25/2009 10:55:00 AM

--  
请问LZ,如果我想针对一个本体编写自己的检索程序,是对owl文件进行操作,而不是对protege软件进行操作,对吧?我们可以实现对中文本体的检索吗?我刚刚起步,对一些基础的东西不了解。还请LZ包涵:)
--  作者:Lexxuan
--  发布时间:5/25/2009 6:07:00 PM

--  
以下是引用xiaoxiaoxia在2009-5-25 10:55:00的发言:
请问LZ,如果我想针对一个本体编写自己的检索程序,是对owl文件进行操作,而不是对protege软件进行操作,对吧?我们可以实现对中文本体的检索吗?我刚刚起步,对一些基础的东西不了解。还请LZ包涵:)


构造owl文件有很多工具,远不止protege,因此本文对本体的检索,当然也不是对软件的检索,而是对owl的检索.
我们能实现任何一种语言本体的检索,前提首先是该本体包含了此种语言,其次就是你的检索环境支持此种语言.
比如,在Jena下,你想对中文本体和阿拉伯文本体进行检索,那你的本体owl文件就需要有你所检索的中文和阿拉伯文关键词,且需要Jena支持中文和阿拉伯文的编译
--  作者:mrjpj520
--  发布时间:5/28/2009 4:07:00 PM

--  
您好,问个比较白痴的问题,但是确实是不会,把程序和本体用记事本保存,是用Eclipse全部打开后运行么?
正在学习怎样改Jena的classpath,请您见谅。麻烦了
--  作者:cxgnj
--  发布时间:5/29/2009 5:49:00 PM

--  
楼主的程序是在控制台输出结果的,比如ResultSetFormatter.out(System.out,results3,query3);
在控制台输出是:
---------------------------------------------------------------------------------------------------
| birthday                                              | firstname  | familyname   | nationality |
===================================================================================================
| "1982-05-20"^^<http://www.w3.org/2001/XMLSchema#date> | "Julia"@en | "Addison"@en | "USA"@en    |
---------------------------------------------------------------------------------------------------
能不能在jsp的页面中输出查询的结果呢?这样能实现吗?如何实现啊?

--  作者:springbird
--  发布时间:5/29/2009 8:14:00 PM

--  
问个很白痴的问题吧,你的这些图是用什么软件画的呢?本体能用hozo建立吗


--  作者:Lexxuan
--  发布时间:5/29/2009 8:25:00 PM

--  
以下是引用mrjpj520在2009-5-28 16:07:00的发言:
您好,问个比较白痴的问题,但是确实是不会,把程序和本体用记事本保存,是用Eclipse全部打开后运行么?
正在学习怎样改Jena的classpath,请您见谅。麻烦了


。。。。。。
首先,创造本体可以用很多工具,记事本也是可以的.......当然用记事本写程序也是可以.......但是绝对不推荐.......
其次,下载Jena包,设classpath,在比如Eclipse下写程序,程序中读入本体文件......如果程序不能正常运行,可以再在java项目下把Jena包全部加载进去
--  作者:Lexxuan
--  发布时间:5/29/2009 8:27:00 PM

--  
以下是引用cxgnj在2009-5-29 17:49:00的发言:
楼主的程序是在控制台输出结果的,
能不能在jsp的页面中输出查询的结果呢?这样能实现吗?如何实现啊?



本人没尝试过在jsp页面上输出,理论上当然可以,加油!
--  作者:Lexxuan
--  发布时间:5/29/2009 8:35:00 PM

--  
以下是引用springbird在2009-5-29 20:14:00的发言:
问个很白痴的问题吧,你的这些图是用什么软件画的呢?本体能用hozo建立吗




本体编辑工具Hozo本人没用过,毕竟本体方面的软件很多
画图有更多的软件。比如Visio。 比如也可以直接在protege的OWLViz下截图再加别的东西进去
--  作者:springbird
--  发布时间:5/29/2009 8:59:00 PM

--  
谢谢楼主,毕竟我也是刚接触本体,是用hozo建本体的,可是建出来后缀是.ont,好像用jena解析时不行
--  作者:Lexxuan
--  发布时间:5/29/2009 10:08:00 PM

--  
以下是引用springbird在2009-5-29 20:59:00的发言:
谢谢楼主,毕竟我也是刚接触本体,是用hozo建本体的,可是建出来后缀是.ont,好像用jena解析时不行


尝试找找看有没有.ont与.owl间的转换工具.或者看看有没有插件让Jena支持.ont
--  作者:gudujian001
--  发布时间:6/3/2009 3:49:00 PM

--  
学习中............................
--  作者:tmw
--  发布时间:7/22/2009 9:37:00 PM

--  
LZ 牛人
--  作者:peter2010
--  发布时间:3/22/2010 7:18:00 PM

--  
太好了,谢谢楼主
--  作者:angleangleangle
--  发布时间:3/30/2010 3:57:00 PM

--  
楼主我想问一下没有输出结果吗?
--  作者:Lexxuan
--  发布时间:4/1/2010 10:33:00 PM

--  
当时赶时间,结果要截图好麻烦就没上图了,不过个人觉得结果可以想象出来啊(输出格式和内容),毕竟没错,呵呵
--  作者:angleangleangle
--  发布时间:4/3/2010 10:18:00 AM

--  
-------------------------------------------------------------------------------
| son | daughter  | father     | mother     | sister | brother   | marry_with |
===============================================================================
|     | "Lily"@en | "Clark"@en | "Kitty"@en |        | "Jack"@en | "John"@en  |
-------------------------------------------------------------------------------
---------------------------------
| relationship     | with       |
=================================
| base:mother_is   | base:Kitty |
| base:daughter_is | base:Lily  |
| base:marry_with  | base:John  |
| base:father_is   | base:Clark |
| base:father_is   | base:Clark |
| base:mother_is   | base:Kitty |
| base:brother_is  | base:Jack  |
| base:daughter_is | base:Lily  |
---------------------------------
---------------------------------------------------------------------------------------------------
| birthday                                              | firstname  | familyname   | nationality |
===================================================================================================
| "1982-05-20"^^<http://www.w3.org/2001/XMLSchema#date> | "Julia"@en | "Addison"@en | "USA"@en    |
---------------------------------------------------------------------------------------------------
我的输出结果
--  作者:angleangleangle
--  发布时间:4/3/2010 10:18:00 AM

--  
-------------------------------------------------------------------------------
| son | daughter  | father     | mother     | sister | brother   | marry_with |
===============================================================================
|     | "Lily"@en | "Clark"@en | "Kitty"@en |        | "Jack"@en | "John"@en  |
-------------------------------------------------------------------------------
---------------------------------
| relationship     | with       |
=================================
| base:mother_is   | base:Kitty |
| base:daughter_is | base:Lily  |
| base:marry_with  | base:John  |
| base:father_is   | base:Clark |
| base:father_is   | base:Clark |
| base:mother_is   | base:Kitty |
| base:brother_is  | base:Jack  |
| base:daughter_is | base:Lily  |
---------------------------------
---------------------------------------------------------------------------------------------------
| birthday                                              | firstname  | familyname   | nationality |
===================================================================================================
| "1982-05-20"^^<http://www.w3.org/2001/XMLSchema#date> | "Julia"@en | "Addison"@en | "USA"@en    |
---------------------------------------------------------------------------------------------------
我的输出结果
--  作者:angleangleangle
--  发布时间:4/3/2010 10:21:00 AM

--  
请问楼主在哪可以学SPARQL语言呢?还有在查询中用到<http://www.w3.org/2002/07/owl#>类似的,有没有什么实际的意义呢?输出结果中也有类似的代码。
--  作者:angleangleangle
--  发布时间:4/3/2010 10:23:00 AM

--  
还有请问楼主你这本体是用protege建的吗?
--  作者:angleangleangle
--  发布时间:4/3/2010 10:28:00 AM

--  
为什么输出是一个表格呢?
--  作者:Lexxuan
--  发布时间:4/3/2010 10:38:00 AM

--  
呵呵,谢谢angleangleangle帮我贴出运行结果啊。
这个帖子是本人初学本体时候做的,本体文件是用protege建立(但以后才发现建立本体方法很灵活,用protege软件反而限制多多)
输出的表格是jena自带的输出格式,也就是ResultSetFormatter.out(System.out, results, query)的输出就会是这样子。你也可以自己用循环以字符串输出每条结果,粗略地说就是用results.hasNext()来作为循环判断,toString来转字符串。转为字符串后就方便了,比如用split筛选出你所需要的信息。
SPARQL语法和用法在网上一搜就能搜到。了解以后自然就知道为什么查询和结果都用来诸如<http://www.w3.org/2002/07/owl#>的URL
--  作者:lzx211314
--  发布时间:4/9/2010 2:30:00 PM

--  
楼主,天下第一大好人。太好了。
非常感谢!
--  作者:service365
--  发布时间:5/7/2010 12:46:00 PM

--  
以下是引用springbird在2009-5-29 20:59:00的发言:
谢谢楼主,毕竟我也是刚接触本体,是用hozo建本体的,可是建出来后缀是.ont,好像用jena解析时不行


为什么不用Protege建本体?
--  作者:yhw0503
--  发布时间:8/9/2010 4:52:00 PM

--  
为什么读不进pretege中呢
--  作者:Lexxuan
--  发布时间:8/9/2010 10:14:00 PM

--  
以下是引用yhw0503在2010-8-9 16:52:00的发言:
为什么读不进pretege中呢


应该可以的。很久没用protege了,但这些本体我就是用以前版本的protege建立的
--  作者:yangqlin
--  发布时间:9/2/2010 8:50:00 PM

--  
请问楼主,我在MYeclipse下运行你的代码,并导入了jena-2.6.3,为什么还是提示import com.hp.hpl.jena.query.*;没有导入进去,难道 com.hp.hpl.jena.query.*不是在jena的jar包中吗?
--  作者:yangqlin
--  发布时间:9/3/2010 11:53:00 AM

--  
我运行的时候出错ERROR [main] (RDFDefaultErrorHandler.java:44) - file:F:/Workspaces/MyEclipse%207.0/myOntology/owl/Family.owl[2:1]: {E301} Content is not allowed in prolog.
Exception in thread "main" com.hp.hpl.jena.rdf.arp.ParseException: {E301} Content is not allowed in prolog.
 at com.hp.hpl.jena.rdf.arp.XMLHandler.parseWarning(XMLHandler.java:221)
 at com.hp.hpl.jena.rdf.arp.XMLHandler.parseWarning(XMLHandler.java:214)
 at com.hp.hpl.jena.rdf.arp.ParserSupport.saxException(ParserSupport.java:193)
 at com.hp.hpl.jena.rdf.arp.RDFParser.saxEx(RDFParser.java:260)
 at com.hp.hpl.jena.rdf.arp.RDFParser.oneWhite(RDFParser.java:248)
 at com.hp.hpl.jena.rdf.arp.RDFParser.whiteOrErr(RDFParser.java:196)
 at com.hp.hpl.jena.rdf.arp.RDFParser.rdfFile(RDFParser.java:98)
 at com.hp.hpl.jena.rdf.arp.SingleThreadedParser.parse(SingleThreadedParser.java:146)
 at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:187)
 at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:174)
 at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:244)
 at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:221)
 at com.hp.hpl.jena.ontology.impl.OntModelImpl.read(OntModelImpl.java:2082)
 at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:206)
 at com.hp.hpl.jena.ontology.impl.OntModelImpl.read(OntModelImpl.java:2046)
 at com.hp.hpl.jena.ontology.impl.OntModelImpl.read(OntModelImpl.java:2027)
 at com.hp.hpl.jena.ontology.impl.OntModelImpl.read(OntModelImpl.java:1988)
 at MyOntology.main(MyOntology.java:16)
请问是什么原因啊,谢谢
--  作者:micheal1
--  发布时间:9/6/2010 10:44:00 AM

--  发现个问题
你所构建的本体里面好像没有汉语 (有的本体构建软件,owl文件不能显示汉语而是显示数字编码,你知道什么软件能让它显示汉语吗?我用的是protege4.1),查询时,jena能够实现数字编码反编译成汉字吗?谢谢
--  作者:Lexxuan
--  发布时间:9/10/2010 3:05:00 AM

--  
以下是引用yangqlin在2010-9-3 11:53:00的发言:
我运行的时候出错ERROR [main] (RDFDefaultErrorHandler.java:44) - file:F:/Workspaces/MyEclipse%207.0/myOntology/owl/Family.owl[2:1]: {E301} Content is not allowed in prolog.

光从错误信息很难判断哪里错了。注意文件位置是否正确表达(例如路径里面的斜杠)


--  作者:Lexxuan
--  发布时间:9/10/2010 3:07:00 AM

--  
以下是引用micheal1在2010-9-6 10:44:00的发言:
你所构建的本体里面好像没有汉语 (有的本体构建软件,owl文件不能显示汉语而是显示数字编码,你知道什么软件能让它显示汉语吗?我用的是protege4.1),查询时,jena能够实现数字编码反编译成汉字吗?谢谢

你好。本人没试过用中文构建本体,所以并不知道其对中文的兼容性。印象中这个论坛挺多关于中文本体的老帖,翻翻可能有收获


--  作者:storm_xp2008
--  发布时间:9/20/2010 9:37:00 PM

--  
为什么下载不下来?老大,速度滴
--  作者:hanyonghua6
--  发布时间:11/9/2010 10:27:00 AM

--  
我也有在JSP页面输出本体查询结果的想法,但是不知该怎么实现,有什么思路的话希望得到指教,谢谢~
--  作者:fsfhappy
--  发布时间:12/29/2010 4:44:00 PM

--  
以下是引用fsfhappy在2010-12-29 16:43:00的发言:
我跟你一样的问题,互相学习
qq407478731


--  作者:fufengrui
--  发布时间:12/31/2010 8:52:00 PM

--  
解决不了protege中文问题,有知道的没?谢谢
--  作者:pjohn2003
--  发布时间:1/1/2011 8:54:00 AM

--  
不错,刚好需要,谢谢。
--  作者:fsfhappy
--  发布时间:1/5/2011 10:57:00 AM

--  
代码还有没有?
我现在是protege4建立的本体,想做先解析owl文件,做推理查询之类的。请教下你
qq:407478731
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
234.375ms