業界標準オントロジを Azure Digital Twins 用の DTDL に変換する

ほとんどのオントロジは、OWLRDFRDFS などのセマンティック Web 標準に基づいています。

Azure Digital Twinsでモデルを使用するには、DTDL形式に変換する必要があります。 この記事では、RDFベースのモデルをDTDLに変換し、Azure Digital Twinsで使えるようにするための一般的な設計ガイダンスを紹介します。

この記事の例はビルドに焦点を当てていますが、同様のプロセスをさまざまな業界の標準オントロジに適用して DTDL に変換することもできます。

変換パターン

RDF ベースのモデルを DTDL に変換するときに使用できるサードパーティ製のライブラリがいくつかあります。 これらのライブラリの一部では、モデル ファイルをグラフに読み込むことができます。 グラフ内をループ処理して特定の RDFS および OWL コンストラクトを探し、これらを DTDL に変換することができます。

次の表は、RDFS および OWL コンストラクトをどのように DTDL にマップできるかの例を示しています。

RDFS/OWL の概念 RDFS/OWL 構文 DTDL の概念 DTDL の構成要素
クラス owl:Class
IRI サフィックス
rdfs:label
rdfs:comment
インターフェイス @type:Interface
@id
displayName
comment
サブクラス owl:Class
IRI サフィックス
rdfs:label
rdfs:comment
rdfs:subClassOf
インターフェイス @type:Interface
@id
displayName
comment
extends
データ型のプロパティ owl:DatatypeProperty
rdfs:label または INode
rdfs:label
rdfs:range
インターフェイスのプロパティ @type:Property
name
displayName
schema
[オブジェクトのプロパティ] owl:ObjectProperty
rdfs:label または INode
rdfs:range
rdfs:comment
rdfs:label
関係 type:Relationship
name
target (rdfs:range がない場合は省略)
comment
displayName

次の C# コード スニペットは、dotNetRDF ライブラリを使用して、RDF モデル ファイルがどのようにグラフに読み込まれ、DTDL に変換されるかを示しています。

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);

        }
    }
}

次のステップ

オントロジに基づいてモデルを開発するためのパスに進みます: モデル開発の完全なパス