ECLASS RDF Representation

Vladimir Alexiev, Chief Data Architect, Ontotext

21-Dec-2020

1 Motivation

We discuss various considerations for representing ECLASS product info as RDF.

1.1 Ontotext Presentations

Somewhat related Ontotext presentations:

1.2 Crucial Questions

Crucial Questions to consider when designing ECLASS RDF.

Together with the use cases and competency questions, they should provide a frame of reference for making decisions that are usable, consistent, viable in the long term.

While I have my doubts that the ECLASS Association will be able to soon subscribe to these principles, I believe they are important considerations to keep in mind.

1.2.1 Semantic Web Principles

Semantic Web and Linked Data are based on several simple principles:

1.2.2 Decentralization

Data Decentralization (Distribution)

1.2.2.1 Data Copying

As far as I can see, most Industry data still relies on Data Copying (or Exchange).

1.2.3 Ontological Realism vs Idiosyncrasy

Compare:

1.2.3.1 Step-by-Step Guide to Ontology Development (excerpts)

1.2.4 Open vs Closed Data Ecosystems

ECLASS is a very closed data environment: it does not reuse data by anyone else. Eg:

Why should ECLASS care about this?

1.2.5 The Web: Open Innovation

W3C standards are fully open:

1.2.6 The Web Invites Wide Participation

1.2.7 ISO and IEC: Closed Standards

ISO and IEC standards are closed:

1.2.8 ISO and IEC: Positive Aspects

"ISO/IEC are for professional use, so money is not a problem"

1.2.9 PLIB and POM: Not Open Data

1.3 Local vs Global Thinking

1.4 Use Cases

Not yet discussed/confirmed:

1.4.1 Product Libraries

1.4.1.1 IEC 62656 POM

1.4.1.2 PLIB/POM Product Library Examples

1.4.1.3 POM Example: IEC CDD

1.4.1.4 IEC CDD Expansion Plans

1.4.2 Web of Things TD

1.4.2.1 WoT TD Templates

TD Templates: description for a class of Things (entire group of Things).

WoT spec posits these use cases:

Elaborating the last case:

1.4.2.2 WoT TD Questions

There are many questions/details to be aligned, most importantly:

1.4.3 Online Product Catalogs

1.4.4 schema.org

1.4.4.1 schema.org eCommerce

Web Data Commons crawl 2019-12: a huge chunk is eCommerce data.

1.4.5 Industrie 4.0

Cornerstones of the German Industrie 4.0 initiative:

Intended to unify/incorporate/extend previous Industrial IoT models including AutomationML, OPC UA, IEC CDD, and ECLASS.

Spec "Details of the Asset Administration Shell Part 1" (Version 2.0.1 2019-11) includes the following semantic parts in Annex G

1.4.5.1 AAS Explorer and Import

The AAS Package Explorer (AASX) can import the following formats to AAS:

1.4.5.2 AASX ECLASS Import

1.4.5.3 RAMI/AAS Problems

Relies on copying, not web data distribution; blank nodes not global IRIs:

<http://i40.customer.com/type/1/1/7A7104BDAB57E184> a aas:Submodel;
  aas_referable:idShort "TechnicalData";
  rdfs:label "TechnicalData";
  aas_referable:category "CONSTANT";
  aas_identifiable:identification <http://i40.customer.com/type/1/1/7A7104BDAB57E184>;
  aas_hasSemantics:semanticId [
    a aas:Reference;
    aas_reference:key [
      a aas:Key;
      aas_key:index "0"^^xsd:integer;
      aas_key:type aas_keyElements:GLOBAL_REFERENCE;
      aas_key:local "false"^^xsd:boolean;
      aas_key:value "0173-1#01-AFZ615#016";
      aas_key:idType aas_identifierType:IRDI]];
  aas_hasKind:kind aas_modelingKind:INSTANCE;
  aas_submodel:submodelElement [
    a aas:Property;
    rdf:subject <http://i40.customer.com/type/1/1/7A7104BDAB57E184/MaxRotationSpeed>;
    aas_referable:idShort "MaxRotationSpeed";
    rdfs:label "MaxRotationSpeed";
    aas_property:category aas_category:PARAMETER;
    aas_hasSemantics:semanticId [
      a aas:Reference;
      aas_reference:key [
        a aas:Key;
        aas_key:index "0"^^xsd:integer;
        aas_key:type aas_identifiableElements:CONCEPT_DESCRIPTION;
        aas_key:local "true"^^xsd:boolean;
        aas_key:value "0173-1#02-BAA120#008";
        aas_key:idType aas_identifierType:IRDI]];
    aas_hasKind:kind aas_modelingKind:INSTANCE;
    aas_key:value "5000"^^xsd:integer];

<http://i40.customer.com/type/1/1/F13E8576F6488342/MaxRotationSpeed>
  a aas:ConceptDescription;
  aas_referable:idShort "MaxRotationSpeed";
  rdfs:label "MaxRotationSpeed";
  aas_referable:category "PROPERTY";
  aas_identifiable:identification [
    aas_identifier:id "0173-1#02-BAA120#008";
    aas_identifier:idType aas_identifierType:IRDI];
  aas_identifiable:administration [
    a aas:AdministrativeInformation;
    aas_administrativeInformation:revision ""];
  aas_conceptDescription:content [
    a dataspec_iec:DataSpecificationIEC61360;
    dataspec_iec:preferredName "max. Drehzahl"@de;
    dataspec_iec:preferredName "Max. rotation speed"@en;
    dataspec_iec:unit "1/min";
    dataspec_iec:unitId [
      a aas:Reference;
      aas_reference:key [
        a aas:Key;
        aas_key:index "0"^^xsd:integer;
        aas_key:type aas_keyElements:GLOBAL_REFERENCE;
        aas_key:local "false"^^xsd:boolean;
        aas_key:value "0173-1#05-AAA650#002";
        aas_key:idType aas_identifierType:IRDI]];
    dataspec_iec:datatype "INTEGER_MEASURE";

1.5 Non-Functional Requirements

Use cases outline the information domains that ECLASS RDF must relate to.

But that's not the whole story, we also need to detail:

1.5.1 How to Get The Data

1.5.2 Competency Questions

Defined Competency Questions are the best way to guide ontology development

But we still need to answer:

2 Related Work

Various previous works are relevant for the ECLASS effort.

2.1 Martin Hepp

Martin Hepp's work on semantic web approaches to eCommerce is well-known and established:

I'm sure ECLASS has taken into account his experiments, but we can turn back to his work for more advice and guidance. Below I list Martin's papers that are relevant to this effort.

Comparison/Overview of product description vocabularies:

2.1.1 Martin Hepp (2)

Conversion Methods:

Specific Product Classifications:

2.1.2 Martin Hepp (3)

ECLASS:

ISO 13584 (PLIB):

2.2 schema.org

Schema.org describes many real-world entities, is applicable in a wide variety of domains, and integrates data from a huge number of providers and domains

2.2.1 RDFS/OWL: High Ontological Commitment

RDFS defines the properties rdfs:domain and rdfs:range

But all of these approaches complicate the ontology, increase "ontological commitment", and ultimately make ontology reuse harder.

2.2.2 schema.org: Low Ontological Commitment

To cope with web-scale integration of data, Schema uses properties schema:domainIncludes and schema:rangeIncludes

2.2.3 Schema.org Specific Classes

schema.org has several releant classes. Should be considered for reuse:

Might be relevant:

2.2.4 Schema.org Specific Props

schema.org also has some fixed product properties. Can be useful if you decide to replace some IRDIs with named terms:

Extensions for particular product domains, eg Automotive, Financial, Hospitality.

2.3 Application Profiles

Application profiles serve several related goals, see W3C Profiles Guidance adn the earlier Guidelines for Dublin Core Application Profiles

2.3.1 RDF Shapes

RDF Shapes have emerged as the way to express application profiles in machine-readable way and to validate RDF.

2.4 RDF Literals and Datatypes

2.5 UoM Ontologies

Widely used lists:

There are also about 10 ontologies:

2.6 UoM Ontologies (2)

2 UoM ontologies are most promising and widely used:

2.6.1 UoM Evaluations

2.6.2 Use Cases and Suitability Metrics for UO (1)

2.6.3 Use Cases and Suitability Metrics for UO (2)

2.6.4 Comparison and Evaluation of Ontologies for UoM

2.6.5 The Future of Web-Enabled UoM

This just out:

3 OntoML Representation

3.0.1 OntoML Pros and Cons

Both the first and second ECLASS RDF representations closely mirror OntoML.

3.1 OntoML Problems

3.1.1 RDF/RDFS/OWL: Simple, Logical

3.1.2 OntoML: Complicated, Not Semantic, Not Logical

3.1.3 OntoML: Niche Terminology (1)

Very few people will take the time to read and understand OntoML, and fewer will use it correctly. Here's an attempt at "translation" (please excuse me if I got some OntoML terms wrong).

OntoML RDF/OWL
classification class Conceptual hierarchy, probably skos:Concept in ConceptScheme
characterization class Product class (eg ec:ProductClass)
application class Product class; the basic/advanced distinction should be handled through Profiles
product model schema:ProductModel (in manufacturer catalog, refers to ec:ProductClass)
property Property, with rich definition
reference Object Property linking to product or part
attaching property to class OWL DL owl:Restriction or schema:domainIncludes or RDF Shape
synonym/alias Property altLabel
keyword Class altLabel or keyword/subject

3.1.4 OntoML: Niche Terminology (2)

OntoML RDF/OWL
block Product part (but need to confirm whether all "blocks" are parts)
aspect Class holding additional information (eg Manufacturer, Supplier, Customs info, etc)
cardinality Numbered product part
polymorphism Named product part
depending property RDF Shape describing the dependency
value list Enumerated class (owl:oneOf) or skos:ConceptScheme or schema:DefinedTermSet
value Object
explicit value Literal
coded value Individual from an enumerated class
domain Property range (class or datatype)
unit Unit of Measure ontologies
level Property qualifier (eg min, max), need to also include current, stdev etc

3.1.5 OntoML Uses its Own Datatypes

For basic data, OntoML uses its own classes:

This is not economical, people will not waht to use that in RDF.

3.1.6 OntoML Uses its Own UoM

OntoML is a closed information ecosystem, so it promotes the use of own Units of Measure (UoM)

Maybe ECLASS should not attempt to be an authority on UoM?

3.1.7 OntoML: Local vs Global Thinking

OntoML is based upon local not global thinking. Examples:

3.1.8 OntoML: Not Oriented Towards Linked Data

Being based on XML, OntoML is not oriented towards Linked Data

3.2 IRDI vs Named Classes/Props (pros)

I understand the logic of using IRDIs instead of names for ontology terms (classes and properties):

The largest ontology with named terms that I know of is FIBO in the financial domain: 122 ontologies, 1500 classes, 1000 properties. But most of the huge ontologies use numbered/coded class, eg:

3.2.1 IRDI vs Named Classes/Props (Cons)

There are some considerations against using IRDI terms:

3.3 IRDI Stability vs Versioning

3.3.1 IRDI Versioning Cons

3.3.2 Versioned IRIs Make Querying Harder

# simplest
?x schema:height ?h
filter (?h >= 10)

# unacceptable: label is not stable
?height ec:label "Height". 

# find IRDI by substring: slow
?height a ec:Property; ec:irdi ?irdi.
filter(strstarts(?irdi,"0176//blah-blah#")) # excluding version
?x ?height ?h
filter (?h >= 10)

# better to have explicit connections between IRDIs:
:0176__blah-blah a ec:Property;
  ec:irdi "0176//blah-blah";
  ec:propertyVersion :0176__blah-blah_001, :0176__blah-blah_002;
  ec:label "height".

:0176__blah-blah_002 a ec:PropertyVersion;
  :irdi "0176//blah-blah#001";
  ec:basicProperty :0176__blah-blah;
  ec:label "height".

# query:
?height a ec:VersionedProperty; ec:basicProperty :0176__blah-blah.
?x ?height ?h.
filter (?h >= 10)

3.3.3 Using Version-less IRIs (1)

3.3.4 Using Version-less IRIs (2)

3.3.5 Versioning Example: QUDT

@prefix unit: <http://qudt.org/vocab/unit/> .  ### version-less
unit:A                                         ### URLs are permanent
  a qudt:Unit ;
  qudt:dbpediaMatch "http://dbpedia.org/resource/Ampere"^^xsd:anyURI ; ### version-less
  qudt:hasDimensionVector qkdv:A0E1L0I0M0H0T0D0 ;
  qudt:hasQuantityKind quantitykind:ElectricCurrent ;
  qudt:iec61360Code "0112/2///62720#UAA101" ;  ### version-less
  qudt:iec61360Code "0112/2///62720#UAD717" ;  ### version-less
  qudt:informativeReference "http://en.wikipedia.org/wiki/Ampere?oldid=494026699"^^xsd:anyURI ; 
    ### Versioned: this exact Wikipedia edit
  qudt:omUnit <http://www.ontology-of-units-of-measure.org/resource/om-2/ampere> ;
    ### Versioned: big changes from OM 1.1 to OM 2
  qudt:ucumCode "A"^^qudt:UCUMcs ;
  qudt:uneceCommonCode "AMP" ;
  qudt:unitOfSystem <http://qudt.org/vocab/sou/SOU_SI> ;
  rdfs:isDefinedBy <http://qudt.org/2.1/vocab/unit> ; ### versioned
  rdfs:label "Ampere"@en ;
  skos:altLabel "amp" ;

3.4 Sample RDF Patterns

I can't make complete and definite examples yet because there are many questions to be decided.

3.4.1 Classification Hierarchy

If we use SKOS to represent the classification, it can go like this.

:ECLASS a skos:ConceptScheme; skos:prefLabel "ECLASS Product Classification"@en, "..."@de.

:27000000 a skos:Concept; skos:notation "27000000"; :irdi "..."; skos:inScheme :ECLASS; skos:topConceptOf :ECLASS;
  skos:prefLabel "27 Electric engineering, automation, process control engineering"@en.
:27070000 a skos:Concept; skos:notation "27070000"; :irdi "..."; skos:inScheme :ECLASS; skos:broader :27000000;
  skos:prefLabel "27-07 Medium voltage switchgear, system"@en.
:27070200 a skos:Concept; skos:notation "27070200"; :irdi "..."; skos:inScheme :ECLASS; skos:broader :27070000;
  skos:prefLabel "27-07-02 Switch (medium voltage)"@en.
:27070203 a skos:Concept; skos:notation "27070203"; :irdi "..."; skos:inScheme :ECLASS; skos:broader :27070200;
  skos:prefLabel "27-07-02-03 Disconnecting switch (medium voltage)"@en.

3.4.2 Product Class

An application class (basic or advanced) is represented as an OWL class :ProductClass.

:Ceiling_wall_luminaire a :ProductClass; :irdi "0173-1#01-AGB066#004"; :classification :27010203;
  :prefLabel "Ceiling-wall luminaire"@en, :altLabel "lamp"@en, "лампион"@bg, "plafon"@en.

3.4.3 Product Chracteristics

:luminaire_application a owl:ObjectProperty; 
  :irdi "0173-1#02-BAB386"; :versionedIrdi "0173-1#02-BAB386#006";
  :prefLabel "application"@en;
  schema:domainIncludes :Ceiling-wall_luminaire;
  schema:rangeIncludes :Luminaire-Application.

:design_of_interior_lighting a owl:DatatypeProperty;
  :irdi "0173-1#02-AAP824"; :versionedIrdi "0173-1#02-AAP824#001";
  :prefLabel "design of interior lighting"@en;
  schema:domainIncludes :Ceiling-wall_luminaire;
  schema:rangeIncludes xsd:string. # not translatable

:design_of_illuminant a owl:DatatypeProperty;
  :irdi "0173-1#02-BAA209";
  :prefLabel "design of illuminant"@en;
  schema:domainIncludes :Ceiling-wall_luminaire;
  schema:rangeIncludes rdf:langString. # translatable

:material a owl:ObjectProperty;
  :irdi "0173-1#02-BAB664";
  :prefLabel "material"@en;
  schema:domainIncludes :Ceiling-wall_luminaire, ...;
  schema:rangeIncludes :Material.

:pole_number a owl:DatatypeProperty;
  :irdi "0173-1#02-AAT080";
  :prefLabel "pole number"@en;
  schema:domainIncludes :Ceiling-wall_luminaire;
  schema:rangeIncludes xsd:integer.

3.4.4 Value Lists

We represent them as enumerated classes with instances (above we used these specific classes).

:Luminaire-Application a rdfs:Class; :irdi "0173-1#02-BAB386";
  :prefLabel "application"@en.

:Headlight_car_truck a :Luminaire-Application; irdi "...";
  "Headlight, car+truck"@en.
:Headlight_motorcycle a :Luminaire-Application; irdi "...";
  "Headlight, motorcycle"@en.

:Material a rdfs:Class; :irdi "0173-1#02-BAB664";
  :prefLabel "Material"@en.

:Real_glas a :Material; :irdi "...";
  :prefLabel "Real glas"@en.
:Thermoplast a :Material; :irdi "...";
  :prefLabel "Thermoplast"@en.

3.4.5 Blocks and Aspects

Blocks and Aspects are groups of properties that we represent as additional classes.

# Aspect classes
:IdentificationAspects a rdfs:Class; :irdi "..."; :prefLabel "Identification aspects"@en.
:SupplierAspects       a rdfs:Class; :irdi "..."; :prefLabel "Supplier aspects"@en.
:ManufacturerAspects   a rdfs:Class; :irdi "..."; :prefLabel "Manufacturer aspects"@en.

# Links to aspects
:identification a owl:ObjectProperty; :irdi "..."; :prefLabel "Identification aspects"@en;
  schema:domainIncludes :Ceiling_wall_luminaire, ...; schema:rangeIncludes :IdentificationAspects.
:supplier       a owl:ObjectProperty; :irdi "..."; :prefLabel "Supplier aspects"@en.
  schema:domainIncludes :IdentificationAspects; schema:rangeIncludes :SupplierAspects.
:manufacturer   a owl:ObjectProperty; :irdi "..."; :prefLabel "Manufacturer aspects"@en.
  schema:domainIncludes :IdentificationAspects; schema:rangeIncludes :ManufacturerAspects.

3.4.6 Blocks and Aspects (2)

# Aspect props
:product_article_number_of_supplier a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :SupplierAspects; schema:rangeIncludes xsd:string.
:name_of_supplier a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :SupplierAspects; schema:rangeIncludes rdf:langString.
:gln_of_supplier a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :SupplierAspects; schema:rangeIncludes xsd:string.

:date_of_manufacture a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :ManufacturerAspects; schema:rangeIncludes xsd:date.
:gtin a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :ManufacturerAspects; schema:rangeIncludes xsd:string.
:manufacturer_name a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :ManufacturerAspects; schema:rangeIncludes rdf:langString.
:gln_of_manufacturer a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :ManufacturerAspects; schema:rangeIncludes xsd:string.

3.4.7 Blocks and Aspects Problems

The above representation has several defects:

3.4.8 Blocks and Aspects Refactoring

Below I show a better way to model it, but I understand this may be hard or impossible do systematically.

3.4.9 Blocks and Aspects Refactored

:Organization a rdfs:Class; :prefLabel "Organization/company"@en.

:supplier a owl:ObjectProperty; :irdi "..."; :prefLabel "Supplier"@en.
  schema:domainIncludes :Ceiling-wall_luminaire, ...; schema:rangeIncludes :Organization.
:manufacturer a owl:ObjectProperty; :irdi "..."; :prefLabel "Manufacturer"@en.
  schema:domainIncludes :Ceiling-wall_luminaire, ...; schema:rangeIncludes :Organization.

:name a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :Organization; schema:rangeIncludes rdf:langString.
:gln a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :Organization; schema:rangeIncludes xsd:string.

:product_article_number_of_supplier a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :Ceiling-wall_luminaire; schema:rangeIncludes xsd:string.
:date_of_manufacture a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :Manufacturer; schema:rangeIncludes xsd:date.
:gtin a owl:DatatypeProperty; :irdi "..."; :prefLabel "..."@en;
  schema:domainIncludes :Manufacturer; schema:rangeIncludes xsd:string.

3.4.10 Catalog Entry

Ok, enough ontology talk!

3.4.11 Catalog Entry (Refactored)

mf:1234567 a schema:ProductModel, :Ceiling_wall_luminaire;
  schema:name "Smart lamp";
  :manufacturer mf:Company1;
  :supplier mf:Company2;
  :gtin "1234567"; # or schema:gtin
  :product_article_number_of_supplier "A-1234567";
  :uri_of_the_product <http://company1.com/product/1234567>; # or schema:uri
  :date_of_manufacture "2020-10-10"^^xsd:date;
  :luminaire_application :Wall_lamp;
  :design_of_interior_lighting "curved";
  :pole_number 2;
  :material :Real_glas, :Thermoplast.

mf:Company1 a :Organization; :name "Company1"@en; :gln "987654321".
  # Add here any number of org props, like address, website, etc

mf:Company2 a :Organization; :name "Company2"@en; :gln "098765432".
  # Add here any number of org props, like address, website, etc

3.4.12 Catalog Entry (Not Refactored)

To appreciate that the above refactored representation is better, here's the systematic representation:

3.4.13 Catalog Entry (Not Refactored)

mf:1234567 a schema:ProductModel, :Ceiling_wall_luminaire;
  schema:name "Smart lamp";
  :luminaire_application :Wall_lamp;
  :design_of_interior_lighting "curved";
  :pole_number 2;
  :material :Real_glas, :Thermoplast;
  :identification mf:1234567_identification.

mf:1234567_identification a :IdentificationAspects;
  :manufacturer mf:1234567_manufacturer;
  :supplier mf:1234567_supplier.

mf:1234567_manufacturer a :ManufacturerAspects;
  :gtin "1234567"; # or schema:gtin
  :uri_of_the_product <http://company1.com/product/1234567>; # or schema:uri
  :date_of_manufacture "2020-10-10"^^xsd:date;
  :name_of_manufacturer "Company1"@en;
  :gln_of_manufacturer "987654321".

mf:1234567_supplier a :SupplierAspects;
  :product_article_number_of_supplier "A-1234567";
  :name_of_supplier "Company2"@en;
  :gln_of_supplier "098765432".

3.4.14 Cardinality

Let's show how to represent repeated aspects ("Cardinality") on the example of Additional Information

3.4.15 Cardinality (Example)

mf:1234567 :add_on_documentation mf:1234567_doc1, mf:1234567_doc2, mf:1234567_doc3.

mf:1234567_doc1 a :AdditionalInformation; :index 1;
  :calendrical_validity_from "2020-10-10"^^xsd:date;
  :type_of_document :Technical_documentation;
  :source_as_path_info "user_guide-en.pdf";
  :language_of_document :English;
  :type_of_source_file "application/pdf".

mf:1234567_doc2 a :AdditionalInformation; :index 2;
  :calendrical_validity_from "2020-10-10"^^xsd:date;
  :type_of_document :Technical_documentation;
  :source_as_path_info "user_guide-de.pdf";
  :language_of_document :German;
  :type_of_source_file "application/pdf".

mf:1234567_doc3 a :AdditionalInformation; :index 3;
  :calendrical_validity_from "2020-10-12"^^xsd:date;
  :type_of_document :Application_Software;
  :source_as_path_info "smartLamp-driver.dll";
  :type_of_source_file "application/octet-stream".

3.4.16 ECLASS Datatype URI

3.4.17 Polymorphism

size_dimension can also be stated several times

We could model this in two ways:

Below I show how the first alternative looks in a catalog entry.

3.4.18 Polymorphism

mf:1234567 :size_dimension1 mf:1234567_cylinder.

mf:1234567_cylinder a :EnvelopingBodyCylinder;
  :depth "25 cm"^^cdt:ucum;
  :diameter "12 cm"^^cdt:ucum.
  
mf:1234568 :size_dimension2 mf:1234568_cuboid.
  
mf:1234568_cuboid a :EnvelopingBodyCuboid;
  :depth "25 cm"^^cdt:ucum;
  :height "12 cm"^^cdt:ucum; :width "12 cm"^^cdt:ucum.

3.4.19 WoT Device

Must conform to WoT Things Description:

3.4.20 WoT Parts

4 Semantic Modeling

For me, Semantic Modeling is more than Ontology Engineering:

  1. Define use cases and competency questions
  2. Research and pick appropriate ontologies
  3. Ontology Engineering to add missing classes and properties
  4. Decide how to put the data together (this is the core of semantic modeling)
  5. Document as application profile, including provider rules and diagrams
  6. Implement as RDF shapes
  7. Create sample or conformance testing data
  8. Implement competency questions as queries
  9. Define additional aspects like URL policy, application protocols, special indexing (eg full-text, facets), etc

4.1 rdfpuml Diagrams

RDF is all about graphs, so I think diagrams are crucial for understanding by both:

I've been using a tool called rdfpuml (see VladimirAlexiev/rdf2rml) that makes faithful diagrams from turtle examples.

In the next two slides I show diagrams of Catalog Entry (Refactored) and Catalog Entry (Not Refactored)

4.2 Diagram of Catalog Entry (Refactored)

4.3 Diagram of Catalog Entry (Not Refactored)