public static CBDStructureTree getOptimalCBDStructure(Query query) { CBDStructureTree tree = new CBDStructureTree("root"); Var var = query.getProjectVars().get(0); getOptimalCBDStructure(query, tree, var.asNode(), null, ""); return tree; }
private static boolean valid(Query query) { // check for connectedness boolean connected = isConnected(query); if(!connected) { // System.err.println(query); return false; } // check for projection vars that do not exists in query pattern List<Var> vars = query.getProjectVars(); Set<Triple> triplePatterns = QueryUtils.getTriplePatterns(query); Set<Node> nodes = triplePatterns.stream().flatMap(tp -> getNodes(tp).stream()).collect(Collectors.toSet()); Set<Var> superflousVars = vars.stream().filter(var -> !nodes.contains(var.asNode())).collect(Collectors.toSet()); if(!superflousVars.isEmpty()) { // System.err.println(query); // System.err.println("Proj. vars: " + superflousVars); return false; } // check if projection var doesn't refer to a predicate boolean hasPredicateProjVar = QueryUtils.getTriplePatterns(query).stream() .map(Triple::getPredicate) .filter(Node::isVariable) .map(Var::alloc) .anyMatch(vars::contains); return !hasPredicateProjVar; }
Set<Triple> ingoingTriplePatterns = triplePatternExtractor.extractIncomingTriplePatterns(q, projectVars.get(0).asNode()); hasIngoingLinks = !ingoingTriplePatterns.isEmpty();
/** * @return whether the target projection variable is used only in object position of a triple pattern */ public static Predicate<Question> isObjectTarget() { return q -> utils.extractOutgoingTriplePatterns( QueryFactory.create(q.getQuery().getSparql()), QueryFactory.create(q.getQuery().getSparql()).getProjectVars().get(0).asNode() ).isEmpty(); }
/** * @return whether the target projection variable is used only in subject position of a triple pattern */ public static Predicate<Question> isSubjectTarget() { return q -> utils.extractIncomingTriplePatterns( QueryFactory.create(q.getQuery().getSparql()), QueryFactory.create(q.getQuery().getSparql()).getProjectVars().get(0).asNode() ).isEmpty(); }
Set<Triple> incomingTPs = queryUtils.extractOutgoingTriplePatternsTrans(query, targetVar.asNode());
Set<Triple> incomingTPs = queryUtils.extractIncomingTriplePatternsTrans(query, targetVar.asNode());
Set<Triple> outgoingTPs = queryUtils.extractOutgoingTriplePatternsTrans(query, targetVar.asNode());
Node source = query.getProjectVars().get(0).asNode(); Set<List<Triple>> paths = getPaths(new ArrayList<>(), query, source);
filters.add(new ElementFilter(new E_IsIRI(NodeValue.makeNode(projectVar.asNode()))));