/* * Copyright 2020, 2021 KRR Oxford * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package uk.ac.ox.cs.rsacomb.util /* Java imports */ import java.util.Map import tech.oxfordsemantic.jrdfox.formats.SPARQLParser import tech.oxfordsemantic.jrdfox.Prefixes import tech.oxfordsemantic.jrdfox.logic.datalog.{ Negation, Rule, TupleTableAtom, TupleTableName, } import tech.oxfordsemantic.jrdfox.logic.expression.{Term, Variable, IRI} import org.semanticweb.owlapi.model.OWLOntology import org.semanticweb.owlapi.model.{ OWLAxiom, OWLClass, OWLObjectPropertyExpression } import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery import uk.ac.ox.cs.rsacomb.suffix.RSASuffix // Debug only import scala.collection.JavaConverters._ object RSA { /** Simplify conversion between Java and Scala `List`s */ import uk.ac.ox.cs.rsacomb.implicits.JavaCollections._ /** Experimental DLS for RDFox */ import RDFoxDSL._ /** Set of default prefixes to be included in all datastore operations */ val Prefixes: Prefixes = new Prefixes() Prefixes.declarePrefix("xml:", "http://www.w3.org/XML/1998/namespace") Prefixes.declarePrefix("xsd:", "http://www.w3.org/2001/XMLSchema#") Prefixes.declarePrefix("rdf:", "http://www.w3.org/1999/02/22-rdf-syntax-ns#") Prefixes.declarePrefix("rdfs:", "http://www.w3.org/2000/01/rdf-schema#") Prefixes.declarePrefix("owl:", "http://www.w3.org/2002/07/owl#") Prefixes.declarePrefix("rdfox:", "http://oxfordsemantic.tech/RDFox#") Prefixes.declarePrefix("rsacomb:", "http://www.cs.ox.ac.uk/isg/RSAComb#") /** Creates a `rsacomb:` IRI */ def apply(name: Any): IRI = IRI.create( Prefixes.getPrefixIRIsByPrefixName.get("rsacomb:").getIRI + name.toString ) /** Helper IRIs */ val ANS = RSA("Ans") val AQ = RSA("AQ") val CONGRUENT = RSA("congruent") val FK = RSA("FK") val ID = RSA("ID") val IN = RSA("In") val NAMED = RSA("Named") val NI = RSA("NI") val QM = RSA("QM") val SP = RSA("SP") val TQ = RSA("TQ") val E = RSA("E") val U = RSA("U") def Named(tt: TupleTableName)(x: Term): TupleTableAtom = TupleTableAtom.create(tt, x, IRI.RDF_TYPE, RSA.NAMED) def Congruent(tt: TupleTableName)(x: Term, y: Term): TupleTableAtom = TupleTableAtom.create(tt, x, RSA.CONGRUENT, y) def Skolem(skolem: Term, terms: List[Term]): TupleTableAtom = TupleTableAtom.create(TupleTableName.SKOLEM, terms :+ skolem) def E(tt: TupleTableName)(x: Term, y: Term): TupleTableAtom = TupleTableAtom.create(tt, x, RSA.E, y) def PE(tt: TupleTableName)(x: Term, y: Term) = TupleTableAtom.create(tt, x, RSA("PE"), y) def U(tt: TupleTableName)(x: Term): TupleTableAtom = TupleTableAtom.create(tt, x, IRI.RDF_TYPE, RSA.U) // def In(t: Term)(implicit set: Term) = // TupleTableAtom.rdf(t, RSA("In"), set) // def NotIn(t: Term)(implicit set: Term) = Negation.create(In(t)(set)) // private def atom(name: IRI, vars: List[Term]): TupleTableAtom = // TupleTableAtom.create(TupleTableName.create(name.getIRI), vars: _*) def RBoxReasoning(graph: IRI): List[Rule] = { val tt = TupleTableName.create(graph.getIRI) val subPropertyOf = IRI.create(Prefixes.getPrefixIRIsByPrefixName.get("rdfs:").getIRI + "subPropertyOf") val subPropertyOfTrans = RSA("subPropertyOfTrans") val inverseOf = IRI.create(Prefixes.getPrefixIRIsByPrefixName.get("owl:").getIRI + "inverseOf") List( Rule.create( TupleTableAtom.create(tt, v"X", subPropertyOfTrans, v"Y"), TupleTableAtom.create(tt, v"X", subPropertyOf, v"Y"), ), Rule.create( TupleTableAtom.create(tt, v"X", subPropertyOfTrans, v"Z"), TupleTableAtom.create(tt, v"X", subPropertyOfTrans, v"Y"), TupleTableAtom.create(tt, v"Y", subPropertyOfTrans, v"Z") ), Rule.create( TupleTableAtom.create(tt, v"Yi", subPropertyOf, v"Xi"), TupleTableAtom.create(tt, v"X", subPropertyOf, v"Y"), TupleTableAtom.create(tt, v"Xi", inverseOf, v"X"), TupleTableAtom.create(tt, v"Yi", inverseOf, v"Y"), ), Rule.create( TupleTableAtom.create(tt, v"X", inverseOf, v"Y"), TupleTableAtom.create(tt, v"Y", inverseOf, v"X"), ) ) } } /** Some common ontology prefixes: * * @prefix dc: . * @prefix ex: . * @prefix fn: . * @prefix ms: . * @prefix vb: . * @prefix xs: . * @prefix NBN: . * @prefix XML: . * @prefix bot: . * @prefix cbx: . * @prefix dct: . * @prefix esv: . * @prefix gss: . * @prefix ioc: . * @prefix j.0: . * @prefix mlo: . * @prefix ns1: . * @prefix ns2: . * @prefix ns3: . * @prefix ns4: . * @prefix obo: . * @prefix owl: . * @prefix rdf: . * @prefix tmp: . * @prefix www: . * @prefix xml: . * @prefix xsd: . * @prefix xsp: . * @prefix bibo: . * @prefix daml: . * @prefix foaf: . * @prefix lego: . * @prefix mlo1: . * @prefix mlo2: . * @prefix obda: . * @prefix rdfs: . * @prefix skos: . * @prefix swrl: . * @prefix vann: . * @prefix void: . * @prefix admin: . * @prefix nlbdm: . * @prefix pizza: . * @prefix pstcn: . * @prefix swrla: . * @prefix swrlb: . * @prefix terms: . * @prefix vcard: . * @prefix PLCore: . * @prefix Server: . * @prefix TypeQL: . * @prefix schema: . * @prefix travel: . * @prefix current: . * @prefix dcterms: . * @prefix ebucore: . * @prefix example: . * @prefix ontokin: . * @prefix opla-sd: . * @prefix owl2xml: . * @prefix protege: . * @prefix mappings: . * @prefix oboInOwl: . * @prefix otherOnt: . * @prefix EurosData: . * @prefix geosparql: . * @prefix restaurant: . * @prefix ml-ontology: . */