001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package org.mandarax.examples.db;
020:
021: import java.io.File;
022: import org.mandarax.kernel.*;
023: import org.mandarax.reference.ResolutionInferenceEngine;
024: import org.mandarax.util.LogicFactorySupport;
025: import org.mandarax.zkb.*;
026:
027: /**
028: * A class that shows the integration of knowledge base in application programs.
029: * The knowledge base is loaded from the file generated by CreateKB and then queried.
030: * The results of the queries are printed to the console.
031: * <p>
032: * Mandarax uses other (open source) libraries such as JDOM, the apache log4j
033: * logging library and the junit testing framework. The mandarax distribution
034: * contains the respective libraries. Please but these jar files in the classpath
035: * before running the example! In addition, the JDBC driver for the database used must
036: * also be in the classpath.
037: * @since 2.2
038: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
039: * @version 3.4 <7 March 05>
040: */
041: public class LoadAndQueryKB {
042: private KnowledgeBase kb = null;
043: private LogicFactorySupport lfs = new LogicFactorySupport();
044: private InferenceEngine ie = new ResolutionInferenceEngine();
045:
046: /**
047: * Load the knowledge base and query it.
048: */
049: public static void main(String[] args) {
050: // uncomment the following line to switch on logging
051: // org.apache.log4j.BasicConfigurator.configure();
052:
053: LoadAndQueryKB inst = new LoadAndQueryKB();
054: inst.loadKB();
055: inst.calculateDiscount("Tom");
056: inst.calculateDiscount("John");
057: inst.calculateDiscount("Jim");
058: inst.calculateDiscount("Ralf");
059: inst.calculateDiscount("Bill");
060: }
061:
062: /**
063: * Load a knowledge base from the XML file.
064: */
065: public void loadKB() {
066: ZKBManager zkbManager = new ZKBManager();
067: try {
068: kb = zkbManager.importKnowledgeBase(new File("kb.zip"));
069: System.out.println("Knowledge base loaded from kb.zip");
070: } catch (ZKBException x) {
071: System.err
072: .println("Cannot import knowledge base from kb.zip - use CreateKB to generate knowledge base !");
073: x.printStackTrace();
074: }
075: }
076:
077: /**
078: * Query a knowledge base for the discount of a particular customer.
079: * @param customer a customer (name)
080: * @return a discount
081: */
082: public void calculateDiscount(String customerName) {
083: // build query
084: Class[] struct = { String.class, Discount.class };
085: VariableTerm queryVariable = (VariableTerm) lfs.variable(
086: "discount", Discount.class);
087: Predicate p = new SimplePredicate("a customer gets a discount",
088: struct);
089: Query query = lfs.query(lfs
090: .fact(p, customerName, queryVariable),
091: "get discount for " + customerName);
092:
093: // issue query
094: try {
095: ResultSet rs = ie.query(query, kb, InferenceEngine.ONE,
096: InferenceEngine.BUBBLE_EXCEPTIONS);
097: Discount discount = null;
098: while (rs.next()) {
099: discount = (Discount) rs.getResult(queryVariable);
100: System.out.println("The discount for " + customerName
101: + " is " + discount);
102: }
103: } catch (InferenceException x) {
104: System.out.println("Cannot compute discount for "
105: + customerName);
106: x.printStackTrace();
107: }
108: }
109: }
|