MatchIterator(Iterable<Edge> it, Node g, Edge e, Graph graph, Environment env, Matcher m) { ii = it; match = m; edge = e; gNode = g; this.graph = graph; this.env = env; if (gNode == null) { table = new Table(); } else { gtable = new GTable(); } isCheckType = graph.getProxy().isType(e) && m.getMode() != Matcher.RELAX && e.getNode(1).isConstant(); }
/** * n is the index in Exp stack where Node is bound */ boolean push(Node node, Node target, int n) { if (node.isConstant()) { return true; } int index = node.getIndex(); if (nodes[index] == null) { // (nbNodes[index] > 0){ nodes[index] = target; qNodes[index] = node; nbNode++; nbNodes[index]++; // exp stack index where node is bound stackIndex[index] = n; return true; } else if (target == null) { // may happen with aggregate or subquery return false; } else if (match.same(node, nodes[index], target, this)) { nbNodes[index]++; return true; } // Query node already bound but target not equal to binding // also process use case: ?x ?p ?p return false; }
public static QueryProcess create(Producer p) { Matcher match; if (p instanceof ProducerImpl) { ProducerImpl prod = (ProducerImpl) p; match = MatcherImpl.create(prod.getGraph()); prod.set(match); if (prod.isMatch()) { // there is local match in Producer // create global match with Relax mode match = MatcherImpl.create(prod.getGraph()); match.setMode(Matcher.RELAX); } } else { match = MatcherImpl.create(Graph.create()); match.setMode(Matcher.RELAX); } QueryProcess exec = QueryProcess.create(p, match); return exec; }
MatchIterator(Iterable<Edge> it, Node g, Edge e, Graph graph, Environment env, Matcher m) { ii = it; match = m; edge = e; gNode = g; this.graph = graph; this.env = env; if (gNode == null) { table = new Table(); } else { gtable = new GTable(); } isCheckType = graph.getProxy().isType(e) && m.getMode() != Matcher.RELAX && e.getNode(1).isConstant(); }
@Override public Edge next() { while (it.hasNext()) { Edge ent = it.next(); if (ent != null && match.match(edge, ent, env)) { if (isCheckType) { // ?x rdf:type ex:Person // keep one occurrence of each resource if (isFirst(ent)) { return ent; } } else { return ent; } } } return null; }
@Override public Edge next() { while (it.hasNext()) { Edge ent = it.next(); if (ent != null && match.match(edge, ent, env)) { if (isCheckType) { // ?x rdf:type ex:Person // keep one occurrence of each resource if (isFirst(ent)) { return ent; } } else { return ent; } } } return null; }
private boolean match(Mapping map) { int i = 0; Memory env = memory; Matcher mm = match; for (Node qNode : map.getQueryNodes()) { Node node = map.getNode(i++); if (!mm.match(qNode, node, env)) { return false; } } return true; }
/** * Check if target node match its query node and its binding */ private boolean check(Node n0, Node n1) { if (index == 0) { if (!matcher.match(edge.getNode(1), n1, memory)) { return false; } if (targetNode != null && !targetNode.match(n1)) { return false; } } else { if (!matcher.match(edge.getNode(0), n0, memory)) { return false; } if (targetNode != null && !targetNode.match(n0)) { return false; } } return true; }
for (Node graph : prod.getGraphNodes(gNode, qq.getFrom(gNode), env)) { if (//member(graph, query.getFrom(gNode)) && mm.match(gNode, graph, env) && env.push(gNode, graph, n)) { if (stop) {
if (mm.match(name, graph, env) && env.push(name, graph, n)) { Mappings m = graph(prod, exp, stack, map, n);
/** * Edge as Function use case: ?x xpath('/book/title') ?y */ private int eval(Node gNode, Exp exp, Stack stack, int n) { int backtrack = n - 1; Edge qEdge = exp.getEdge(); Node qNode = qEdge.getNode(1); Memory env = memory; Evaluator ev = evaluator; Matcher mm = match; for (Node node : ev.evalList(exp.getFilter(), env)) { if (mm.match(qNode, node, env) && env.push(qNode, node)) { backtrack = eval(gNode, stack, n + 1); env.pop(qNode); if (backtrack < n) { // if (hasEvent){ // send(Event.FINISH, exp, gNode, stack); // } return backtrack; } } } return backtrack; }
/** * Check occurrence of edge * If edge has an associated query, check class/property definition in ontology */ void edge(Node gNode, Exp exp, Environment env){ Edge edge = exp.getEdge(); boolean exist = false, match = false, define = false; for (Edge ent : producer.getEdges(gNode, query.getFrom(gNode), edge, env)){ if (ent != null){ exist = true; if (matcher.match(edge, ent, env)){ match = true; break; } } } Query q = query.get(edge); if (q != null){ Eval ee = Eval.create(producer, eval.getEvaluator(), matcher); Mappings map = ee.query(q); define = map.size()>0; report(edge, exist, match, define); } else { report(edge, exist, match); } }
if (!(mm.match(outNode, node, env) && env.push(outNode, node, n))) { for (int i = 0; i < k; i++) { subNode = subQuery.getSelect().get(i);