Convertire le ontologie standard del settore in DTDL per Gemelli digitali di Azure

La maggior parte delle ontologie si basa su standard Web semantici, ad esempio OWL, RDF e RDFS.

Per utilizzare un modello con Gemelli digitali di Azure, devi convertirlo in formato DTDL. Questo articolo descrive una guida generale di progettazione sotto forma di un modello di conversione per convertire modelli basati su RDF in DTDL, così da poterli utilizzare con Gemelli digitali di Azure.

Anche se gli esempi in questo articolo sono incentrati sulla compilazione, è possibile applicare processi simili a ontologie standard in diversi settori per convertirli anche in DTDL.

Modello di conversione

Sono disponibili diverse librerie di terze parti che possono essere usate durante la conversione di modelli basati su RDF in DTDL. Alcune di queste librerie consentono di caricare il file del modello in un grafo. È possibile scorrere il grafico cercando costrutti RDFS e OWL specifici e convertirli in DTDL.

La tabella seguente è un esempio di come è possibile eseguire il mapping dei costrutti RDFS e OWL a DTDL.

Concetto di RDFS/OWL Costrutto RDFS/OWL Concetto DTDL Costrutto DTDL
Classi owl:Class
Suffisso IRI
rdfs:label
rdfs:comment
Interfaccia @type:Interface
@id
displayName
comment
Sottoclassi owl:Class
Suffisso IRI
rdfs:label
rdfs:comment
rdfs:subClassOf
Interfaccia @type:Interface
@id
displayName
comment
extends
Proprietà del tipo di dati owl:DatatypeProperty
rdfs:label oppure INode
rdfs:label
rdfs:range
Proprietà dell'interfaccia @type:Property
name
displayName
schema
Proprietà dell'oggetto owl:ObjectProperty
rdfs:label oppure INode
rdfs:range
rdfs:comment
rdfs:label
Relazione type:Relationship
name
target (oppure omesso se non è presente rdfs:range)
comment
displayName

Il frammento di codice C# seguente mostra come viene caricato un file di modello RDF in un grafo e convertito in DTDL, usando la libreria 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);

        }
    }
}

Passaggi successivi

Continuare con il percorso per lo sviluppo di modelli in base alle ontologie: percorso di sviluppo completo del modello.