Web Ontology Language” (cutely named “OWL” for no reason) is a W3C standard which enables the Semantic Web. OWL is heavily related to SPARQL, which it was developed alongside of. It is aware of RDF, and maps to it. OWL is not a Syntax, but instead may use many syntaxes, such as RDF/XML (which appears to be the preferred syntax by the designers of the language), and Turtle. The source uses 5 syntaxes which can be toggled, nice. OWL is a mechanism to enable Modeling as a Knowledge Base, creating an Ontology. Ultimate nerd stuff.

Vocabulary Words

  • Axioms are basic statements, asserted as truth by definition
  • Entities are used to refer to real-world objects, a collective term i for:
    • Individuals - sometimes referred to as ”objects” e.g. Mary
    • Classes - sometimes referred to as ”categories” e.g. woman
      • Disjoint - two classes that are disjoint cannot share a common individual
    • Properties - subdivide into two types:
      • Object Properties - relate individuals to other individuals
        • See: Domain and Range
        • Inverse - two properties that are the inverse of one another, e.g. hasChild and hasParent
        • Symmetric - properties that always go both ways, e.g. hasSpouse
        • Asymmetric - properties that CANNOT go both ways, e.g. hasParent
        • Disjoint - properties can also be disjoint, saying no two individuals can be linked via both, e.g. bestFriendsWith and doesNotKnow
        • Reflexive - relating to yourself, e.g. knows (because you know yourself)
        • Irrelflexive - CANNOT be used to relate to yourself, e.g hasParent
        • Functional - an individual may only have one relation of that type, e.g. hasBiologicalMother
        • Inverse Functional - same as functional, but inverse, e.g. biologicalMotherOf
        • Transitive - when A is related to B, and B is related to C, then A is related to C too, e.g. inSameRoomAs
        • Key - every individual has a unique value for the property, would be used for things like hasSSN
      • Datatype Properties - assign data values to objects
      • Annotation Properties - are for metadata about the ontology itself
  • Expressions - combine basic axioms and entities to form more complex ones

Tooling

OWL can be written by hand, obviously, but there exist a number of tools. The only one I’ve any experience with is Protege.

Reasoners

OWL tooling includes Reasoners, which use the rules of the language to infer new knowledge as a result of the logical consequences of their context. In Protege there are many reasoners that can be toggled on and off.

Reasoners say:

Assert

  • All humans are mortal
  • Mary is a human

Reasoner infers:

  • Mary is mortal

Reasoners are powerful. They allow for compounding returns on your knowledge representation. They do come with “gotchas”, though. Example from the source - if you assert a domain and range for the Object Property :hasAge, and the domain is :Person, then later you use the :hasAge relation on a cat, then the reasoner would deduce that the cat is also a person.

Complex Classes

You can state complex conditions to empower your reasoners. An example that resonated with me - any Individual that is both of class Parent and class Woman is then of class Mother:

:Mother  owl:equivalentClass  [
   rdf:type            owl:Class ;
   owl:intersectionOf:Woman :Parent ) 
 ] .

These types of relationship implications are what’s missing from systems modeling tools, IMHO.

Restrictions

Restrictions can be implemented to assert rules about Cardinality, and to give reasoners the chance to infer new classes through situations like:

:JohnsChildren  owl:equivalentClass  [
   rdf:type        owl:Restriction ;
   owl:onProperty  :hasParent ;
   owl:hasValue    :John
 ] .

Misc Facts

  • OWL seems to use camelCase for their relations
  • Negative Property Assertion - it’s possible to explicitly say a relation does not exist
  • subPropertyOf - can be used for situations like :hasWife rdfs:subPropertyOf :hasSpouse .
  • differentFrom - can be used to explicitly state two things are not the same
  • sameAs - also exists, the opposite of different from. An aliasing mechanism.
  • Property Chains - you can chain things together to form fancy class restrictions based on relations of relations, e.g.  :hasFriendWithBoat owl:propertyChainAxiom ( :hasFriend  :hasBoat ) .

Reference Ontology

This is pulled directly from the source.

@prefix : <http://example.com/owl/families/> .
@prefix otherOnt: <http://example.org/otherOntologies/families/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
 
<http://example.com/owl/families> 
     rdf:type owl:Ontology ;
     owl:imports <http://example.org/otherOntologies/families.owl> .
 
:hasSpouse    rdf:type  owl:SymmetricProperty .
:hasRelative  rdf:type  owl:ReflexiveProperty .
:parentOf     rdf:type  owl:IrreflexiveProperty .
:hasAncestor  rdf:type  owl:TransitiveProperty .
 
:hasHusband   rdf:type  owl:FunctionalProperty .
:hasHusband   rdf:type  owl:InverseFunctionalProperty .
 
:hasWife rdf:type           owl:ObjectProperty .
:hasWife rdfs:domain        :Man ;
         rdfs:range         :Woman .
:hasWife rdfs:subPropertyOf :hasSpouse .
 
:hasSon     owl:propertyDisjointWith  :hasDaughter.
:hasFather  rdfs:subPropertyOf        :hasParent.
 
:hasParent owl:inverseOf             :hasChild .
:hasParent owl:propertyDisjointWith  :hasSpouse .
 
:hasGrandparent  owl:propertyChainAxiom:hasParent  :hasParent ) .
:hasUncle        owl:propertyChainAxiom:hasFather  :hasBrother ) .
 
:hasAge  owl:equivalentProperty  otherOnt:age .
:hasAge  rdf:type                owl:DatatypeProperty .
:hasAge  rdf:type                owl:FunctionalProperty .
:hasAge  rdfs:domain             :Person ;
         rdfs:range              xsd:nonNegativeInteger .
 
:hasChild  owl:equivalentProperty  otherOnt:child .
:hasChild  rdf:type                owl:AsymmetricProperty .
 
:Woman   rdfs:subClassOf :Person .
 
:Mother  rdfs:subClassOf :Woman .
:Mother  owl:equivalentClass  [
  rdf:type            owl:Class ;
  owl:intersectionOf:Woman :Parent ) 
] .
 
:Person  rdf:type            owl:Class .
:Person  owl:equivalentClass :Human .
:Person  rdfs:comment        "Represents the set of all people."^^xsd:string .
:Person  owl:hasKey:hasSSN ) .
:hasSSN  rdf:type            owl:DataProperty .
:Parent  owl:equivalentClass [
  rdf:type     owl:Class ;
  owl:unionOf:Mother :Father )
] .
 
:Parent  owl:equivalentClass  [
  rdf:type            owl:Restriction ;
  owl:onProperty      :hasChild ;
  owl:someValuesFrom  :Person
] .
 
:Grandfather  rdfs:subClassOf  [
  rdf:type            owl:Class ;
  owl:intersectionOf:Man  :Parent )
] .
 
:HappyPerson
    owl:equivalentClass  [
      rdf:type            owl:Class ;
      owl:intersectionOf  ( [ rdf:type            owl:Restriction ;
                              owl:onProperty      :hasChild ;
                              owl:allValuesFrom   :HappyPerson      ]
                            [ rdf:type            owl:Restriction ;
                              owl:onProperty      :hasChild ;
                              owl:someValuesFrom  :HappyPerson      ]
                          )
    ] .
 
:JohnsChildren  owl:equivalentClass  [
  rdf:type        owl:Restriction ;
  owl:onProperty  :hasParent ;
  owl:hasValue    :John
] .
 
:NarcisticPerson owl:equivalentClass  [
  rdf:type        owl:Restriction ;
  owl:onProperty  :loves ;
  owl:hasSelf     "true"^^xsd:boolean .
] .
 
:MyBirthdayGuests  owl:equivalentClass  [
  rdf:type   owl:Class ;
  owl:oneOf:Bill  :John  :Mary )
] .
:Orphan  owl:equivalentClass  [
  rdf:type           owl:Restriction ;
  owl:onProperty     [ owl:inverseOf  :hasChild ] ;
  owl:allValuesFrom  :Dead 
] .
 
:Teenager  rdfs:subClassOf
      [ rdf:type             owl:Restriction ;
        owl:onProperty       :hasAge ;
        owl:someValuesFrom
         [ rdf:type             rdfs:Datatype ;
           owl:onDatatype       xsd:integer ;
           owl:withRestrictions (  [ xsd:minExclusive     "12"^^xsd:integer ]
                                   [ xsd:maxInclusive     "19"^^xsd:integer ]
           )
         ]
      ] .
 
:Man rdfs:subClassOf        :Person .
[]   rdf:type               owl:Axiom ;
     owl:annotatedSource    :Man ;
     owl:annotatedProperty  rdfs:subClassOf ;
     owl:annotatedTarget    :Person ;
     rdfs:comment           "States that every man is a person."^^xsd:string .
 
:Adult owl:equivalentClass otherOnt:Grownup .
 
:Father rdfs:subClassOf  [
  rdf:type            owl:Class ;
  owl:intersectionOf:Man  :Parent )
] .
 
:ChildlessPerson      owl:equivalentClass  [
  rdf:type            owl:Class ;
  owl:intersectionOf:Person  [ owl:complementOf  :Parent ] ) 
] .
:ChildlessPerson      owl:subClassOf  [
  rdf:type            owl:Class ;
  owl:intersectionOf:Person
                        [ owl:complementOf  [
                            rdf:type            owl:Restriction ;
                            owl:onProperty      [ owl:inverseOf  :hasParent ] ;
                            owl:someValuesFrom  owl:Thing
                          ]
                        ]
                      )
] .
 
[]  rdf:type            owl:Class ;
    owl:intersectionOf  ( [ rdf:type   owl:Class ;
                            owl:oneOf:Mary  :Bill  :Meg ) ]
                          :Female 
                        ) ;
    rdfs:subClassOf     [
      rdf:type            owl:Class ;
      owl:intersectionOf:Parent  
                            [ rdf:type            owl:Restriction ;
                              owl:maxCardinality  "1"^^xsd:nonNegativeInteger ;
                              owl:onProperty      :hasChild ]
                            [ rdf:type           owl:Restriction ;
                              owl:onProperty     :hasChild ;
                              owl:allValuesFrom  :Female ]
                          )
    ] .
 
[] rdf:type     owl:AllDisjointClasses ;
   owl:members:Mother  :Father  :YoungChild ) .
 
[] rdf:type     owl:AllDisjointClasses ;
   owl:members:Woman  :Man ) .
 
:personAge  owl:equivalentClass
 [ rdf:type       rdfs:Datatype;
   owl:onDatatype xsd:integer;
   owl:withRestrictions (
      [ xsd:minInclusive "0"^^xsd:integer ]
      [ xsd:maxInclusive "150"^^xsd:integer ] 
   )
 ] .

Source