/** * 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; }
/** * 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; }
/** * ! 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; }
/** * ! 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; }
Variable var = variable(); Exp e1 = ast.createPath(t.getArg(0), exp.getArg(0), var); Exp e2 = ast.createPath(var, exp.getArg(1), t.getArg(1));
Variable var = variable(); Exp e1 = ast.createPath(t.getArg(0), exp.getArg(0), var); Exp e2 = ast.createPath(var, exp.getArg(1), t.getArg(1));