package edu.stanford.nlp.sempre.freebase; import edu.stanford.nlp.sempre.*; import com.google.common.base.Function; import fig.basic.LispTree; import fig.basic.LogInfo; import fig.basic.Option; import fig.exec.Execution; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Executes all examples and reports any badness. * Was used to prepare the Free917 dataset. * * @author Percy Liang */ public class ExecuteExamples implements Runnable { @Option(required = true, gloss = "Input path to examples to canonicalize") public List<String> examplesPaths; SparqlExecutor executor; Map<Formula, Executor.Response> cache = new HashMap<Formula, Executor.Response>(); private boolean queryReturnsResults(Formula formula) { // If counting, look inside to make sure the actual set is non-empty. if (formula instanceof AggregateFormula) formula = ((AggregateFormula) formula).child; Executor.Response response = cache.get(formula); if (response == null) cache.put(formula, response = executor.execute(formula, null)); if (!(response.value instanceof ListValue) || ((ListValue) response.value).values.size() == 0) { LogInfo.logs("BAD QUERY: %s => %s", formula, response.value); return false; } else { LogInfo.logs("GOOD QUERY: %s => %s", formula, response.value); return true; } } // Test each individual nested NameFormula. public Formula test(Formula formula) { return formula.map( new Function<Formula, Formula>() { public Formula apply(Formula formula) { String name = Formulas.getNameId(formula); if (name != null) { if (name.startsWith("!")) name = name.substring(1); queryReturnsResults(Formulas.newNameFormula(name)); } return null; } }); } public void run() { executor = new SparqlExecutor(); for (String path : examplesPaths) { Iterator<LispTree> it = LispTree.proto.parseFromFile(path); while (it.hasNext()) { LispTree tree = it.next(); if (!"example".equals(tree.child(0).value)) throw new RuntimeException("Bad: " + tree); for (int i = 1; i < tree.children.size(); i++) { if ("targetFormula".equals(tree.child(i).child(0).value)) { Formula formula = Formulas.fromLispTree(tree.child(i).child(1)); formula = test(formula); queryReturnsResults(formula); } } } } } public static void main(String[] args) { Execution.run(args, new ExecuteExamples(), "SparqlExecutor", SparqlExecutor.opts); } }