As part of my bachelor's thesis, I am trying to create a universal ontology for organizations (I know about the existence of The Organizational Ontology from the W3C). In the process, I came up with the following scheme (ontology drawn in pencil). The idea is to have one main entity (in my case it is the entity Workspace) for which I could set its type (organization, department, position, person, place) and which I could pair with itself (with using the typed relationship "Relation") to build any arbitrarily complex organizational structure.
I tried to translate the drawn ontology into an RDF graph using the WebVOWL online utility and this is what I got (picture of ontology).
Unfortunately, my knowledge of ontological modeling theory and semantic web technologies leaves much to be desired, and I ask people who understand them to help me.
Correct me if I'm wrong, but I have a feeling that in the ontology I've built, the Relation entity must have all the links at once. (Relation - relationType - HoldsPost, Relation - relationType - ReportsTo, Relation - relationType - subOrganization, etc.). I need the Relation entity instance to have only one relationship (For example, only Relation - relationType - HoldsPost).
Only one solution to this problem comes to mind - get rid of the HeadOf, HoldsPost, ReportsTo, .. nodes and instead add a string node in which to write the desired value, depending on the type of relationship.
So it seems that the problem is how to build an ontology that will provide a Relation instance with only one of the types listed, and not all at once.
I would be really grateful for any help and feedback.
Also I am attaching the contents of the Turtle file generated by the WebVOWL utility:
#################################################################
### Generated with the experimental alpha version of the TTL exporter of WebVOWL (version 1.1.7) http://visualdataweb.de/webvowl/ ###
#################################################################
@prefix : <http://visualdataweb.org/organizationalOntology/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix wot: <http://xmlns.com/wot/0.1/> .
@prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@base <http://visualdataweb.org/organizationalOntology/> .
<http://visualdataweb.org/organizationalOntology/> rdf:type owl:Ontology ;
dc:title "Organizational structure ontology"@en;
dc:description "Ontology for modelling organizational structures, specializable to a broad variety of types of organization."@en;
owl:versionInfo "0.1"@en;
dc:creator "" .
#################################################################
### Property Definitions (Number of Property) 20 ###
# --------------------------- Property 0-------------------------
:supports rdf:type owl:ObjectProperty ;
rdfs:label "supports"@en;
rdfs:domain :Workspace;
rdfs:range :SupportedOperations .
# --------------------------- Property 1-------------------------
:constraints rdf:type owl:ObjectProperty ;
rdfs:label "limits"@en;
rdfs:domain :Workspace;
rdfs:range :BuisnessRules .
# --------------------------- Property 2-------------------------
:name rdf:type owl:DatatypeProperty ;
rdfs:label "name"@en;
rdfs:domain :Workspace;
rdfs:range rdfs:Datatype .
# --------------------------- Property 3-------------------------
:relationWorkspaceLink rdf:type owl:ObjectProperty ;
rdfs:label "relationWorkspaceLink"@en;
rdfs:domain :Relation;
rdfs:range :Workspace .
# --------------------------- Property 4-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :HeadOf .
# --------------------------- Property 5-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :HoldPost .
# --------------------------- Property 6-------------------------
:workspaceRelationLink rdf:type owl:ObjectProperty ;
rdfs:label "workspaceRelationLink"@en;
rdfs:domain :Workspace;
rdfs:range :Relation .
# --------------------------- Property 7-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :ReportsTo .
# --------------------------- Property 8-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range : .
# --------------------------- Property 9-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :SubUnit .
# --------------------------- Property 10-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :MemberOf .
# --------------------------- Property 11-------------------------
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :LocatesIn .
# --------------------------- Property 12-------------------------
:workspaceType rdf:type owl:ObjectProperty ;
rdfs:label "workspaceType"@en;
rdfs:domain :Workspace;
rdfs:range :Place .
# --------------------------- Property 13-------------------------
:workspaceType rdf:type owl:ObjectProperty ;
rdfs:label "workspaceType"@en;
rdfs:domain :Workspace;
rdfs:range :Organization .
# --------------------------- Property 14-------------------------
:workspaceType rdf:type owl:ObjectProperty ;
rdfs:label "workspaceType"@en;
rdfs:domain :Workspace;
rdfs:range :Department .
# --------------------------- Property 15-------------------------
:workspaceType rdf:type owl:ObjectProperty ;
rdfs:label "workspaceType"@en;
rdfs:domain :Workspace;
rdfs:range :Person .
# --------------------------- Property 16-------------------------
:workspaceType rdf:type owl:ObjectProperty ;
rdfs:label "workspaceType"@en;
rdfs:domain :Workspace;
rdfs:range :Post .
# --------------------------- Property 17-------------------------
:hasCoordinates rdf:type owl:ObjectProperty ;
rdfs:label "hasCoordinates"@en;
rdfs:domain :Place;
rdfs:range :Coordinates .
# --------------------------- Property 18-------------------------
:coordinatesString rdf:type owl:DatatypeProperty ;
rdfs:label "coordinatesString"@en;
rdfs:domain :Coordinates;
rdfs:range xsd:string .
# --------------------------- Property 19-------------------------
:description rdf:type owl:DatatypeProperty ;
rdfs:label "description"@en;
rdfs:domain :Workspace;
rdfs:range rdfs:Datatype .
### Class Definitions (Number of Classes) 17 ###
# --------------------------- Class 0-------------------------
:Workspace rdf:type owl:Class;
rdfs:label "Workspace"@en .
# --------------------------- Class 1-------------------------
:SupportedOperations rdf:type owl:Class;
rdfs:label "SupportedOperations"@en .
# --------------------------- Class 2-------------------------
:BuisnessRules rdf:type owl:Class;
rdfs:label "BuisnessRules"@en .
# --------------------------- Class 3-------------------------
:Relation rdf:type owl:Class;
rdfs:label "Relation"@en .
# --------------------------- Class 4-------------------------
:ReportsTo rdf:type owl:Class;
rdfs:label "ReportsTo"@en .
# --------------------------- Class 5-------------------------
:MemberOf rdf:type owl:Class;
rdfs:label "MemberOf"@en .
# --------------------------- Class 6-------------------------
:HoldPost rdf:type owl:Class;
rdfs:label "HoldsPost"@en .
# --------------------------- Class 7-------------------------
:HeadOf rdf:type owl:Class;
rdfs:label "HeadOf"@en .
# --------------------------- Class 8-------------------------
:LocatesIn rdf:type owl:Class;
rdfs:label "LocatesIn"@en .
# --------------------------- Class 9-------------------------
: rdf:type owl:Class;
rdfs:label "SubOrganization"@en .
# --------------------------- Class 10-------------------------
:SubUnit rdf:type owl:Class;
rdfs:label "SubUnit"@en .
# --------------------------- Class 11-------------------------
:Organization rdf:type owl:Class;
rdfs:label "Organization"@en .
# --------------------------- Class 12-------------------------
:Department rdf:type owl:Class;
rdfs:label "Department"@en .
# --------------------------- Class 13-------------------------
:Post rdf:type owl:Class;
rdfs:label "Post"@en .
# --------------------------- Class 14-------------------------
:Person rdf:type owl:Class;
rdfs:label "Person"@en .
# --------------------------- Class 15-------------------------
:Place rdf:type owl:Class;
rdfs:label "Place"@en .
# --------------------------- Class 16-------------------------
:Coordinates rdf:type owl:Class;
rdfs:label "Coordinates"@en .
You will need to add a max 1 cardinality restriction to the Relation
class:
:Relation rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasType ;
owl:maxCardinality "1"^^xsd:nonNegativeInteger
] ;
rdfs:label "Relation"@en .
Then, if you have the following individuals:
:relation rdf:type owl:NamedIndividual ,
:Relation ;
:hasType :relationType1 ,
:relationType2 .
:relationType1 rdf:type owl:NamedIndividual ,
:HeadOf .
:relationType2 rdf:type owl:NamedIndividual ,
:MemberOf .
with individuals relationType1
and relationType2
distinct
[ rdf:type owl:AllDifferent ;
owl:distinctMembers ( :relationType1
:relationType2
)
] .
If you run a reasoner over this ontology, you will get an inconsistency because the relation
individual is linked twice via the relationType
property.
Answers to questions in comment
Object properties relates 2 individuals with each other, not classes. if you have:
:hasType rdf:type owl:ObjectProperty ;
rdfs:label "relationType"@en;
rdfs:domain :Relation;
rdfs:range :MemberOf .
it means that whenever 2 individuals a
and b
are linked via hasType
, individual a
is of type Relation
and individual b
is of type MemberOf
. This also means for each hasType
defined with domain an ranges, will cause a
to be of the type of the domain and b
to be of type of the range. In your example a
will be inferred to be of type Relation
and b
will be referred to be of type MemberOf
, HeadOf
, HolfPost
etc. Furthermore, defining an individual relation
of type Relation
will not force relation
to have any hasType
link to an individual of type MemberOf
.
Yes, your understanding is incorrect. Any individual in OWL/RDF can have as many links via as many predicates as they want. If you want to restrict the number of links via a specific predicate you have to define class the individual belongs to such that it will only allow a limited amount of links. I have written about this on my blog here, here and here.
Whether the ontology has a right to live depends on the use cases it supports.
Reasoning is the process via which inferences are derived based on the axioms in an ontology. An ontology has mathematical logic meaning which based on these axioms and assertions in your ontology can apply logic based algorithms to derive inferences. This is called reasoning and the application doing it, is called a reasoner. You can read more about it in chapter 3 of my dissertation.