/* * Author: Gadamer Marcin (MIW 04.2008) * * Any use, copying, modification, distribution and selling of this software * and its documentation for any purposes without author's written permission * is hereby prohibited * */ package pl.gadamer.marcin.miw.jena.termostat.first; import java.util.Iterator; import java.util.List; import com.hp.hpl.jena.rdf.model.InfModel; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.reasoner.Reasoner; import com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner; import com.hp.hpl.jena.reasoner.rulesys.Rule; public class JenaRulesEngine { static String baseURI = "http://uri#"; public static void main(String[] args) { System.out.println(">>> Start Jena Rules <<<"); //data to run rules String day = "wednesday"; String hour = "h23"; String month = "february"; System.out.println("Data:"); System.out.println("day: " + day + "\thour: " + hour + "\tmonth: " + month); //creating new model Model model = ModelFactory.createDefaultModel(); // creating day Resource dayResource = model.createResource(baseURI + "day"); Property dayProperty = model.createProperty(baseURI + day); dayResource.addProperty(dayProperty, dayResource); // creating time Resource hourResource = model.createResource(baseURI + "hour"); Property hourProperty = model.createProperty(baseURI + hour); hourResource.addProperty(hourProperty, hourResource); // creating month Resource monthResource = model.createResource(baseURI + "month"); Property monthProperty = model.createProperty(baseURI + month); monthResource.addProperty(monthProperty, monthResource); System.out.println("\n\n\nCreated model (RDF):"); model.write(System.out); //creating Jena rules //days: String ruleSrc = " [ruleD1: (?a http://uri#monday ?b) -> (?a http://uri#monday http://uri#workday)]" + " [ruleD2: (?a http://uri#tuesday ?b) -> (?a http://uri#tuesday http://uri#workday)]" + " [ruleD3: (?a http://uri#wednesday ?b) -> (?a http://uri#wednesday http://uri#workday)]" + " [ruleD4: (?a http://uri#thursday ?b) -> (?a http://uri#thursday http://uri#workday)]" + " [ruleD5: (?a http://uri#friday ?b) -> (?a http://uri#friday http://uri#workday)]" + " [ruleD6: (?a http://uri#saturday ?b) -> (?a http://uri#saturday http://uri#weekend)]" + " [ruleD7: (?a http://uri#sunday ?b) -> (?a http://uri#sunday http://uri#weekend)]" // time: between 9 am and 5 pm + " [ruleT10: (?x http://uri#h10 ?h) -> (?x http://uri#h10 http://uri#beetwen)]" + " [ruleT11: (?x http://uri#h11 ?h) -> (?x http://uri#h11 http://uri#beetwen)]" + " [ruleT12: (?x http://uri#h12 ?h) -> (?x http://uri#h12 http://uri#beetwen)]" + " [ruleT13: (?x http://uri#h13 ?h) -> (?x http://uri#h13 http://uri#beetwen)]" + " [ruleT14: (?x http://uri#h14 ?h) -> (?x http://uri#h14 http://uri#beetwen)]" + " [ruleT15: (?x http://uri#h15 ?h) -> (?x http://uri#h15 http://uri#beetwen)]" + " [ruleT16: (?x http://uri#h16 ?h) -> (?x http://uri#h16 http://uri#beetwen)]" // time: before 9 am and after 5 pm + " [ruleT17: (?x http://uri#h17 ?h) -> (?x http://uri#h17 http://uri#out)]" + " [ruleT18: (?x http://uri#h18 ?h) -> (?x http://uri#h18 http://uri#out)]" + " [ruleT19: (?x http://uri#h19 ?h) -> (?x http://uri#h19 http://uri#out)]" + " [ruleT20: (?x http://uri#h20 ?h) -> (?x http://uri#h20 http://uri#out)]" + " [ruleT21: (?x http://uri#h21 ?h) -> (?x http://uri#h21 http://uri#out)]" + " [ruleT22: (?x http://uri#h22 ?h) -> (?x http://uri#h22 http://uri#out)]" + " [ruleT23: (?x http://uri#h23 ?h) -> (?x http://uri#h23 http://uri#out)]" + " [ruleT0: (?x http://uri#h0 ?h) -> (?x http://uri#h0 http://uri#out)]" + " [ruleT1: (?x http://uri#h1 ?h) -> (?x http://uri#h1 http://uri#out)]" + " [ruleT2: (?x http://uri#h2 ?h) -> (?x http://uri#h2 http://uri#out)]" + " [ruleT3: (?x http://uri#h3 ?h) -> (?x http://uri#h3 http://uri#out)]" + " [ruleT4: (?x http://uri#h4 ?h) -> (?x http://uri#h4 http://uri#out)]" + " [ruleT5: (?x http://uri#h5 ?h) -> (?x http://uri#h5 http://uri#out)]" + " [ruleT6: (?x http://uri#h6 ?h) -> (?x http://uri#h6 http://uri#out)]" + " [ruleT7: (?x http://uri#h7 ?h) -> (?x http://uri#h7 http://uri#out)]" + " [ruleT8: (?x http://uri#h8 ?h) -> (?x http://uri#h8 http://uri#out)]" + " [ruleT9: (?x http://uri#h9 ?h) -> (?x http://uri#h9 http://uri#out)]" // getting day and hour + " [ruleGDH1: (?gdh1gd http://uri#" + day + " http://uri#workday),(?gdh1gh http://uri#" + hour + " http://uri#beetwen) -> (http://uri#operation http://uri#mode http://uri#during)]" + " [ruleGDH2: (?gdh2gd http://uri#" + day + " http://uri#workday),(?gdh2gh http://uri#" + hour + " http://uri#out) -> (http://uri#operation http://uri#mode http://uri#notDuring)]" + " [ruleGDH2: (?gdh3gd http://uri#" + day + " http://uri#weekend) -> (http://uri#operation http://uri#mode http://uri#notDuring)]" //months: + " [ruleS12: (?s12s1 http://uri#december ?s12s2) -> (?s12s1 http://uri#december http://uri#summer)]" + " [ruleS1: (?s1s1 http://uri#january ?s1s2) -> (?s1s1 http://uri#january http://uri#summer)]" + " [ruleS2: (?s2s1 http://uri#february ?s2s2) -> (?s2s1 http://uri#february http://uri#summer)]" + " [ruleS3: (?s3s1 http://uri#march ?s3s2) -> (?s3s1 http://uri#march http://uri#autumn)]" + " [ruleS4: (?s4s1 http://uri#april ?s4s2) -> (?s4s1 http://uri#april http://uri#autumn)]" + " [ruleS5: (?s5s1 http://uri#may ?s5s2) -> (?s5s1 http://uri#may http://uri#autumn)]" + " [ruleS6: (?s6s1 http://uri#june ?s6s2) -> (?s6s1 http://uri#june http://uri#winter)]" + " [ruleS7: (?s7s1 http://uri#july ?s7s2) -> (?s7s1 http://uri#july http://uri#winter)]" + " [ruleS8: (?s8s1 http://uri#august ?s8s2) -> (?s8s1 http://uri#august http://uri#winter)]" + " [ruleS9: (?s9s1 http://uri#september ?s9s2) -> (?s9s1 http://uri#september http://uri#spring)]" + " [ruleS10: (?s10s1 http://uri#october ?s10s2) -> (?s10s1 http://uri#october http://uri#spring)]" + " [ruleS11: (?s11s1 http://uri#november ?s11s2) -> (?s11s1 http://uri#november http://uri#spring)]" //getting month and operation + " [ruleGMO1: (?gmo1gm http://uri#" + month + " http://uri#spring),(?gmo1go http://uri#mode http://uri#during) -> (http://uri#temperature http://uri#set http://uri#20)]" + " [ruleGMO2: (?gmo2gm http://uri#" + month + " http://uri#spring),(?gmo2go http://uri#mode http://uri#notDuring) -> (http://uri#temperature http://uri#set http://uri#15)]" + " [ruleGMO3: (?gmo3gm http://uri#" + month + " http://uri#summer),(?gmo3go http://uri#mode http://uri#during) -> (http://uri#temperature http://uri#set http://uri#24)]" + " [ruleGMO4: (?gmo4gm http://uri#" + month + " http://uri#summer),(?gmo4go http://uri#mode http://uri#notDuring) -> (http://uri#temperature http://uri#set http://uri#27)]" + " [ruleGMO5: (?gmo5gm http://uri#" + month + " http://uri#autumn),(?gmo5go http://uri#mode http://uri#during) -> (http://uri#temperature http://uri#set http://uri#20)]" + " [ruleGMO6: (?gmo6gm http://uri#" + month + " http://uri#autumn),(?gmo6go http://uri#mode http://uri#notDuring) -> (http://uri#temperature http://uri#set http://uri#16)]" + " [ruleGMO7: (?gmo7gm http://uri#" + month + " http://uri#winter),(?gmo7go http://uri#mode http://uri#during) -> (http://uri#temperature http://uri#set http://uri#18)]" + " [ruleGMO8: (?gmo8gm http://uri#" + month + " http://uri#winter),(?gmo8go http://uri#mode http://uri#notDuring) -> (http://uri#temperature http://uri#set http://uri#14)]"; List rules = Rule.parseRules(ruleSrc); Reasoner reasoner = new GenericRuleReasoner(rules); InfModel inf = ModelFactory.createInfModel(reasoner, model); System.out.println("\n\n\nDeduction model (RDF):"); inf.getDeductionsModel().write(System.out); System.out.println("\n\n\nDeduction model presented in N3:"); Iterator list = inf.listStatements(null, null, (RDFNode) null); while (list.hasNext()) { System.out.println(" - " + list.next()); } } }