public static ExpandPath create(int n){ return new ExpandPath(n); }
/** * rec create a path bgp of length n between s and o * s exp(n) o = * {s exp o} union {s exp vi . vi exp(n-1) o} * generate filter to prevent loops on intermediate nodes (vi != vj) */ private Exp loop(Atom subject, Expression exp, Atom object, List<Variable> list, int n){ Exp res = ast.createPath(subject, exp, object); if (n <= 1){ return res; } Variable var = variable(); Term diff = filter(var, list); list.add(var); Exp e1 = ast.createPath(subject, exp, var); Exp e2 = loop(var, exp, object, list, n-1); BasicGraphPattern bgp = BasicGraphPattern.create(e1); if (diff != null){ bgp.add(Triple.create(diff)); } bgp.add(e2); Or or = Or.create(res, bgp); return or; }
public void visit(ASTQuery ast) { rewrite(ast); }
/** * ! ex:p1 * ! (ex:p1 | ex:p2) * -> * ?x ?p ?y . filter(?p != ex:p1) */ private Exp not(Triple t, Expression not){ Expression exp = not.getArg(0); Variable p = variable(); Triple tt = Triple.create(t.getSubject(), p, t.getObject()); BasicGraphPattern bgp = BasicGraphPattern.create(tt); Expression f = null; if (exp.isConstant()){ // ! p f = Term.create(NEQ, p, exp); } else { // ! (p1 | p2) for (Expression ee : exp.getArgs()){ Term g = Term.create(NEQ, p, ee); f = and(f, g); } } bgp.add(Triple.create(f)); return bgp; }
/** * Expression loop is exp+ or exp* * exp* rewritten as exp+ except in the case e1/e2* where it is correctly rewritten */ private Exp loop(Triple t, Expression loop){ return loop(t.getSubject(), loop.getArg(0), t.getObject(), new ArrayList<Variable>(), max); }
/** * rec create a path bgp of length n between s and o * s exp(n) o = * {s exp o} union {s exp vi . vi exp(n-1) o} * generate filter to prevent loops on intermediate nodes (vi != vj) */ private Exp loop(Atom subject, Expression exp, Atom object, List<Variable> list, int n){ Exp res = ast.createPath(subject, exp, object); if (n <= 1){ return res; } Variable var = variable(); Term diff = filter(var, list); list.add(var); Exp e1 = ast.createPath(subject, exp, var); Exp e2 = loop(var, exp, object, list, n-1); BasicGraphPattern bgp = BasicGraphPattern.create(e1); if (diff != null){ bgp.add(Triple.create(diff)); } bgp.add(e2); Union or = Union.create(res, bgp); return or; }
public void visit(ASTQuery ast) { rewrite(ast); }
/** * ! ex:p1 * ! (ex:p1 | ex:p2) * -> * ?x ?p ?y . filter(?p != ex:p1) */ private Exp not(Triple t, Expression not){ Expression exp = not.getArg(0); Variable p = variable(); Triple tt = Triple.create(t.getSubject(), p, t.getObject()); BasicGraphPattern bgp = BasicGraphPattern.create(tt); Expression f = null; if (exp.isConstant()){ // ! p f = Term.create(NEQ, p, exp); } else { // ! (p1 | p2) for (Expression ee : exp.getArgs()){ Term g = Term.create(NEQ, p, ee); f = and(f, g); } } bgp.add(Triple.create(f)); return bgp; }
/** * Expression loop is exp+ or exp* * exp* rewritten as exp+ except in the case e1/e2* where it is correctly rewritten */ private Exp loop(Triple t, Expression loop){ return loop(t.getSubject(), loop.getArg(0), t.getObject(), new ArrayList<Variable>(), max); }
public static ExpandPath create(){ return new ExpandPath(); }
public static ExpandPath create(){ return new ExpandPath(); }
/** * Rewrite path as BGP * Modify exp (no copy is done) */ public Exp rewrite(Exp exp){ if (ast == null){ ast = ASTQuery.create(); } if (exp.isTriple()){ Triple t = exp.getTriple(); if (t.isPath()){ return rewrite(t, t.getRegex()); } } else if (exp.isQuery()){ rewrite(exp.getQuery().getBody()); } else for (int i=0; i<exp.size(); i++){ exp.set(i, rewrite(exp.get(i))); } return exp; }
public static ExpandPath create(int n){ return new ExpandPath(n); }
/** * Rewrite path as BGP * Modify exp (no copy is done) */ public Exp rewrite(Exp exp){ if (ast == null){ ast = ASTQuery.create(); } if (exp.isTriple()){ Triple t = exp.getTriple(); if (t.isPath()){ return rewrite(t, t.getRegex()); } } else if (exp.isQuery()){ rewrite(exp.getQuery().getBody()); } else for (int i=0; i<exp.size(); i++){ exp.set(i, rewrite(exp.get(i))); } return exp; }