rdfowlontologyrdfsorganizational-chart

How to make an certain instance of a class to have only one predicate from the desired list of predicates?


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 . 

Solution

  • 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

    1. 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.

    1. 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.

    2. Whether the ontology has a right to live depends on the use cases it supports.

    3. 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.