”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
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.
Assert
All humans are mortal
Mary is a human
Reasoner infers :
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 §