Converter ontologias padrão do setor em DTDL para os Gêmeos Digitais do Azure

A maioria das ontologias baseia-se em padrões da Web semânticos, como OWL, RDF e RDFS.

Para usar um modelo com Gêmeos Digitais do Azure, você deve convertê-lo para o formato DTDL. Este artigo descreve orientações gerais de design na forma de um padrão de conversão para converter modelos baseados em RDF para DTDL, para que você possa usá-los com Gêmeos Digitais do Azure.

Embora os exemplos neste artigo sejam focados na compilação, você pode aplicar processos semelhantes a ontologias padrão em diferentes setores para também convertê-los em DTDL.

Padrão de conversão

Há várias bibliotecas de terceiros que podem ser usadas ao converter modelos baseados em RDF em DTDL. Algumas dessas bibliotecas permitem que você carregue seu arquivo de modelo em um grafo. Você pode executar um loop no grafo procurando constructos RDFS e OWL específicos e convertê-los em DTDL.

A tabela a seguir é um exemplo de como os constructos RDFS e OWL podem ser mapeados para DTDL.

Conceito de RDFS/OWL Constructo RDFS/OWL Conceito de DTDL Constructo DTDL
Aulas owl:Class
Sufixo IRI
rdfs:label
rdfs:comment
Interface @type:Interface
@id
displayName
comment
Subclasses owl:Class
Sufixo IRI
rdfs:label
rdfs:comment
rdfs:subClassOf
Interface @type:Interface
@id
displayName
comment
extends
Propriedades do tipo de dados owl:DatatypeProperty
rdfs:label ou INode
rdfs:label
rdfs:range
Propriedades de interface @type:Property
name
displayName
schema
Propriedades do objeto owl:ObjectProperty
rdfs:label ou INode
rdfs:range
rdfs:comment
rdfs:label
Relação type:Relationship
name
target (ou omitido se não tiver rdfs:range)
comment
displayName

O snippet de código C# a seguir mostra como um arquivo de modelo RDF é carregado em um grafo e convertido em DTDL, usando a biblioteca dotNetRDF.

using VDS.RDF.Ontology;
using VDS.RDF.Parsing;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace DigitalTwins_Samples
{
    public class DigitalTwinsConvertRDFSample
    {

        public void Run()
        {

            Console.WriteLine("Reading file...");

            FileLoader.Load(_ontologyGraph, rdfFile.FullName);

            // Start looping through for each owl:Class
            foreach (OntologyClass owlClass in _ontologyGraph.OwlClasses)
            {

                // Generate a DTMI for the owl:Class
                string Id = GenerateDTMI(owlClass);

                if (!String.IsNullOrEmpty(Id))
                {

                    Console.WriteLine($"{owlClass.ToString()} -> {Id}");

                    // Create Interface
                    var dtdlInterface = new DtdlInterface
                    {
                        Id = Id,
                        Type = "Interface",
                        DisplayName = GetInterfaceDisplayName(owlClass),
                        Comment = GetInterfaceComment(owlClass),
                        Contents = new List<DtdlContents>(),
                    };

                    // An OWL graph can have parent/child classes.
                    // So to understand if an OWL class is a base class or a child class,
                    // look for a superclass on any given OWL class.
                    // If found, convert these to parent + child Interfaces using DTDL extends.
                    IEnumerable<OntologyClass> foundSuperClasses = owlClass.DirectSuperClasses;

                    //...
                }

                // Add interface to the list of interfaces
                _interfaceList.Add(dtdlInterface);
            }

            // Serialize to JSON
            var json = JsonConvert.SerializeObject(_interfaceList);

        }
    }
}

Próximas etapas

Continue no caminho para o desenvolvimento de modelos com base em ontologias: Caminho de desenvolvimento de modelo completo.