diff --git a/QueryRewriting/src/main/java/checker/ExplanationsExtractor.java b/QueryRewriting/src/main/java/checker/ExplanationsExtractor.java index cfbeac9..5636d24 100755 --- a/QueryRewriting/src/main/java/checker/ExplanationsExtractor.java +++ b/QueryRewriting/src/main/java/checker/ExplanationsExtractor.java @@ -1,7 +1,6 @@ package checker; import config.Configuration; -import de.mpii.datastructures.Fact; import extendedsldnf.EvaluatorFactory; import extendedsldnf.RecSLDEvaluator; import extendedsldnf.datastructure.IExtendedFacts; @@ -9,10 +8,7 @@ import extendedsldnf.datastructure.InputQuery; import extendedsldnf.datastructure.TextualSource; import org.deri.iris.ConfigurationThreadLocalStorage; -import org.deri.iris.api.basics.IQuery; import org.deri.iris.api.basics.IRule; -import org.deri.iris.compiler.Parser; -import org.deri.iris.compiler.ParserException; import org.deri.iris.evaluation.IEvaluationStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/QueryRewriting/src/main/java/checker/ExplanationsExtractorDemo.java b/QueryRewriting/src/main/java/checker/ExplanationsExtractorDemo.java new file mode 100755 index 0000000..ae40074 --- /dev/null +++ b/QueryRewriting/src/main/java/checker/ExplanationsExtractorDemo.java @@ -0,0 +1,215 @@ +package checker; + +import config.Configuration; +import extendedsldnf.EvaluatorFactory; +import extendedsldnf.RecSLDEvaluator; +import extendedsldnf.datastructure.IExtendedFacts; +import extendedsldnf.datastructure.IQueryExplanations; +import extendedsldnf.datastructure.InputQuery; +import extendedsldnf.datastructure.TextualSource; +import org.deri.iris.ConfigurationThreadLocalStorage; +import org.deri.iris.api.basics.IRule; +import org.deri.iris.evaluation.IEvaluationStrategy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import text.FactSpottingConnector; +import text.ITextConnector; +import utils.DataUtils; + +import javax.inject.Singleton; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Created by gadelrab on 3/22/17. + */ +@Singleton +public class ExplanationsExtractorDemo implements IDeepChecker/**/ { + + + private static final ExplanationsExtractorDemo explanationsExtractor=new ExplanationsExtractorDemo(); + + private IEvaluationStrategy evaluationStrategy; + private Logger logger = LoggerFactory.getLogger(getClass()); + +// /** +// * The engine used to spot facts +// */ +// private IFactSpotter factIFactSpotter; + + + /** + * Rewriting defaultRules (iris defaultRules) + * + */ + private List defaultRules; + + /** + * Facts (iris facts) + */ +// private Map factsMap; + private HashMap factSources; + + + /** + * FactChecking with Rewriting configuration + */ + private Configuration config; + + + /** + *KB (Where reasoning is performed... according to IRIS implementation) + * Knowledge base objects hides the process of applying reasoners on the facts + * It should be removed later + */ + //private IKnowledgeBase knowledgeBase; + + // Evalautor + + + /** + * textual sources interface + */ + private HashMap textualSource=new HashMap<>(); + + + + + private ExplanationsExtractorDemo() { + // load Config + config= Configuration.getInstance(); + // Store the configuration object against the current thread. + ConfigurationThreadLocalStorage.setConfiguration(config); + + + // Load Rules + defaultRules =DataUtils.loadRules(config.getRulesFiles()); + + if (logger.isDebugEnabled()) { + logger.debug("IRIS knowledge-base init"); + logger.debug("========================"); + + for (IRule rule : defaultRules) { + logger.debug(rule.toString()); + } + + logger.debug("------------------------"); + } + + //Create KB + //knowledgeBase= KnowledgeBaseFactory.createKnowledgeBase(factsMap,defaultRules,config); + + + // Load facts + //TODO create loader for several KGS (done but to be refactored) + factSources.put("yago",DataUtils.loadFacts(config,config.getKgsDirectory()+ File.separator+"yago.tsv")); + + + + + + + + +// Init evaluation Strategy .. useful if we are going to optimize the program +// if (config.programOptmimisers.size() > 0) +// evaluationStrategy = new OptimisedProgramStrategyAdaptor(facts, +// defaultRules, config); +// else +// evaluationStrategy = config.evaluationStrategyFactory +// .createEvaluator(facts, defaultRules, config); + + + System.out.println("Extractor initialized!"); + + } + + public static synchronized ExplanationsExtractorDemo getInstance(){ + return explanationsExtractor; + } + + @Override + public IQueryExplanations check(InputQuery query) { +// try { +// +// // return (IExplaination) evaluationStrategy.evaluateQuery(query,null); +// ExtendedSLDNFEvaluator evaluator ; +// EvaluatorFactory evaluatorFactory=new EvaluatorFactory(config); +// evaluator = evaluatorFactory.getEvaluator(facts, defaultRules); +// IQueryExplanations relation = evaluator.getExplanation(query); +// return relation; +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return null; + + return check(query, new HashSet<>()); + } + + @Override + public IQueryExplanations check(InputQuery query,Collection specificRules) { + try { + System.out.println("Query : "+query.toString()); + // return (IExplaination) evaluationStrategy.evaluateQuery(query,null); + List rules=new LinkedList<>(defaultRules); + rules.addAll(specificRules); + + + RecSLDEvaluator evaluator ; + EvaluatorFactory evaluatorFactory=new EvaluatorFactory(config); + List usedFactSources = getUsedFactResources(query.getKgs());//getUsedFactResources(Arrays.asList("yago", "dbpedia")); + List usedTextualResources = getUsedTextualResources(query.getTextualSources());//getUsedTextualResources(Arrays.asList("wiki", "bing")); +// evaluator = evaluatorFactory.getEvaluator(facts, rules); + evaluator = evaluatorFactory.getEvaluator(usedFactSources, usedTextualResources, rules, query.getMaxExplanations(),query.getMaxRules()); + IQueryExplanations relation = evaluator.getExplanation(query.getIQuery()); + return relation; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private List getUsedTextualResources(List textualSources) { + return Arrays.asList(new FactSpottingConnector(config)); + } +// +// @Override +// public IQueryExplanations check(Fact fact, Collection ruleSet) { +// +// Parser parser = new Parser(); +// try { +// parser.parse(fact.getIRISQueryRepresenation()); +// IQuery query = parser.getQueries().get(0); +// return check(query,ruleSet); +// +// } catch (ParserException e) { +// e.printStackTrace(); +// } +// return null; +// } + + +// @Override +// public IQueryExplanations check(Fact fact) { +// return check(fact,new HashSet<>()); +// +// } + + private List getUsedFactResources(List kgs) { + return kgs.stream().map(s-> factSources.get(s)).collect(Collectors.toList()); + + } + + +// public void removeFactsFromKG(List queries) { +// for (IQuery q:queries) { +// for (ILiteral l:q.getLiterals()) { +// facts. +// +// } +// +// } +// } +} + diff --git a/WebService2/app/controllers/AsyncController.java b/WebService2/app/controllers/AsyncController.java deleted file mode 100755 index 8de29e3..0000000 --- a/WebService2/app/controllers/AsyncController.java +++ /dev/null @@ -1,65 +0,0 @@ -package controllers; - -import akka.actor.ActorSystem; -import javax.inject.*; - -import akka.actor.Scheduler; -import play.*; -import play.mvc.*; -import java.util.concurrent.Executor; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionStage; -import java.util.concurrent.TimeUnit; - -import scala.concurrent.ExecutionContext; -import scala.concurrent.duration.Duration; -import scala.concurrent.ExecutionContextExecutor; - -/** - * This controller contains an action that demonstrates how to write - * simple asynchronous code in a controller. It uses a timer to - * asynchronously delay sending a response for 1 second. - */ -@Singleton -public class AsyncController extends Controller { - - private final ActorSystem actorSystem; - private final ExecutionContextExecutor exec; - - /** - * @param actorSystem We need the {@link ActorSystem}'s - * {@link Scheduler} to run code after a delay. - * @param exec We need a Java {@link Executor} to apply the result - * of the {@link CompletableFuture} and a Scala - * {@link ExecutionContext} so we can use the Akka {@link Scheduler}. - * An {@link ExecutionContextExecutor} implements both interfaces. - */ - @Inject - public AsyncController(ActorSystem actorSystem, ExecutionContextExecutor exec) { - this.actorSystem = actorSystem; - this.exec = exec; - } - - /** - * An action that returns a plain text message after a delay - * of 1 second. - * - * The configuration in the routes file means that this method - * will be called when the application receives a GET request with - * a path of /message. - */ - public CompletionStage message() { - return getFutureMessage(1, TimeUnit.SECONDS).thenApplyAsync(Results::ok, exec); - } - - private CompletionStage getFutureMessage(long time, TimeUnit timeUnit) { - CompletableFuture future = new CompletableFuture<>(); - actorSystem.scheduler().scheduleOnce( - Duration.create(time, timeUnit), - () -> future.complete("Hi!"), - exec - ); - return future; - } - -} diff --git a/WebService2/app/controllers/Evaluation.java b/WebService2/app/controllers/Evaluation.java deleted file mode 100755 index b4054f2..0000000 --- a/WebService2/app/controllers/Evaluation.java +++ /dev/null @@ -1,63 +0,0 @@ -//package controllers; -// -//import com.google.inject.Inject; -//import extendedsldnf.datastructure.QueryExplanations; -//import io.ebean.Ebean; -//import io.ebean.EbeanServer; -//import Query; -//import org.jongo.Jongo; -//import org.jongo.MongoCollection; -//import play.api.Play; -//import play.data.FormFactory; -//import play.db.ebean.EbeanConfig; -//import play.mvc.Controller; -//import play.mvc.Result; -//import views.html.evaluation; -// -//public class Evaluation extends Controller { -// -//// @Inject -// private final FormFactory formFactory;//=Play.current().injector().instanceOf(FormFactory.class);; -//// private final EbeanServer ebeanServer; -// -//// @Inject -//// private final Jongo jongo;//= Play.current().injector().instanceOf(Jongo.class); -// -// -// -// @Inject -// public Evaluation(final FormFactory formFactory, EbeanConfig ebeanConfig) { -//// this.jongo=jongo; -// this.ebeanServer =Ebean.getServer(ebeanConfig.defaultServer()); -// this.formFactory = formFactory; -// } -// -// -//// private MongoCollection explanations() { -//// return jongo.getCollection("explanations"); -//// } -// -// -// -//// public Query findByName(String query) { -//// return explanations().findOne("{query: #}", query).as(Query.class); -//// } -// -// public Result index() { -// -// ebeanServer.save(new models.QueryExplanations("test")); -// -//// Query query=findByName("?- actedWith('', '')."); -// Query exampleQ = new Query("", "", "", "wasBornIn(?x,?y):- birthPlace(?x,?z), in(?z,?y).\nwasBornIn(?x,?y):- birthPlace(?x,?z), city_in(?z,?y)."); -//// return ok(evaluation.render(query,query.getQueryExplanations())); -// return ok(evaluation.render(exampleQ,exampleQ.explain())); -// } -// -// -// -// -// -// -// -// -//} diff --git a/WebService2/app/controllers/Explanations.java b/WebService2/app/controllers/Explanations.java index e22dc17..3a66d9b 100755 --- a/WebService2/app/controllers/Explanations.java +++ b/WebService2/app/controllers/Explanations.java @@ -87,7 +87,10 @@ public Result explain(){ InputQuery inputQuery=new InputQuery(new BinaryFact(q.getSubject(),q.getPredicate(),q.getObject()),0,0); inputQuery.setTextualSources(q.getTextualSources()); - inputQuery.setKg(q.getKg()); + inputQuery.setKgs(q.getKgs()); + inputQuery.setMaxExplanations(q.getNumOfexplan()); + inputQuery.setMaxRules(q.getNumOfRules()); + IQueryExplanations explanations = explanationsExtractor.check( inputQuery,ruleList);