private ImmutableList<Function> getAtomsForGenerators(Collection<TreeWitnessGenerator> gens, Term r0) { return TreeWitnessGenerator.getMaximalBasicConcepts(gens, reasoner).stream() .map(con -> { log.debug(" BASIC CONCEPT: {}", con); if (con instanceof OClass) { return atomFactory.getMutableTripleBodyAtom(r0, ((OClass) con).getIRI()); } else if (con instanceof ObjectSomeValuesFrom) { ObjectPropertyExpression ope = ((ObjectSomeValuesFrom)con).getProperty(); return (!ope.isInverse()) ? atomFactory.getMutableTripleBodyAtom(r0, ope.getIRI(), getFreshVariable()) : atomFactory.getMutableTripleBodyAtom(getFreshVariable(), ope.getIRI(), r0); } else { DataPropertyExpression dpe = ((DataSomeValuesFrom)con).getProperty(); return atomFactory.getMutableTripleBodyAtom(r0, dpe.getIRI(), getFreshVariable()); } }) .collect(ImmutableCollectors.toList()); }
@Override public void visit(SWRLDataPropertyAtom node) { //we consider only namedOwlDataProperty if(!node.getPredicate().isAnonymous()){ //get predicate for datalog IRI propertyIRI = rdfFactory.createIRI(node.getPredicate().asOWLDataProperty().toStringID()); terms = new ArrayList<Term>(); //get terms for datalog for(SWRLArgument argument: node.getAllArguments()){ argument.accept(this); } //TODO: check if it a head or a body function = atomFactory.getMutableTripleBodyAtom(terms.get(0), propertyIRI, terms.get(1)); } else{ notSupported=false; errors.add(node.toString()); } }
@Override public void visit(SWRLObjectPropertyAtom node) { //we consider only namedOwlObjectProperty example not an object property expression such as inv(p) if(!node.getPredicate().isAnonymous()){ IRI propertyIRI = rdfFactory.createIRI(node.getPredicate().asOWLObjectProperty().toStringID()); terms = new ArrayList<Term>(); //get terms for datalog for(SWRLArgument argument: node.getAllArguments()){ argument.accept(this); } //TODO: check if it a head or a body function = atomFactory.getMutableTripleBodyAtom(terms.get(0), propertyIRI, terms.get(1)); } else{ notSupported=false; errors.add(node.toString()); } }
@Override public void visit(SWRLClassAtom node) { //we consider only namedOwlClass (we do not support for example ObjectMinCardinality) if(!node.getPredicate().isAnonymous()){ //get predicate for datalog IRI classIRI = rdfFactory.createIRI(node.getPredicate().asOWLClass().toStringID()); terms = new ArrayList<Term>(); //get terms for datalog for(SWRLArgument argument: node.getAllArguments()){ argument.accept(this); } //TODO: check if it a head or a body function = atomFactory.getMutableTripleBodyAtom(terms.get(0), classIRI); } else{ notSupported=false; errors.add(node.toString()); } }
OClass equivalent = (OClass)reasoner.classesDAG().getCanonicalForm(c); if (equivalent != null && !equivalent.equals(c)) { return atomFactory.getMutableTripleBodyAtom(bodyAtom.getTerm(0), equivalent.getIRI()); if (equivalent != null && !equivalent.equals(ope)) { if (!equivalent.isInverse()) return atomFactory.getMutableTripleBodyAtom(bodyAtom.getTerm(0), equivalent.getIRI(), bodyAtom.getTerm(2)); else return atomFactory.getMutableTripleBodyAtom(bodyAtom.getTerm(2), equivalent.getIRI(), bodyAtom.getTerm(0)); DataPropertyExpression equivalent = reasoner.dataPropertiesDAG().getCanonicalForm(dpe); if (equivalent != null && !equivalent.equals(dpe)) { return atomFactory.getMutableTripleBodyAtom(bodyAtom.getTerm(0), equivalent.getIRI(), bodyAtom.getTerm(2));
private Function createJoinWithSameAsOnLeftAndRight(Function leftAtom, DatalogProgram pr, String newHeadName) { //ON THE RIGHT //create right atom of the join between the data property and same as //given a data property as hasProperty (x, y) //create an unbound hasProperty (anon-x1, anon-y1) Function unboundleftAtom = termFactory.getFunction(leftAtom.getFunctionSymbol()); unboundleftAtom.updateTerms(leftAtom.getTerms()); unboundleftAtom.setTerm(0, termFactory.getVariable("anon-"+bnode+ leftAtom.getTerm(0))); unboundleftAtom.setTerm(2, termFactory.getVariable("anon-"+bnode +leftAtom.getTerm(2))); //create statement pattern for same as create owl:sameAs(anon-y1, y) //it will be the right atom of the join Term sTerm2 = unboundleftAtom.getTerm(2); Term oTerm2 = leftAtom.getTerm(2); Function rightAtomJoin2 = atomFactory.getMutableTripleBodyAtom(sTerm2, OWL.SAME_AS, oTerm2); //create join rule List<Term> varListJoin2 = getUnion(getVariables(unboundleftAtom), getVariables(rightAtomJoin2)); CQIE joinRule2 = createRule(pr, newHeadName + "0" , varListJoin2, unboundleftAtom, rightAtomJoin2); Function joinRight = joinRule2.getHead(); //ON THE LEFT //given a data property ex hasProperty (x, y) //create statement pattern for same as create owl:sameAs( x, anon-x1) //it will be the left atom of the join Term sTerm = leftAtom.getTerm(0); Term oTerm = unboundleftAtom.getTerm(0); Function leftAtomJoin = atomFactory.getMutableTripleBodyAtom(sTerm, OWL.SAME_AS, oTerm); //create join rule List<Term> varListJoin = getUnion(getVariables(leftAtomJoin), getVariables(joinRight)); CQIE joinRule = createRule(pr, newHeadName , varListJoin, leftAtomJoin, joinRight); return joinRule.getHead(); }
private Function createJoinWithSameAsOnLeft(Function leftAtom, DatalogProgram pr, String newHeadName) { //create left atom of the join between the data property and same as //given a data property as hasProperty (x, y) //create the left atom hasProperty (anon-x, y) Function leftAtomJoin = termFactory.getFunction(leftAtom.getFunctionSymbol()); leftAtomJoin.updateTerms(leftAtom.getTerms()); leftAtomJoin.setTerm(0, termFactory.getVariable("anon-" +bnode +leftAtom.getTerm(0))); //given a data property ex hasProperty (x, y) //create statement pattern for same as create owl:sameAs( anon-x, y) //it will be the right atom of the join Term sTerm = leftAtom.getTerm(0); Term oTerm = termFactory.getVariable("anon-"+ bnode +leftAtom.getTerm(0)); Function rightAtomJoin = atomFactory.getMutableTripleBodyAtom(sTerm, OWL.SAME_AS, oTerm); //create join rule List<Term> varListJoin = getUnion(getVariables(leftAtomJoin), getVariables(rightAtomJoin)); CQIE joinRule = createRule(pr, newHeadName , varListJoin, leftAtomJoin, rightAtomJoin); bnode++; return joinRule.getHead(); }
private Function createJoinWithSameAsOnRight(Function leftAtom, DatalogProgram pr, String newHeadName) { //create right atom of the join between the data property and same as //given a data property as hasProperty (x, y) //create the left atom hasProperty (x, anon-y) Function leftAtomJoin2 = termFactory.getFunction(leftAtom.getFunctionSymbol()); leftAtomJoin2.updateTerms(leftAtom.getTerms()); leftAtomJoin2.setTerm(2, termFactory.getVariable("anon-"+bnode +leftAtom.getTerm(2))); //create statement pattern for same as create owl:sameAs(anon-y, y) //it will be the right atom of the join Term sTerm2 = termFactory.getVariable("anon-"+ bnode +leftAtom.getTerm(2)); Term oTerm2 = leftAtom.getTerm(2); Function rightAtomJoin2 = atomFactory.getMutableTripleBodyAtom(sTerm2, OWL.SAME_AS, oTerm2); //create join rule List<Term> varListJoin2 = getUnion(getVariables(leftAtomJoin2), getVariables(rightAtomJoin2)); CQIE joinRule2 = createRule(pr, newHeadName , varListJoin2, leftAtomJoin2, rightAtomJoin2); bnode++; return joinRule2.getHead(); } }