private void doOneOrMore(Path path) { // Do one, then do zero or more for each result. Iterator<Node> iter1 = eval(graph, node, path, forwardMode) ; // ORDER // Do zero or more. Set<Node> visited = new LinkedHashSet<Node>() ; for ( ; iter1.hasNext() ; ) { Node n1 = iter1.next(); closure(graph, n1, path, visited, forwardMode) ; } output.addAll(visited) ; }
public void visit(P_FixedLength pFixedLength) { // P_Mod(path, count, count) // One step. Iterator<Node> iter = eval(graph, node, pFixedLength.getSubPath(), forwardMode) ; long count2 = dec(pFixedLength.getCount()) ; P_FixedLength nextPath = new P_FixedLength(pFixedLength.getSubPath(), count2) ; for ( ; iter.hasNext() ; ) { Node n2 = iter.next() ; Iterator<Node> iter2 = eval(graph, n2, nextPath, forwardMode) ; fill(iter2) ; } }
public void visit(P_NegPropSet pathNotOneOf) { if ( pathNotOneOf.getBwdNodes().size() > 0 ) Log.warn(this, "Only forward negated property sets implemented") ; // X !(:a|:b|^:c|^:d) Y = { X !(:a|:b) Y } UNION { Y !(:c|:d) X } List<Node> props = pathNotOneOf.getFwdNodes() ; if ( props.size() == 0 ) throw new ARQException("Bad path element: Negative property set found with no elements") ; //Iterator<Node> nodes = doOneExclude(pathNotOneOf.getFwdNodes(), pathNotOneOf.getBwdNodes()) ; Iterator<Node> nodes = doOneExclude(pathNotOneOf.getFwdNodes()) ; fill(nodes) ; }
doZeroOrMore(pathMod.getSubPath()) ; return ; doOneOrMore(pathMod.getSubPath()) ; return ; long min2 = dec(pathMod.getMin()) ; long max2 = dec(pathMod.getMax()) ; P_Mod nextPath = new P_Mod(pathMod.getSubPath(), min2, max2) ; fill(iter2) ;
public void visit(P_ZeroOrMore path) { doZeroOrMore(path.getSubPath()) ; }
private final Iterator<Node> doOneExclude(List<Node> excludedNodes) { // Forward mode only Iter<Triple> iter1 = forwardLinks(node, excludedNodes) ; if ( false ) { System.out.println("Node: "+node) ; List<Triple> x = iter1.toList() ; for ( Triple _t : x ) System.out.println(" "+_t) ; iter1 = Iter.iter(x) ; } Iter<Node> r1 = iter1.map(selectObject) ; return r1 ; }
private void doZeroOrMore(Path path) { Set<Node> visited = new LinkedHashSet<Node>() ; closure(graph, node, path, visited, forwardMode) ; output.addAll(visited) ; }
public void visit(P_Seq pathSeq) { Path part1 = forwardMode ? pathSeq.getLeft() : pathSeq.getRight() ; Path part2 = forwardMode ? pathSeq.getRight() : pathSeq.getLeft() ; // Feed one side into the other Iterator<Node> iter = eval(graph, node, part1, forwardMode) ; iter = eval(graph, iter, part2, forwardMode) ; fill(iter) ; }
static private void eval(Graph graph, Node node, Path p, boolean forward, Collection<Node> acc) { PathEvaluator evaluator = new PathEvaluator(graph, node, acc, forward) ; p.visit(evaluator) ; } // ----
private static void closure(Graph graph, Node node, Path path, Collection<Node> visited, boolean forward) { if ( visited.contains(node) ) return ; visited.add(node) ; Iterator<Node> iter = eval(graph, node, path, forward) ; for ( ; iter.hasNext() ; ) { Node n2 = iter.next() ; closure(graph, n2, path, visited, forward) ; } } }
private void doOne(Path path) { Iterator<Node> iter = eval(graph, node, path, forwardMode) ; fill(iter) ; }
public void visit(P_OneOrMore path) { doOneOrMore(path.getSubPath()) ; }