Conversión de ontologías estándar del sector a DTDL para Azure Digital Twins

La mayoría de las ontologías se basan en estándares web semánticos como OWL, RDF y RDFS.

Para usar un modelo con Azure Digital Twins, debes convertirlo a formato DTDL. Este artículo describe una guía general de diseño en forma de un patrón de conversión para convertir modelos basados en RDF a DTDL, de modo que puedas usarlos con Azure Digital Twins.

Aunque los ejemplos de este artículo están centrados en la creación, también puede aplicar procesos similares a las ontologías estándar en distintos sectores para convertirlos en DTDL.

Patrón de conversión

Hay varias bibliotecas de terceros que se pueden usar al convertir modelos basados en RDF a DTDL. Algunas de estas bibliotecas le permiten cargar el archivo del modelo en un grafo. Puede recorrer el grafo en bucle en busca de construcciones específicas de RDFS y OWL, y realizar la conversión a DTDL.

La tabla siguiente es un ejemplo de cómo se pueden asignar las construcciones RDFS y OWL a DTDL.

Concepto RDFS/OWL Construcción RDFS/OWL Concepto DTDL Construcción DTDL
Clases owl:Class
Sufijo IRI
rdfs:label
rdfs:comment
Interfaz @type:Interface
@id
displayName
comment
Subclases owl:Class
Sufijo IRI
rdfs:label
rdfs:comment
rdfs:subClassOf
Interfaz @type:Interface
@id
displayName
comment
extends
Propiedades de tipos de datos owl:DatatypeProperty
rdfs:label o INode
rdfs:label
rdfs:range
Propiedades de la interfaz de roles @type:Property
name
displayName
schema
Propiedades de objeto owl:ObjectProperty
rdfs:label o INode
rdfs:range
rdfs:comment
rdfs:label
Relación type:Relationship
name
target (o se omite si no hay rdfs:range)
comment
displayName

En el siguiente fragmento de código en C# se muestra cómo se carga un archivo de modelo de RDF en un grafo y se convierte a DTDL, mediante la 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);

        }
    }
}

Pasos siguientes

Continúe la ruta para desarrollar modelos basados en ontologías: ruta de desarrollo del modelo completo.