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

A maioria das ontologias são baseadas em padrões semânticos da web, como OWL, RDF e RDFS.

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

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

Padrão de conversão

Existem várias bibliotecas de terceiros que podem ser usadas ao converter modelos baseados em RDF para DTDL. Algumas dessas bibliotecas permitem que você carregue seu arquivo de modelo em um gráfico. Você pode percorrer o gráfico procurando construções RDFS e OWL específicas e convertê-las em DTDL.

A tabela a seguir é um exemplo de como as construções RDFS e OWL podem ser mapeadas para DTDL.

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

O trecho de código C# a seguir mostra como um arquivo de modelo RDF é carregado em um gráfico 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óximos passos

Continue no caminho para o desenvolvimento de modelos baseados em ontologias: Caminho completo de desenvolvimento de modelos.