以文本方式查看主题 - 中文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(); 附件里面有本代码应用到的三个本体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 --
构造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 --
。。。。。。 首先,创造本体可以用很多工具,记事本也是可以的.......当然用记事本写程序也是可以.......但是绝对不推荐....... 其次,下载Jena包,设classpath,在比如Eclipse下写程序,程序中读入本体文件......如果程序不能正常运行,可以再在java项目下把Jena包全部加载进去 |
-- 作者:Lexxuan -- 发布时间:5/29/2009 8:27:00 PM --
本人没尝试过在jsp页面上输出,理论上当然可以,加油! |
-- 作者:Lexxuan -- 发布时间:5/29/2009 8:35:00 PM --
本体编辑工具Hozo本人没用过,毕竟本体方面的软件很多 画图有更多的软件。比如Visio。 比如也可以直接在protege的OWLViz下截图再加别的东西进去 |
-- 作者:springbird -- 发布时间:5/29/2009 8:59:00 PM -- 谢谢楼主,毕竟我也是刚接触本体,是用hozo建本体的,可是建出来后缀是.ont,好像用jena解析时不行 |
-- 作者:Lexxuan -- 发布时间:5/29/2009 10:08:00 PM --
尝试找找看有没有.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 --
为什么不用Protege建本体? |
-- 作者:yhw0503 -- 发布时间:8/9/2010 4:52:00 PM -- 为什么读不进pretege中呢 |
-- 作者:Lexxuan -- 发布时间:8/9/2010 10:14:00 PM --
应该可以的。很久没用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 --
光从错误信息很难判断哪里错了。注意文件位置是否正确表达(例如路径里面的斜杠) |
-- 作者:Lexxuan -- 发布时间:9/10/2010 3:07:00 AM --
你好。本人没试过用中文构建本体,所以并不知道其对中文的兼容性。印象中这个论坛挺多关于中文本体的老帖,翻翻可能有收获 |
-- 作者: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 --
|
-- 作者: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 |