This is the seventh in a series of blogs describing how one would go about modeling an enterprise ontology.
In my last two blogs I showed how one could relatively easily create an informal taxonomy and add facets to it. In this blog we show how to model a formal taxonomy using the gist upper-level ontology to bootstrap our micro-pattern. From the gist definition of taxonomy we have the following:
gist:taxonomy: A controlled vocabulary arranged as a hierarchy of concepts.
Consequently — at least as defined by gist — a taxonomy is not only a type of controlled vocabulary, but it is also a type of collection (see Protégé screenshot below). As such, gist:Taxonomy inherits the properties of both.
One of the key things that differentiates formal from informal taxonomies is that with formal taxonomies, individual sub categories must have one and only one super-category parent. Hence their "formality". Per the gist documentation, the gist:hasSuperCategory object property is defined as:
gist:hasSuperCategory: Categories linked in this way are to represent true subtypes. The categories aren't subtypes, but a class defined by a supercategory will be a superclass of one derived from its subcategory.
Like the other bucket micro-patterns previously discussed in this series of blogs, Formal Taxonomies, while having more "moving parts" than simpler types of classifications, are pretty straightforward once you see the overall pattern: Controlled Vocabulary buckets are instances of gist:Category and are themselves arranged in a formal hierarchy using gist:hasSubCategory and its inverse gist:hasSuperCategory. Child entities attached to these buckets can be of any type. In the diagram shown below I am using instances of gist:Person to identify the physician entities as actual people. Likewise the child entities belong to each Category bucket via the gist:categorizedBy predicate.
THE ABOVE IN TURTLE FORMAT:
@prefix ex1: <https://data.example.com/> . @prefix cat: <https://taxa.example.com/> . @prefix gist: <https://semantic-arts.com/gist/> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . gist:ControlledVocabulary rdfs:subClassOf gist:Collection . gist:Taxonomy rdfs:subClassOf gist:ControlledVocabulary . cat:Profession a gist:Taxonomy . ex1:Tom a gist:Person . ex1:Jill a gist:Person . ex1:Mary a gist:Person . ex1:Bill a gist:Person . cat:Physician a gist:Category . cat:Cardiologist a gist:Category . cat:Orthopedist a gist:Category . ex1:Tom gist:categorizedBy cat:Cardiologist . ex1:Jill gist:categorizedBy cat:Physician . ex1:Mary gist:categorizedBy cat:Orthopedist . ex1:Bill gist:categorizedBy cat:Orthopedist . cat:Profession gist:hasMember cat:Physician . cat:Profession gist:hasMember cat:Cardiologist . cat:Profession gist:hasMember cat:Orthopedist . cat:Physician gist:hasSubCategory cat:Cardiologist . cat:Physician gist:hasSubCategory cat:Orthopedist . # INFERRED: # cat:Cardiologist gist:hasSuperCategory cat:Physician . # cat:Orthopedist gist:hasSuperCategory cat:Physician . # cat:Physician. gist:memberOf cat:Profession . # cat:Cardiologist gist:memberOf cat:Profession . # cat:Orthopedist gist:memberOf cat:Profession . # cat:some_org_or_person gist:governs cat:Profession .
Note that we didn't blindly make everything a subclass of its parent. Rather we used the formality of the gist upper-level ontology to express subclassing on a bucket level only. The child nodes remain merely "categorized" by the bucket to which they belong. In this way, any child node can also be part of any other collection or categorization. Flexibility is key when designing your knowledge graph!
And it goes without saying that adding facets to a Formal Taxonomy is exactly the same as adding facets to an Informal Taxonomy (see adding facet name + values link below).
NEXT BLOG: Ordered Lists.