Konwertowanie standardowych nalogów branżowych na język DTDL dla usługi Azure Digital Twins

Większość ontologii opiera się na standardach sieci semantycznej, takich jak OWL, RDF i RDFS.

Aby użyć modelu z Azure Digital Twins, musisz go przekonwertować do formatu DTDL. Ten artykuł opisuje ogólne wskazówki projektowe w formie wzorca konwersji do konwersji modeli opartych na RDF do DTDL, abyś mógł je używać z Azure Digital Twins.

Chociaż przykłady w tym artykule koncentrują się na budynkach, podobne procesy można również zastosować do standardowych ontologii w różnych branżach, aby przekonwertować je do formatu DTDL.

Wzorzec konwersji

Istnieje kilka bibliotek innych firm, których można używać podczas konwertowania modeli opartych na usłudze RDF na język DTDL. Niektóre z tych bibliotek umożliwiają załadowanie pliku modelu do grafu. Możesz iterować po grafie w poszukiwaniu określonych konstrukcji RDFS i OWL oraz przekształcić je na DTDL.

Poniższa tabela zawiera przykład sposobu mapowania konstrukcji RDFS i OWL na język DTDL.

Koncepcja RDFS/OWL Konstrukcja RDFS/OWL Koncepcja języka DTDL Konstrukcja DTDL
Klasy owl:Class
Sufiks IRI
rdfs:label
rdfs:comment
Interfejs @type:Interface
@id
displayName
comment
Podklasy owl:Class
Sufiks IRI
rdfs:label
rdfs:comment
rdfs:subClassOf
Interfejs @type:Interface
@id
displayName
comment
extends
Właściwości typu danych owl:DatatypeProperty
rdfs:label lub INode
rdfs:label
rdfs:range
Właściwości interfejsu @type:Property
name
displayName
schema
Właściwości obiektu owl:ObjectProperty
rdfs:label lub INode
rdfs:range
rdfs:comment
rdfs:label
Relacja type:Relationship
name
target (lub pominięty, jeśli nie rdfs:range)
comment
displayName

Poniższy fragment kodu w języku C# pokazuje, jak plik modelu RDF jest ładowany do grafu i konwertowany na język DTDL przy użyciu biblioteki 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);

        }
    }
}

Następne kroki

Kontynuuj ścieżkę tworzenia modeli w oparciu o ontologie: Pełna ścieżka tworzenia modelu.