Introduction
In addition to RDFS++ reasoning, AllegroGraph also supports reasoning over hasValue restrictions in equivalent classes or subclasses.
For example, here is an owl class definition for AtlantisMission, defined as a SpaceMission where the shuttleUsed property has the value Atlantis.
<owl:Class rdf:ID="AtlantisMission">
<rdfs:subClassOf
rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdfs:label
rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
Atlantis mission
</rdfs:label>
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<rdf:Description rdf:ID="SpaceMission"/>
<owl:Restriction>
<owl:onProperty rdf:resource="#shuttleUsed"/>
<owl:hasValue rdf:resource="#Atlantis"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
</owl:Class>
We can make two types of inferences from this definition.
- We can derive the default value for
shuttleUsedwhen we have an Instance of an AtlantisMission. For example, if a triple-store contains the the ontology definition above and we add the following triple:(add-triple !m:Mission4 !rdf:type !m:AtlantisMission) - The reasoning also works in reverse: we can derive the type of an instance to be an
AtlantisMissionif it has the right properties. If we added the following instance properties to a triple-store(add-triple !m:Mission5 !m:shuttleUsed !m:Atlantis) (add-triple !m:Mission5 !rdf:type !m:SpaceMission)
then we can derive that the shuttleUsed property must be Atlantis with the following query.
(select (?val)
(q !m:Mission3 !m:shuttleUsed ?val))
then the following query would derive that ?x is an AtlantisMission.
(select (?x)
(q !m:Mission5 !rdf:type ?x)) hasValue reasoning is not enabled by default. The tutorial below will show how to turn this on.
How to use hasValue reasoning
- From Java
- See the description of setEntailmentRegime.
- From Python
- On any Python API where
inferorincludeInferredis an argument, the values can be the boolean False (which means no reasoning), True, which is the same as "rdfs++", or the strings "rdfs++" (rdf++ reasoning but not hasValue reasoning) or "restriction" ("restriction" turns on hasValue reasoning as well as rdf++ reasoning). - From HTTP
- Set the
inferparameter torestrictionwhen using the repository interface of the HTTP protocol.
How to use it from Lisp: a tutorial
In principle the following code will all run. Just evaluate every expression from top to bottom and you will see the results.
; load agraph into lisp
(require :agraph)
; go into the triple-store-user package
(in-package :triple-store-user)
;; make it easier to type URIs
(enable-!-reader) The following will define the function to load the files SpaceMissions2.ntriples into the triple-store. This file is included in the distribution. It will help you understanding of the contents of this file to inspect it in TopBraid Composer.
(defun read-sm ()
(create-triple-store "test11")
(load-ntriples "sys:agraph;tutorial-files;SpaceMissions2.ntriples"))
(time (read-sm)) ; do the actual read We are lazy and don't want to type long namespaces:
(register-namespace
"m" "http://www.topbraid.org/spacemissions.owl#")
;; lets look at the triples..
(print-triples *db* :limit nil :format :terse) To use restriction reasoning, we must either apply-rdfs++-reasoner and then use restriction-reasoning-enabled-p or use the initarg.
(apply-rdfs++-reasoner)
(setf (restriction-reasoning-enabled-p *db*) t) or
(apply-rdfs++-reasoner :restriction-reasoning-enabled t) Deriving default values from type information
- First we demonstrate how we to derive default values from type information
(add-triple !m:Mission1 !rdf:type !m:SpaceMissionIn2000) (add-triple !m:Mission1 !m:added-by !m:Jans) (select (?x ?y) (q !m:Mission1 !m:startYear ?x) (q- !m:Mission1 !m:added-by ?y))
and some more examples:
(add-triple
!m:Mission3 !rdf:type !m:DiscoveryMission)
(add-triple
!m:Mission4 !rdf:type !m:AtlantisMission)
(select (?val)
(q !m:Mission3 !m:shuttleUsed ?val))
(select (?val)
(q !m:Mission4 !m:shuttleUsed ?val))
(select ()
(q !m:Mission4 !m:shuttleUsed !m:Atlantis)
(write 'SUCCESS)) Deriving types from value information
- Second, we demo how we can derive types from values. We add the
shuttleUsedproperty toMission5and then we can automatically derive thatMission5is anAtlantisMission.(add-triple !m:Mission5 !m:shuttleUsed !m:Atlantis)
Now this select query returns two results:
(select (?x)
(q !m:Mission5 !rdf:type ?x))
(("http://www.topbraid.org/spacemissions.owl#SpaceMission")
("http://www.topbraid.org/spacemissions.owl#AtlantisMission")) The first result is due to the fact that the rdfs:range of the property shuttleUsed is 'SpaceMission'. So by adding the fact shuttleUsed to Mission5 the RDFS++ range reasoning will derive that Mission5 is a SpaceMission.
Then the restriction reasoning module uses the fact that Misison5 is a SpaceMission and the shuttleUsed is Atlantis to derive that Mission5 is an AtlantisMission.
The following queries are also interesting. The first select will only return Mission4 because we use q- and q- looks only at the ground triples. It returns Mission4 because we added that triple above:
(select (?x)
(q- ?x !rdf:type !m:AtlantisMission))
-> (("http://www.topbraid.org/spacemissions.owl#Mission4")) The following query returns Mission4 and also Mission5 because of hasValue reasoning. (Note how we use q here to use the reasoner)
(select (?x)
(q ?x !rdf:type !m:AtlantisMission))
->
(("http://www.topbraid.org/spacemissions.owl#Mission4")
("http://www.topbraid.org/spacemissions.owl#Mission5"))
Now we can add some more triples:
(add-triple !m:Mission6 !m:shuttleUsed !m:Columbia)
(add-triple !m:Mission6 !rdf:type !m:SpaceMission)
(select (?x)
(q !m:Mission6 !rdf:type ?x))
(select (?x)
(q ?x !rdf:type !m:DiscoveryMission))
(select ()
(q !m:Mission6 !rdf:type !m:DiscoveryMission)
(lisp (print 'SUCCESS)))
And finally we show that we can do quite complex hasValue restrictions. Please look in TopBraidComposer or any other ontology browser how a MilitarySpaceMission is defined by multiple hasValue restrictions.
We add some values and everything should work.
(add-triple !m:Mission7 !rdf:type !m:SpaceMission)
(add-triple !m:Mission7 !m:hasMissionType !m:SpecialMissionType)
(add-triple !m:Mission7 !m:hasMissionType !m:MilitaryMissionType)
(select (?x ?y)
(q !m:Mission7 ?x ?y))
(select (?type)
(q !m:Mission7 !rdf:type ?type))
(select (?x)
(q ?x !rdf:type !m:MilitarySpaceMission))