"**Web [[Ontology Language]]**" (cutely named "OWL" for no reason) is a W3C standard which enables the [[Ontology, Semantics, and Syntax|Semantic]] Web. OWL is heavily related to [[SPARQL]], which it was developed alongside of. It is aware of [[Resource Description Framework|RDF]], and maps to it. OWL is not a [[Ontology, Semantics, and Syntax|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.
> [!tip] 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`:
```turtle
: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:
```turtle
:JohnsChildren  owl:equivalentClass  [
   rdf:type        owl:Restriction ;
   owl:onProperty  :hasParent ;
   owl:hasValue    :John
 ] .
```
# Misc Facts
- OWL seems to use [[Case Types|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.
```turtle
@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 ] 
   )
 ] .
```
****
# More
## Source
- https://www.w3.org/TR/owl2-primer/
## Related