@@ -31,6 +31,7 @@ object Main extends ZCaseApp[Config] {
3131
3232 private val RDFType = RDF .`type`.asNode
3333 private val RDFSSubClassOf = RDFS .subClassOf.asNode
34+ private val OWLEquivalentClass = OWL2 .equivalentClass.asNode
3435 private val OWLRestriction = OWL2 .Restriction .asNode
3536 private val OWLOnProperty = OWL2 .onProperty.asNode
3637 private val OWLSomeValuesFrom = OWL2 .someValuesFrom.asNode
@@ -60,15 +61,18 @@ object Main extends ZCaseApp[Config] {
6061 whelk = Reasoner .assert(whelkOntology)
6162 _ <- ZIO .effectTotal(scribe.info(" Done running reasoner" ))
6263 _ <- (effectBlockingIO(
63- nonredundantRDFWriter.triple(Triple .create(NodeFactory .createBlankNode(" nonredundant" ), RDFType , OWLOntology ))) *>
64- effectBlockingIO(redundantRDFWriter.triple(Triple .create(NodeFactory .createBlankNode(" redundant" ), RDFType , OWLOntology ))))
64+ nonredundantRDFWriter.triple(Triple .create(NodeFactory .createBlankNode(" nonredundant" ), RDFType , OWLOntology ))) *>
65+ effectBlockingIO(redundantRDFWriter.triple(Triple .create(NodeFactory .createBlankNode(" redundant" ), RDFType , OWLOntology ))))
6566 .when(config.mode == OWLMode )
6667 start <- ZIO .effectTotal(System .currentTimeMillis())
68+ classes = allClasses(ontology)
69+ classesTasks = classes.map(c => Task (processSuperclasses(c, whelk, config)))
6770 restrictions = extractAllRestrictions(ontology, specifiedProperties)
68- processed =
69- restrictions.mapParallelUnordered(JRuntime .getRuntime.availableProcessors)(r => Task (processRestriction(r, whelk, config.mode)))
71+ restrictionsTasks = restrictions.map(r => Task (processRestriction(r, whelk, config.mode)))
72+ allTasks = classesTasks ++ restrictionsTasks
73+ processed = allTasks.mapParallelUnordered(JRuntime .getRuntime.availableProcessors)(identity)
7074 monixTask = processed.foreachL {
71- case (nonredundant, redundant) =>
75+ case TriplesGroup (nonredundant, redundant) =>
7276 nonredundant.foreach(nonredundantRDFWriter.triple)
7377 redundant.foreach(redundantRDFWriter.triple)
7478 }
@@ -94,20 +98,48 @@ object Main extends ZCaseApp[Config] {
9498 }
9599 }(stream => ZIO .effectTotal(stream.finish()))
96100
101+ def allClasses (ont : OWLOntology ): Observable [OWLClass ] = Observable .fromIterable(ont.getClassesInSignature(Imports .INCLUDED ).asScala.to(Set ) - OWLThing - OWLNothing )
102+
103+ def processSuperclasses (cls : OWLClass , whelk : ReasonerState , config : Config ): TriplesGroup = {
104+ val subject = NodeFactory .createURI(cls.getIRI.toString)
105+ val concept = AtomicConcept (cls.getIRI.toString)
106+ val allSuperclasses = (whelk.closureSubsBySubclass.getOrElse(concept, Set .empty) - BuiltIn .Top )
107+ .collect { case ac @ AtomicConcept (_) => ac }
108+ if (allSuperclasses(BuiltIn .Bottom )) TriplesGroup .empty // unsatisfiable
109+ else {
110+ val (equivs, directSuperclasses) = whelk.directlySubsumedBy(concept)
111+ val adjustedEquivs = if (config.reflexiveSubclasses.bool) equivs + concept else equivs - concept
112+ val directSuperclassTriples = directSuperclasses.map(c => Triple .create(subject, RDFSSubClassOf , NodeFactory .createURI(c.id)))
113+ val equivalentClassTriples = if (config.equivalenceAsSubclass.bool)
114+ adjustedEquivs.map(c => Triple .create(subject, RDFSSubClassOf , NodeFactory .createURI(c.id)))
115+ else
116+ adjustedEquivs.map(c => Triple .create(subject, OWLEquivalentClass , NodeFactory .createURI(c.id)))
117+ val nonredundantTriples = directSuperclassTriples ++ equivalentClassTriples
118+ val adjustedSuperclasses = if (config.reflexiveSubclasses.bool) allSuperclasses + concept else allSuperclasses - concept
119+ val redundantTriples = if (config.equivalenceAsSubclass.bool)
120+ adjustedSuperclasses.map(c => Triple .create(subject, RDFSSubClassOf , NodeFactory .createURI(c.id)))
121+ else {
122+ val superclassesMinusEquiv = adjustedSuperclasses -- adjustedEquivs
123+ superclassesMinusEquiv.map(c => Triple .create(subject, RDFSSubClassOf , NodeFactory .createURI(c.id))) ++
124+ equivalentClassTriples
125+ }
126+ TriplesGroup (nonredundantTriples, redundantTriples)
127+ }
128+ }
129+
97130 def extractAllRestrictions (ont : OWLOntology , specifiedProperties : Set [OWLObjectProperty ]): Observable [Restriction ] = {
98131 val properties =
99132 if (specifiedProperties.nonEmpty) specifiedProperties
100133 else ont.getObjectPropertiesInSignature(Imports .INCLUDED ).asScala.to(Set ) - OWLTopObjectProperty
101- val classes = ont.getClassesInSignature(Imports .INCLUDED ).asScala.to(Set ) - OWLThing - OWLNothing
102134 val propertiesStream = Observable .fromIterable(properties)
103- val classesStream = Observable .fromIterable(classes )
135+ val classesStream = allClasses(ont )
104136 for {
105137 property <- propertiesStream
106138 cls <- classesStream
107139 } yield Restriction (property, cls)
108140 }
109141
110- def processRestriction (combo : Restriction , whelk : ReasonerState , mode : Config .OutputMode ): ( Set [ Triple ], Set [ Triple ]) = {
142+ def processRestriction (combo : Restriction , whelk : ReasonerState , mode : Config .OutputMode ): TriplesGroup = {
111143 val Restriction (property, cls) = combo
112144 val propertyID = property.getIRI.toString
113145 val clsID = cls.getIRI.toString
@@ -130,8 +162,8 @@ object Main extends ZCaseApp[Config] {
130162 case RDFMode => subclasses.map(sc => Triple .create(NodeFactory .createURI(sc.id), predicate, target))
131163 case OWLMode => subclasses.flatMap(sc => owlTriples(NodeFactory .createURI(sc.id), predicate, target))
132164 }
133- (nonredundantTriples, redundantTriples)
134- } else ( Set .empty[ Triple ], Set .empty[ Triple ])
165+ TriplesGroup (nonredundantTriples, redundantTriples)
166+ } else TriplesGroup .empty
135167 }
136168
137169 def owlTriples (subj : Node , pred : Node , obj : Node ): Set [Triple ] = {
@@ -148,4 +180,12 @@ object Main extends ZCaseApp[Config] {
148180
149181 final case class Restriction (property : OWLObjectProperty , filler : OWLClass )
150182
183+ final case class TriplesGroup (nonredundant : Set [Triple ], redundant : Set [Triple ])
184+
185+ object TriplesGroup {
186+
187+ val empty : TriplesGroup = TriplesGroup (Set .empty, Set .empty)
188+
189+ }
190+
151191}
0 commit comments