What are Properties?
Properties are the verbs of an ontology — they describe how individuals relate to each other and what attributes they carry. RDF defines a single base type and OWL layers a richer typology on top, with axioms for characteristics (functional, transitive, …) and relationships between properties (sub-property, equivalence, disjointness).
The Base: rdf:Property
Every predicate that connects a subject to an object in an RDF triple is, at minimum, an rdf:Property. The W3C RDF specification doesn't distinguish between “properties that point to other resources” and “properties that hold literal values” — it's just one flat type. RDFS adds rdfs:domain and rdfs:range to constrain what classes a property can apply to and what kind of values it accepts, but the typology stops there.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
ex:hasMember a rdf:Property ;
rdfs:domain ex:Group ;
rdfs:range ex:Person .For most modelling tasks the OWL property kinds (below) are a better fit, since they let reasoners distinguish references from literal values and enforce the difference automatically.
owl:ObjectProperty
Connects an individual to another individual — the range is always another resource (an IRI or blank node), never a literal. Use object properties for relationships between things: hasParent, memberOf, locatedIn.
@prefix owl: <http://www.w3.org/2002/07/owl#> .
ex:hasParent a owl:ObjectProperty ;
rdfs:domain ex:Person ;
rdfs:range ex:Person .
ex:Alice ex:hasParent ex:Bob . # both must be IRIs / individualsowl:DatatypeProperty
Connects an individual to a literal value typed by an XSD or RDF datatype: xsd:string, xsd:integer, xsd:date, etc. Use datatype properties for raw attributes: hasAge, hasName, birthDate.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:hasAge a owl:DatatypeProperty ;
rdfs:domain ex:Person ;
rdfs:range xsd:nonNegativeInteger .
ex:Alice ex:hasAge "34"^^xsd:nonNegativeInteger .owl:AnnotationProperty
Carries metadata about an entity rather than asserting a logical relationship. Annotation properties are invisible to OWL reasoners — they don't participate in inference, but they're what people read in the UI. Common examples: rdfs:label, rdfs:comment, skos:prefLabel, dcterms:creator.
ex:hasMaintainer a owl:AnnotationProperty ;
rdfs:label "Has maintainer"@en .
ex:MyOntology ex:hasMaintainer "Jane Doe" . # not used in inferenceRule of thumb: if a value should drive logical conclusions (membership, equivalence, consistency checking), it belongs on an object or datatype property. If it's for humans — labels, comments, dates, authorship — use an annotation property.
Characteristic Axioms
OWL lets you mark a property with axioms that constrain how it behaves — a reasoner uses these to derive new triples or detect contradictions. In OWL 2 DL these characteristics apply to object properties; the only one also permitted on datatype properties is owl:FunctionalProperty.
| Axiom | Meaning | Example |
|---|---|---|
| owl:FunctionalProperty | Each subject has at most one value | hasFather |
| owl:InverseFunctionalProperty | Each value identifies at most one subject (only on object properties) | hasPassport |
| owl:TransitiveProperty | If a P b and b P c, then a P c | isAncestorOf |
| owl:SymmetricProperty | If a P b, then b P a | hasSibling |
| owl:AsymmetricProperty | If a P b, then b P a is false | hasParent |
| owl:ReflexiveProperty | Every individual P itself | knows |
| owl:IrreflexiveProperty | No individual P itself | isParentOf |
ex:isAncestorOf a owl:ObjectProperty , owl:TransitiveProperty , owl:IrreflexiveProperty . # From Alice -isAncestorOf-> Bob and Bob -isAncestorOf-> Carol # A reasoner derives Alice -isAncestorOf-> Carol
Relationships Between Properties
Properties can also relate to each other, not just to instances. These axioms let you organise properties into hierarchies, declare alignments, or rule out impossible combinations.
| Axiom | Meaning |
|---|---|
| rdfs:subPropertyOf | Every triple using the sub-property also entails one using the super-property. E.g. hasMother rdfs:subPropertyOf hasParent. |
| owl:equivalentProperty | Two properties always carry the same triples in both directions — a reasoner can substitute one for the other freely. |
| owl:inverseOf | Reverses subject and object. If a hasParent b, then b hasChild a. |
| owl:propertyDisjointWith | Two properties cannot share any pair of values. Used for mutually-exclusive relations — e.g. hasSpouse vs hasParent. |
| owl:AllDisjointProperties | The n-ary form: declare three or more properties pairwise-disjoint in one axiom. |
| owl:propertyChainAxiom | Derive a property by chaining others. E.g. hasGrandparent ≡ hasParent ∘ hasParent. |
ex:hasParent owl:inverseOf ex:hasChild .
ex:hasSpouse owl:propertyDisjointWith ex:hasParent ;
a owl:SymmetricProperty .
ex:hasGrandparent owl:propertyChainAxiom ( ex:hasParent ex:hasParent ) .Domain and Range
rdfs:domain declares what class a subject must belong to in order to be a valid subject of the property; rdfs:range does the same for the object.
In OWL these are not validation constraints — they're entailments. Asserting hasParent rdfs:domain Person and then writing ex:Spot ex:hasParent ex:Rex doesn't raise an error; it lets a reasoner conclude that Spot is a Person. Use SHACL or domain-specific lint rules if you want classical “wrong type” validation.
Choosing the Right Kind
- Will the value be a reference to another individual in your ontology? →
owl:ObjectProperty. - Will the value be a literal (number, string, date, …)? →
owl:DatatypeProperty. - Is the value metadata for humans, not for the reasoner? →
owl:AnnotationProperty. - Are you not committing to OWL at all (e.g. plain RDFS)? →
rdf:Propertyworks, but you lose reasoner support for the distinctions above.
References
- RDF 1.2 Schema — the base
rdf:Property,rdfs:domain,rdfs:range,rdfs:subPropertyOf. - OWL 2 Structural Specification — Properties — canonical reference for object / datatype / annotation properties and all the characteristic and relationship axioms.
- OWL 2 Primer — Properties — gentler tutorial introduction with worked examples.