{"id":1358,"date":"2017-09-13T06:31:05","date_gmt":"2017-09-13T11:31:05","guid":{"rendered":"http:\/\/inova8.com\/bg_inova8.com\/?p=1358"},"modified":"2019-04-23T02:29:51","modified_gmt":"2019-04-23T07:29:51","slug":"de-geeking-data-model-descriptions","status":"publish","type":"post","link":"https:\/\/inova8.com\/bg_inova8.com\/de-geeking-data-model-descriptions\/","title":{"rendered":"De-geeking Data-model Descriptions"},"content":{"rendered":"<div class=\"boldgrid-section\">\n<div class=\"container\">\n<div class=\"row\">\n<div class=\"col-md-12 col-xs-12 col-sm-12\">\n<blockquote><p>When a subject-matter-expert (SME) describes their data domain they use English language. In response we give them visually beautiful, but often undecipherable, diagrams. Here we propose an alternative: a \u2018word-model\u2019 that describes the model in structured English without loss of accuracy or completeness.<\/p><\/blockquote>\n<p>Creating an ontological model invariably involves a subject-matter-expert (SME) who has an in-depth knowledge of the domain to be modelled working together with a data modeler or ontologist who will translate the domain into an ontological model.<\/p>\n<p class=\"\">When a subject-matter-expert (SME) is in discussion with a data modeler, they will be describing their information using English language:<\/p>\n<blockquote>\n<p class=\"\" style=\"font-size: 16px;\">\u201cI have customers who are assigned to regions, and they create orders with a salesperson who prepares the order-details and assigns a shipper that operates in that region\u201d<\/p>\n<\/blockquote>\n<p>In response a data modeler will offer the subject-matter-expert (SME) an E-R diagram or an ontology graph!<\/p>\n<p><img loading=\"lazy\" class=\"size-full wp-image-1359 aligncenter\" src=\"http:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Geek-Diagrams.png\" alt=\"\" width=\"1122\" height=\"705\" srcset=\"https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Geek-Diagrams.png 1122w, https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Geek-Diagrams-300x189.png 300w, https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Geek-Diagrams-768x483.png 768w, https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Geek-Diagrams-1024x643.png 1024w\" sizes=\"(max-width: 1122px) 100vw, 1122px\" \/><\/p>\n<p style=\"text-align: center;\">Figure 1: Geek Model Diagrams<\/p>\n<p>No wonder we are regarded as geeks! Although visually appealing, they are difficult for an untrained user to verify the model that the diagram is describing.<\/p>\n<p class=\"\">Instead we could document the model in a more easily consumed way with a \u2018word-model\u2019. This captures the same details of the model that are present in the various diagrams, but uses structured English and careful formatting as shown below.<\/p>\n<blockquote>\n<p class=\"\" style=\"font-size: 17px;\"><em>aCustomer<\/em><\/p>\n<ul class=\"\">\n<li><u>places<\/u> <em>anOrder<\/em>\n<ul class=\"\">\n<li><u>made by<\/u> <em>anEmployee<\/em>\n<ul>\n<li>who <u>reports to<\/u> <em>anotherEmployee<\/em><\/li>\n<li>and who <u>operates in<\/u> <em>aTerritory<\/em><\/li>\n<\/ul>\n<\/li>\n<li>and <u>contains<\/u> <em>anOrderDetail<\/em>\n<ul class=\"\">\n<li><u>refers to <\/u><em>aProduct<\/em>\n<ul class=\"\">\n<li>which <u>is supplied by<\/u> <em>aSupplier<\/em><\/li>\n<li>and which <u>categorized as <\/u><em>aCategory<\/em><\/li>\n<\/ul>\n<\/li>\n<li>and <u>is shipped by<\/u> <em>aShipper<\/em><\/li>\n<li>and <u>is assigned to<\/u> <em>aRegion<\/em>\n<ul>\n<li>which <u>has<\/u> <em>aTerritory<\/em><\/li>\n<\/ul>\n<\/li>\n<li>and <u>belongs to<\/u> <em>aRegion<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>The basic principle is that we start at any entity, in this case \u2018Customer\u2019 and traverse the edges of the graph that describe that entity. At each new node we indent. Each line is a combination of the predicate and range class. No rules regarding order in which we visit the nodes and edges. No rules regarding depth. The only rule should be that, if we want a complete word-model, the description traverses all edges in one direction or the other.<\/p>\n<p>These word-models are useful in the model design phase, as they are easy to document using any editor. Since the word-model is in \u2018plain English\u2019, it is easy for a SME to verify the accuracy of the model, and mark up with comments and edits. However word-models are also easy to generate from an RDF\/OWL model.<\/p>\n<h2>Enhancements to Word-Model<\/h2>\n<p>We can refine the contents of the word-model as we develop the model with the SME.&nbsp;We can also enhance the readability by decorating the word-model text with the following fonts:<\/p>\n<blockquote>\n<h5>Word-Model Legend<\/h5>\n<h5><em>Italics<\/em>&nbsp;indicate an instance of a class, a thing<\/h5>\n<h5><strong>Bold<\/strong>&nbsp;indicates a class<\/h5>\n<h5><u>Underline<\/u>&nbsp;is a predicate or property that relates instances of classes<\/h5>\n<h5><strong><em>BoldItalic <\/em><\/strong>is used for cardinality expressions<\/h5>\n<\/blockquote>\n<h3>Level 1a: Add the categorization of entities<\/h3>\n<p>Rather than using an example of an entity, we can qualify with the class to which the sample entity belongs.<\/p>\n<blockquote>\n<p class=\"\" style=\"font-size: 17px;\"><em>aCustomer, <\/em><u>a<\/u> <strong>Customer<\/strong><\/p>\n<ul>\n<li><u>places<\/u> <em>anOrder, <u>a<\/u><\/em><strong>n Order<\/strong>\n<ul>\n<li><u>made by<\/u> <em>anEmployee, <\/em><u>an<\/u> <strong>Employee<\/strong>\n<ul>\n<li>who <u>reports to<\/u> <em>anotherEmployee, <\/em><u>an<\/u> <strong>Employee<\/strong><\/li>\n<li>and who <u>operates in<\/u> <em>aTerritory, <\/em><u>a<\/u> <strong>Territory<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and <u>contains<\/u> <em>anOrderDetail, <\/em><u>an<\/u> <strong>OrderDetail<\/strong>\n<ul>\n<li>and <u>refers to <\/u><em>aProduct, <\/em><u>a<\/u> <strong>Product<\/strong>\n<ul>\n<li>which <u>is supplied by<\/u> <em>aSupplier, <\/em><u>a<\/u> <strong>Supplier<\/strong><\/li>\n<li>and which <u>is categorized as <\/u><em>aCategory, <\/em><u>a<\/u> <strong>Category<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and <u>is shipped by<\/u> <em>aShipper, <\/em><u>a<\/u> <strong>Shipper<\/strong><\/li>\n<li>and <u>is assigned to<\/u> <em>aRegion, <\/em><u>a<\/u> <strong>Region<\/strong>\n<ul>\n<li>which <u>has<\/u> <em>aTerritory, <\/em><u>a<\/u> <strong>Territory<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and <u>belongs to<\/u> <em>aRegion, <\/em><u>a<\/u> <strong>Region<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n<h3>Level 1b: Add cardinality of predicates<\/h3>\n<p>We can also add the cardinality as a modifier between the predicate and the entity:<\/p>\n<blockquote>\n<p class=\"\" style=\"font-size: 17px;\"><em>aCustomer<\/em><\/p>\n<ul>\n<li>who <u>places<\/u> <strong><em>zero, one or more<\/em><\/strong> <em>order<strong>s<\/strong><\/em>\n<ul>\n<li>each <u>made by<\/u> <strong><em>one<\/em><\/strong> <em>anEmployee<\/em>\n<ul>\n<li>who <u>reports to<\/u> <strong><em>zero or<\/em><\/strong> <strong><em>one<\/em><\/strong> <em>anotherEmployee<\/em><\/li>\n<li>and who <u>operates in<\/u> <strong><em>one or more<\/em><\/strong> <em>aTerritory<strong>s<\/strong><\/em><\/li>\n<\/ul>\n<\/li>\n<li>and each <u>contains<\/u> <strong><em>one or more<\/em><\/strong> <em>anOrderDetails<\/em>\n<ul>\n<li>which <u>refers to<\/u><strong><em> one<\/em><\/strong> <em>aProduct<\/em>\n<ul>\n<li>which <u>is supplied by<\/u> <strong><em>one <\/em><\/strong><em>aSupplier<\/em><\/li>\n<li>and which <u>is categorized as<\/u><strong><em> one<\/em><\/strong> <em>aCategory<\/em><\/li>\n<\/ul>\n<\/li>\n<li>and <u>is shipped by<\/u> <strong><em>one<\/em><\/strong> <em>aShipper<\/em><\/li>\n<li>and <u>is assigned to<\/u> <strong><em>one<\/em><\/strong> <em>aRegion<\/em>\n<ul>\n<li>which <u>has<\/u> <strong><em>one or more<\/em><\/strong> <em>aTerritory<strong>s<\/strong><\/em><\/li>\n<\/ul>\n<\/li>\n<li>and <u>belongs to<\/u> <strong><em>one<\/em><\/strong> <em>aRegion<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n<h3>Level 2: Add categorization and cardinality<\/h3>\n<p>Of course we can combine these extensions into a single word-modol as shown below.<\/p>\n<blockquote>\n<p class=\"\" style=\"font-size: 17px;\"><em>aCustomer, <\/em><u>a<\/u> <strong>Customer<\/strong><\/p>\n<ul class=\"\">\n<li>who <u>places<\/u> <strong><em>zero, one or more<\/em><\/strong> <em>order<strong>s<\/strong>, each <u>a<\/u><\/em><strong>n Order<\/strong>\n<ul class=\"\">\n<li>each <u>made by<\/u> <strong><em>one<\/em><\/strong> <em>anEmployee, <\/em><u>an<\/u> <strong>Employee<\/strong>\n<ul>\n<li>who <u>reports to<\/u> <strong><em>zero or<\/em><\/strong> <strong><em>one<\/em><\/strong> <em>anotherEmployee, <\/em><u>an<\/u> <strong>Employee<\/strong><\/li>\n<li>and who <u>operates in<\/u> <strong><em>one or more<\/em><\/strong> <em>aTerritory<strong>s<\/strong>, each <\/em><u>a<\/u> <strong>Territory<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and each <u>contains<\/u> <strong><em>one or more<\/em><\/strong> <em>anOrderDetails, each <\/em><u>an<\/u> <strong>OrderDetail<\/strong>\n<ul>\n<li>which <u>refers to<\/u><strong><em> one<\/em><\/strong> <em>aProduct, <\/em><u>a<\/u> <strong>Product<\/strong>\n<ul>\n<li>which <u>is supplied by<\/u> <strong><em>one <\/em><\/strong><em>aSupplier, <\/em><u>a<\/u> <strong>Supplier<\/strong><\/li>\n<li>and which <u>is categorized as<\/u><strong><em> one<\/em><\/strong> <em>aCategory, <\/em><u>a<\/u> <strong>Category<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and <u>is shipped by<\/u> <strong><em>one<\/em><\/strong> <em>aShipper, <\/em><u>a<\/u> <strong>Shipper<\/strong><\/li>\n<li>and <u>is assigned to<\/u> <strong><em>one<\/em><\/strong> <em>aRegion, <\/em><u>a<\/u> <strong>Region<\/strong>\n<ul>\n<li>which <u>has<\/u> <strong><em>one or more<\/em><\/strong> <em>aTerritory<strong>s<\/strong>, each <\/em><u>a<\/u> <strong>Territory<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>and <u>belongs to<\/u> <strong><em>one<\/em><\/strong> <em>aRegion, <\/em><u>a<\/u> <strong>Region<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Despite the completeness of what is being described by this word-model, it is still easy to read by SMEs.<\/p>\n<h2>Auto-generation of Word-Model<\/h2>\n<p>Once the word-model has been formally documented in RDF\/OWL, we can still use a word-model to document the RDF\/OWL by auto-generating a word-model from the underlying RDF\/OWL ontology as shown below.<\/p>\n<p><img loading=\"lazy\" class=\"size-full wp-image-1360 aligncenter\" src=\"http:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model.png\" alt=\"\" width=\"381\" height=\"532\" srcset=\"https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model.png 381w, https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model-215x300.png 215w\" sizes=\"(max-width: 381px) 100vw, 381px\" \/><\/p>\n<p style=\"text-align: center;\">Figure 2: Word-Model<\/p>\n<p>This was generated using a SPIN magic-property as follows:<\/p>\n<pre>select ?modelDefinition\r\n{\r\n&nbsp;&nbsp; (model:Customer 4 false) <strong>:modelDefinition<\/strong> ?modelDefinition .\r\n}<\/pre>\n<p>This auto-generation can go further by including the datatype properties associated with each entity as shown below:<\/p>\n<p><img loading=\"lazy\" class=\"size-full wp-image-1361 aligncenter\" src=\"http:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model-with-attributes.png\" alt=\"\" width=\"730\" height=\"747\" srcset=\"https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model-with-attributes.png 730w, https:\/\/inova8.com\/bg_inova8.com\/wp-content\/uploads\/2017\/09\/Auto-generated-Word-Model-with-attributes-293x300.png 293w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><\/p>\n<p style=\"text-align: center;\">Figure 3: Word-Model including datatype properties<\/p>\n<p>This was generated using a SPIN magic-property as follows:<\/p>\n<pre>select ?modelDefinition\r\n{\r\n&nbsp;&nbsp; (model:Customer 4 true) <strong>:modelDefinition<\/strong> ?modelDefinition .\r\n}<\/pre>\n<h1>Appendix<\/h1>\n<h2>SPIN Magic Properties:<\/h2>\n<p>The following SPIN properties were defined for auto generation of the word-model in HTML format:<\/p>\n<h3>classProperties<\/h3>\n<pre><strong>SELECT<\/strong> ?classProperties\r\n<strong>WHERE<\/strong> {\r\n{<strong>SELECT<\/strong>&nbsp; <strong>?arg1<\/strong>&nbsp;&nbsp; (&nbsp;&nbsp;&nbsp; <strong>IF<\/strong>(<strong>?arg2<\/strong>,&nbsp; <strong>CONCAT<\/strong>(\"(\",?properties,\")\"),\"\") as ?classProperties) <strong>WHERE<\/strong>\r\n&nbsp;&nbsp;&nbsp; {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>SELECT<\/strong> <strong>?arg1<\/strong> ((<strong>GROUP_CONCAT<\/strong>(<strong>CONCAT<\/strong>(\"&lt;i&gt;\", ?dataPropertyLabel, \"&lt;\/i&gt;\"); <strong>SEPARATOR<\/strong>=', ')) <strong>AS<\/strong> ?properties)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>WHERE<\/strong> {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # <strong>BIND<\/strong> (model:Product <strong>AS<\/strong> <strong>?arg1<\/strong>) .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>?arg1<\/strong> a ?class .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>FILTER<\/strong> (?class <strong>IN<\/strong> (rdfs:Class, owl:Class)) .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>?arg1<\/strong> rdfs:label ?classLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?dataProperty a owl:DatatypeProperty .\r\n&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?dataProperty rdfs:domain <strong>?arg1<\/strong> .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?dataProperty rdfs:label ?dataPropertyLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>GROUP<\/strong> <strong>BY<\/strong> <strong>?arg1<\/strong>\r\n&nbsp;&nbsp;&nbsp; }\r\n}\r\n}<\/pre>\n<h3>classDefinition<\/h3>\n<pre><strong>SELECT<\/strong> ?classDefinition ?priorPath\r\n<strong>WHERE<\/strong> {\r\n&nbsp;&nbsp;&nbsp; {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>SELECT<\/strong> <strong>?arg1<\/strong> <strong>?arg2<\/strong>&nbsp; ((<strong>GROUP_CONCAT<\/strong>( ?definition; <strong>SEPARATOR<\/strong>='&lt;br\/&gt;and that ')) <strong>AS<\/strong> ?classDefinition)&nbsp; ((<strong>GROUP_CONCAT<\/strong>( ?pastPath; <strong>SEPARATOR<\/strong>='\\t')) <strong>AS<\/strong> ?priorPath)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>WHERE<\/strong> {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>?arg1<\/strong> a ?class . <strong>FILTER<\/strong>( ?class in (rdfs:Class, owl:Class ))\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>?arg1<\/strong> rdfs:label ?classLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty a owl:ObjectProperty .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:domain <strong>?arg1<\/strong> .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:label ?objectPropertyLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?objectProperty rdfs:range ?nextClass .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?nextClass rdfs:label ?nextClassLabel .&nbsp;&nbsp; <strong>BIND<\/strong>(?objectProperty as ?property)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<strong>UNION<\/strong>{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?objectProperty&nbsp; owl:inverseOf ?inverseObjectProperty .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:domain&nbsp; ?nextClass.\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?inverseObjectProperty rdfs:label ?objectPropertyLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:range <strong>?arg1<\/strong> .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?nextClass rdfs:label ?nextClassLabel .&nbsp;&nbsp;&nbsp; <strong>BIND<\/strong>(?inverseObjectProperty as ?property)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<strong>UNION<\/strong>{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?inverseObjectProperty&nbsp; owl:inverseOf ?objectProperty .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:domain&nbsp; ?nextClass.\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?inverseObjectProperty rdfs:label ?objectPropertyLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?objectProperty rdfs:range&nbsp; <strong>?arg1<\/strong> .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?nextClass rdfs:label ?nextClassLabel .&nbsp;&nbsp;&nbsp; <strong>BIND<\/strong>(?inverseObjectProperty as ?property)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\r\n#Stop from going too deep\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>BIND<\/strong>(<strong>?arg2<\/strong> -1 as ?span) <strong>FILTER<\/strong>(?span&gt;0).&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?nextClass a ?nextClassClass. <strong>FILTER<\/strong>( ?nextClassClass in (rdfs:Class, owl:Class ))\r\n#,&nbsp; odata4sparql:Operation))&nbsp; .\r\n#Do not process an already processed arc (objectProperty)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>BIND<\/strong>(<strong>CONCAT<\/strong>(<strong>?arg4<\/strong>,\"\\t\",?objectPropertyLabel) as ?forwardPath) <strong>FILTER<\/strong>( !CONTAINS(<strong>?arg4<\/strong>, ?objectPropertyLabel ))&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (?nextClass ?span <strong>?arg3<\/strong> ?forwardPath ) <strong>:classDefinition<\/strong> (?nextClassDefinition&nbsp; ?nextPath).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n#Do not include if arc (objectProperty) appears already&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>FILTER<\/strong>(&nbsp; !CONTAINS(?nextPath, ?objectPropertyLabel )) <strong>BIND<\/strong>(<strong>CONCAT<\/strong>( ?objectPropertyLabel, <strong>IF<\/strong>(?nextPath=\"\",\"\",<strong>CONCAT<\/strong>(\"\\t\",?nextPath))) as ?pastPath)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (?nextClass <strong>?arg3<\/strong>) <strong>:classProperties<\/strong> ?nextClassProperties .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>BIND<\/strong> (<strong>CONCAT<\/strong>(\"&lt;u&gt;\",?objectPropertyLabel , \"&lt;\/u&gt; &lt;b&gt;\", ?nextClassLabel, \"&lt;\/b&gt;\",&nbsp; ?nextClassProperties, <strong>IF<\/strong> ((?nextClassDefinition!=\"\"), <strong>CONCAT<\/strong>(\"&lt;br\/&gt;&lt;blockquote&gt;that \",&nbsp; ?nextClassDefinition, \"&lt;\/blockquote&gt;\"), \"\")&nbsp; ) as ?definition)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>GROUP<\/strong> <strong>BY<\/strong> <strong>?arg1<\/strong> <strong>?arg2<\/strong>\r\n&nbsp;&nbsp;&nbsp; } .\r\n}<\/pre>\n<h3>modelDefintion<\/h3>\n<pre><strong>SELECT<\/strong> ?modelDefinition\r\n<strong>WHERE<\/strong> {\r\n&nbsp;&nbsp;&nbsp; {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>SELECT<\/strong> <strong>?arg1<\/strong> <strong>?arg2<\/strong> <strong>?arg3<\/strong> ((<strong>CONCAT<\/strong>(\"&lt;b&gt;\", ?classLabel, \"&lt;\/b&gt;\", ?nextClassProperties, \"&lt;blockquote&gt;that \", ?classDefinition, \"&lt;\/blockquote&gt;\")) <strong>AS<\/strong> ?modelDefinition)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>WHERE<\/strong> {\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # <strong>BIND<\/strong> (model:Order <strong>AS<\/strong> <strong>?arg1<\/strong>) .&nbsp; <strong>BIND<\/strong> (4 <strong>AS<\/strong> <strong>?arg2<\/strong>) . <strong>BIND<\/strong> (false <strong>AS<\/strong> <strong>?arg3<\/strong>) .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( <strong>?arg1<\/strong> <strong>?arg2<\/strong> <strong>?arg3<\/strong> \"\") <strong>:<\/strong>classDefinition (?classDefinition \"\") .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( <strong>?arg1<\/strong> <strong>?arg3<\/strong> ) <strong>:classProperties<\/strong> ?nextClassProperties .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>?arg1<\/strong> rdfs:label ?classLabel .\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\r\n&nbsp;&nbsp;&nbsp; } .\r\n}<\/pre>\n<h3>Usage<\/h3>\n<p>The following will return the HTML description of the model, starting with model:Customer, stopping at a depth of 4 in any direction, and not including the datatypeproperty definition.<\/p>\n<pre>select ?modelDefinition\r\n{\r\n&nbsp;&nbsp; (model:Customer 4 false) <strong>:modelDefinition<\/strong> ?modelDefinition .\r\n}<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>When a subject-matter-expert (SME) describes their data domain they use English language. In response we give them visually beautiful, but often undecipherable, diagrams. Here we propose an alternative: a \u2018word-model\u2019 that describes the model in structured English without loss of accuracy or completeness. Creating an ontological model invariably involves a subject-matter-expert (SME) who has an [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bgseo_title":"De-geeking Data-model Descriptions","bgseo_description":"When a subject-matter-expert (SME) describes their data domain they use English language. In response we give them visually beautiful, but often undecipherable, diagrams. Here we propose an alternative: a \u2018word-model\u2019 that describes the model in structured English without loss of accuracy or completeness.\r\n","bgseo_robots_index":"index","bgseo_robots_follow":"follow","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[16,15,14,28,10,12,8,30,9,7,32],"tags":[48,43,41,40,49,35,44,38,42,36,37,39,45,34,47,46],"_links":{"self":[{"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/posts\/1358"}],"collection":[{"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/comments?post=1358"}],"version-history":[{"count":9,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/posts\/1358\/revisions"}],"predecessor-version":[{"id":1370,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/posts\/1358\/revisions\/1370"}],"wp:attachment":[{"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/media?parent=1358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/categories?post=1358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inova8.com\/bg_inova8.com\/wp-json\/wp\/v2\/tags?post=1358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}