一,使用Jena对OWL本体进行查询推理
前面在"使用jena持久化OWL本体到MySQL(http://bbs.w3china.org/dispbbs.asp?boardID=2&ID=60494)"中说到了把OWL本体在MySQL中的存取,现在终于能做些简单推理了。要主要规则和查询语句的语法。
使用sparql对本体进行查询
1)InfModel是对常规Model的扩展,支持任何相关的推理能力
2)QueryExecution 执行sparql查询
3)ResultSetFormatter 获取查询结果集
4)实例中使用了本体文件Experts.owl
二,下面是一个简单的例子:
- public class ReasonerImpl implements IReasoner {
- private InfModel inf = null;
- /**
- * 获取一个推理接口
- * @param path
- * @return
- * @throws RulesetNotFoundException
- */
- private GenericRuleReasoner getReasoner(String path) throws RulesetNotFoundException {
- List<Rule> rules = Rule.rulesFromURL(path); //"file:./family/family.rules"
- GenericRuleReasoner reasoner = new GenericRuleReasoner(rules);
- reasoner.setOWLTranslation(true);
- reasoner.setDerivationLogging(true);
- reasoner.setTransitiveClosureCaching(true);
- return reasoner;
- }
- /**
- * 获取推理的本体
- * @param path
- * @return
- */
- private OntModel getOntModel(String path) {
- Model model = ModelFactory.createDefaultModel();
- model.read(path); //"file:./family/family.owl"
- OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RDFS_INF,
- model);
- Resource configuration = ont.createResource(); //a new anonymous resource linked to this model
- configuration.addProperty(ReasonerVocabulary.PROPruleMode
- , "hybrid");
- return ont;
- }
- /**
- * InfModel是对常规Model的扩展,支持任何相关的推理能力
- * @param ontPath
- * @param rulePath
- * @return
- */
- public InfModel getInfModel(String rulePath, String ontPath) {
- this.inf = ModelFactory.createInfModel(getReasoner(rulePath), getOntModel(ontPath));
- return this.inf;
- }
- /**
- * InfModel是对常规Model的扩展,支持任何相关的推理能力
- * @param model
- * @param rulePath
- * @return
- */
- public InfModel getInfModel(String rulePath, OntModel model) {
- this.inf = ModelFactory.createInfModel(getReasoner(rulePath), model);
- return this.inf;
- }
- /**
- * 打印推理结果
- * @param a
- * @param b
- */
- public void printInferResult(Resource a, Resource b) {
- StmtIterator stmtIter = this.inf.listStatements(a, null, b);
- if (!stmtIter.hasNext()) {
- System.out.println("there is no relation between "
- + a.getLocalName() + " and " + b.getLocalName());
- System.out.println("\n-------------------\n");
- }
- while (stmtIter.hasNext()) {
- Statement s = stmtIter.nextStatement();
- System.out.println("Relation between " + a.getLocalName() + " and "
- + b.getLocalName() + " is :");
- System.out.println(a.getLocalName() + " "
- + s.getPredicate().getLocalName() + " " + b.getLocalName());
- System.out.println("\n-------------------\n");
- }
- }
- public void searchOnto(String queryString) {
- Query query = QueryFactory.create(queryString);
- QueryExecution qe = QueryExecutionFactory.create(query, this.inf);
- ResultSet results = qe.execSelect();
- ResultSetFormatter.out(System.out, results, query);
- qe.close();
- }
- }
执行查询语句
- public static void testQuery() {
- String ruleFile = "file:./expert/Expert.rules";
- String ontoFile = "file:./expert/Expert.owl";
- String queryString = "PREFIX Expert:<http://www.owl-ontologies.com/Expert.owl#> " +
- "SELECT ?expert ?subject " +
- "WHERE {?expert Expert:familiar_with ?subject} ";
- IReasoner famRea = ReasonerFactory.createFamilyReasoner();
- famRea.getInfModel(ruleFile, ontoFile);
- famRea.searchOnto(queryString);
- }
查询结果为:
- ------------------------------------------------------------
- | expert | subject |
- ============================================================
- | Expert:ChenJianer | Expert:Computer_Software_and_Theory |
- | Expert:ZhaoHongJie | Expert:Computer_Applied_Technology |
- ------------------------------------------------------------
源代码下载:http://download.youkuaiyun.com/detail/welcome000yy/4770085