Abfragen des Zwillingsdiagramms von Azure Digital Twins
Dieser Artikel bietet Abfragebeispiele und Anleitungen zur Verwendung der Azure Digital Twins-Abfragesprache zum Abfragen von Informationen aus Ihrem Zwillingsgraphen. (Eine Einführung in die Abfragesprache finden Sie unter Abfragesprache.)
Der vorliegende Artikel enthält Beispielabfragen, die die Struktur der Abfragesprache sowie gängige Abfragevorgänge für digitale Zwillinge veranschaulichen. Außerdem wird beschrieben, wie Sie Ihre Abfragen ausführen, nachdem Sie sie geschrieben haben, indem Sie die Azure Digital Twins-Abfrage-API oder ein SDK verwenden.
Hinweis
Wenn Sie die Beispielabfragen unten mit einem API- oder SDK-Aufruf ausführen, müssen Sie den Abfragetext in eine einzelne Zeile zusammenfassen.
Referenzdokumentation
Die Referenz zur Abfragesprache finden Sie unter Referenz im linken Inhaltsverzeichnis der Azure Digital Twins-Dokumentation. Über die unten stehenden Links können Sie auch direkt zu den Referenzabschnitten wechseln:
Anzeigen aller digitalen Zwillinge
Mit der folgenden grundlegenden Abfrage wird eine Liste aller digitalen Zwillinge in der Instanz zurückgegeben:
SELECT * FROM DIGITALTWINS
Abfrage nach Eigenschaft
Abrufen von digitalen Zwillingen nach Eigenschaften (einschließlich ID und Metadaten):
SELECT *
FROM DIGITALTWINS T
WHERE T.firmwareVersion = '1.1'
AND T.$dtId in ['123', '456']
AND T.Temperature = 70
Wie in der obigen Abfrage gezeigt, wird die ID eines digitalen Zwillings mithilfe des Metadatenfelds $dtId
abgefragt.
Tipp
Wenn Sie Cloud Shell verwenden, um eine Abfrage mit Metadatenfeldern auszuführen, die mit $
beginnen, müssen Sie $
mit einem umgekehrten Schrägstrich als Escapezeichen versehen, um Cloud Shell mitzuteilen, dass es sich dabei nicht um eine Variable handelt und dieses Zeichen im Abfragetext als Literal behandelt werden soll.
Sie können Zwillinge auch auf der Grundlage abrufen, ob eine bestimmte Eigenschaft definiert ist. Mit der folgenden Abfrage werden Zwillinge abgerufen, die eine definierte Location
-Eigenschaft aufweisen:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(Location)
Diese Abfrage kann sie dabei unterstützen, Zwillinge anhand ihrer tag
-Eigenschaften abzurufen, wie unter Hinzufügen von Tags zu digitalen Zwillingen beschrieben. Mit der folgenden Abfrage werden alle Zwillinge abgerufen, die mit dem Tag red
markiert wurden:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)
Sie können Zwillinge auch auf der Grundlage des Typs einer Eigenschaft abrufen. Mit der nachstehenden Abfrage werden Zwillinge abgerufen, deren Temperature
-Eigenschaft eine Zahl ist:
SELECT * FROM DIGITALTWINS T WHERE IS_NUMBER(T.Temperature)
Abfragezuordnungseigenschaften
Wenn eine Eigenschaft vom komplexen Typ Map
ist, können Sie die Zuordnungsschlüssel und -werte wie folgt direkt in der Abfrage verwenden:
SELECT * FROM DIGITALTWINS T WHERE T.<propertyName>.<mapKey> = '<mapValue>'
Wenn der Kartenschlüssel mit einem numerischen Zeichen beginnt, müssen Sie den Schlüssel in doppelte eckige Klammern ([[<mapKey>]]
) umschließen, um ihn in der Abfrage zu escapen, ähnlich der Strategie zum Abfragen mit reservierten Schlüsselwörtern.
Abfrage nach Modell
Der IS_OF_MODEL
-Operator kann verwendet werden, um anhand des Modells des Zwillings zu filtern.
Er berücksichtigt Vererbung und Versionsverwaltung des Modells und wird in true
für einen bestimmten Zwilling ausgewertet, wenn der Zwilling eine der folgenden Bedingungen erfüllt:
- Der Zwilling implementiert das Modell direkt, das für
IS_OF_MODEL()
bereitgestellt wird, und die Versionsnummer des Modells auf dem Zwilling ist größer oder gleich der Versionsnummer des bereitgestellten Modells. - Der Zwilling implementiert ein Modell, das das für
IS_OF_MODEL()
bereitgestellte Modell erweitert, und die Versionsnummer des erweiterten Modells des Zwillings ist größer oder gleich der Versionsnummer des bereitgestellten Modells.
Wenn Sie z. B. nach Zwillingen des Modells dtmi:example:widget;4
abfragen, gibt die Abfrage alle Zwillinge zurück, die auf Version 4 oder höher des Widgets-Modells basieren, sowie auch Zwillinge, die auf Version 4 oder höher von Modellen basieren, die vom Widget erben.
IS_OF_MODEL
kann verschiedene Parameter annehmen, und der Rest dieses Abschnitts beschäftigt sich mit den verschiedenen Überladungsoptionen.
Die einfachste Verwendung von IS_OF_MODEL
nimmt nur einen twinTypeName
-Parameter entgegen: IS_OF_MODEL(twinTypeName)
.
Hier sehen Sie eine Beispielabfrage, die in diesem Parameter einen Wert übergibt:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1')
Um eine zu durchsuchende Zwillingssammlung anzugeben, wenn mehrere vorhanden sind (z. B. bei Verwendung von JOIN
), fügen Sie den Parameter twinCollection
hinzu: IS_OF_MODEL(twinCollection, twinTypeName)
.
Hier ist eine Beispielabfrage, die einen Wert für diesen Parameter hinzufügt:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1')
Um eine genaue Übereinstimmung zu überprüfen, fügen Sie den Parameter exact
hinzu: IS_OF_MODEL(twinTypeName, exact)
.
Hier ist eine Beispielabfrage, die einen Wert für diesen Parameter hinzufügt:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1', exact)
Sie können auch alle drei Argumente gemeinsam übergeben: IS_OF_MODEL(twinCollection, twinTypeName, exact)
.
Nachfolgend sehen Sie eine Beispielabfrage, in der für alle drei Parameter ein Wert angegeben ist:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1', exact)
Abfragen nach Beziehung
Für Abfragen anhand der Beziehungen von digitalen Zwillingen weist die Azure Digital Twins-Abfragesprache eine besondere Syntax auf.
Beziehungen werden in der FROM
-Klausel in den Abfragebereich übernommen. Anders als in „klassischen“ SQL-Sprachen sind die einzelnen Ausdrücke in dieser FROM
-Klausel keine Tabelle. Stattdessen drückt die FROM
-Klausel das entitätsübergreifende Durchlaufen von Beziehungen aus. Zum Durchlaufen von Beziehungen verwendet Azure Digital Twins eine benutzerdefinierte Version von JOIN
.
Denken Sie daran, dass im Azure Digital Twins-Modell Beziehungen nicht unabhängig von Zwillingen vorliegen. Dies bedeutet, dass Beziehungen hier nicht unabhängig abgefragt werden können und an einen Zwilling gebunden sein müssen.
Um dies zu berücksichtigen, wird das Schlüsselwort RELATED
in der JOIN
-Klausel verwendet, um den Satz eines bestimmten Beziehungstyps aus der Zwillingssammlung abzurufen. Die Abfrage muss dann mithilfe eines Filters in der WHERE
-Klausel angeben, welche bestimmten Zwillinge in der Beziehungsabfrage verwendet werden sollen (unter Verwendung der $dtId
-Werte der Zwillinge).
Die folgenden Abschnitte zeigen Beispiele dafür, wie dies aussehen kann.
Grundlegende Beziehungsabfrage
Hier sehen Sie ein Beispiel für eine beziehungsbasierte Abfrage. Mit diesem Codeausschnitt werden alle digitalen Zwillinge mit der ID
-Eigenschaft ABC
und alle digitalen Zwillinge, die zu diesen digitalen Zwillingen eine contains
-Beziehung haben, ausgewählt.
SELECT T, CT
FROM DIGITALTWINS T
JOIN CT RELATED T.contains
WHERE T.$dtId = 'ABC'
Der Typ der Beziehung (im obigen Beispiel contains
) wird mithilfe des Felds name
der Beziehung aus der zugehörigen DTDL-Definition angegeben.
Hinweis
Der Entwickler muss dieses JOIN
nicht mit einem Schlüsselwert in der WHERE
-Klausel korrelieren (oder in der JOIN
-Definition einen Schlüsselwert angeben). Diese Korrelation wird automatisch vom System berechnet, da die Beziehungseigenschaften die Zielentität direkt identifizieren.
Abfragen nach der Quelle oder dem Ziel einer Beziehung
Sie können die Beziehungsabfragestruktur verwenden, um einen digitalen Zwilling zu identifizieren, der die Quelle oder das Ziel einer Beziehung ist.
Sie können z. B. mit einem Quellzwilling beginnen und seinen Beziehungen folgen, um die Zielzwillinge der Beziehungen zu ermitteln. Mithilfe der nachfolgenden Beispielabfrage werden die Zielzwillinge der feeds
-Beziehungen ermittelt, die aus dem Zwilling „source-twin“ stammen.
SELECT target
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE source.$dtId = 'source-twin'
Sie können auch mit dem Ziel der Beziehung beginnen und die Beziehung zurückverfolgen, um den Quellzwilling zu ermitteln. Hier ist ein Beispiel für eine Abfrage, die den Quellzwilling einer feeds
-Beziehung zum Zwilling „target-twin“ ermittelt.
SELECT source
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE target.$dtId = 'target-twin'
Abfragen der Eigenschaften einer Beziehung
Ähnlich wie die Eigenschaften digitaler Zwillinge über DTDL beschrieben werden, können Beziehungen ebenfalls über Eigenschaften verfügen. Sie können Zwillinge auf der Grundlage der Eigenschaften ihrer Beziehungen abfragen.
Die Azure Digital Twins-Abfragesprache ermöglicht das Filtern und Projizieren von Beziehungen, indem der Beziehung innerhalb der JOIN
-Klausel ein Alias zugewiesen wird.
Als Beispiel sei eine servicedBy
-Beziehung angenommen, die über die reportedCondition
-Eigenschaft verfügt. In der nachstehenden Abfrage erhält diese Beziehung den Alias R
, um auf die zugehörige Eigenschaft zu verweisen.
SELECT T, SBT, R
FROM DIGITALTWINS T
JOIN SBT RELATED T.servicedBy R
WHERE T.$dtId = 'ABC'
AND R.reportedCondition = 'clean'
Beachten Sie im obigen Beispiel, dass reportedCondition
eine Eigenschaft der servicedBy
-Beziehung selbst ist, NICHT eines digitalen Zwillings, der über eine servicedBy
-Beziehung verfügt.
Abfragen mit mehreren JOINs
Es werden bis zu fünf JOIN
-Elemente in einer einzelnen Abfrage unterstützt. Dies ermöglicht es, mehrere Beziehungsebenen gleichzeitig zu durchlaufen.
Um Abfragen für mehrere Beziehungsebenen auszuführen, verwenden Sie eine einzelne FROM
-Anweisung gefolgt von N JOIN
-Anweisungen, wobei die JOIN
-Anweisungen Beziehungen zum Ergebnis einer vorherigen FROM
- oder JOIN
-Anweisung ausdrücken.
Hier ist ein Beispiel für eine Abfrage mit mehreren Joins, die alle LEDs in den Leuchten der Räume 1 und 2 abruft.
SELECT LightBulb
FROM DIGITALTWINS Room
JOIN LightPanel RELATED Room.contains
JOIN LightBulb RELATED LightPanel.contains
WHERE IS_OF_MODEL(LightPanel, 'dtmi:contoso:com:lightpanel;1')
AND IS_OF_MODEL(LightBulb, 'dtmi:contoso:com:lightbulb ;1')
AND Room.$dtId IN ['room1', 'room2']
Zählen von Elementen
Sie können die Anzahl von Elementen in einem Resultset mit der Select COUNT
-Klausel zählen:
SELECT COUNT()
FROM DIGITALTWINS
Fügen Sie eine WHERE
-Klausel hinzu, um die Anzahl von Elementen zu zählen, die ein bestimmtes Kriterium erfüllen. Im Folgenden finden Sie einige Beispiele für das Zählen mit einem angewendeten Filter basierend auf dem Typ des Zwillingsmodells (weitere Informationen zu dieser Syntax finden Sie unter Abfragen nach Modell weiter unten):
SELECT COUNT()
FROM DIGITALTWINS
WHERE IS_OF_MODEL('dtmi:sample:Room;1')
SELECT COUNT()
FROM DIGITALTWINS c
WHERE IS_OF_MODEL('dtmi:sample:Room;1') AND c.Capacity > 20
Sie können auch COUNT
zusammen mit der JOIN
-Klausel verwenden. Nachfolgend sehen Sie eine Abfrage, mit der alle LEDs in den Leuchten der Räume 1 und 2 gezählt werden:
SELECT COUNT()
FROM DIGITALTWINS Room
JOIN LightPanel RELATED Room.contains
JOIN LightBulb RELATED LightPanel.contains
WHERE IS_OF_MODEL(LightPanel, 'dtmi:contoso:com:lightpanel;1')
AND IS_OF_MODEL(LightBulb, 'dtmi:contoso:com:lightbulb;1')
AND Room.$dtId IN ['room1', 'room2']
Filterergebnisse: Auswählen der obersten Elemente
Mithilfe der Select TOP
-Klausel können Sie die verschiedenen obersten Elemente in einer Abfrage auswählen.
SELECT TOP (5)
FROM DIGITALTWINS
WHERE ...
Filterergebnisse: Angeben eines Rückgabesatzes mit Projektionen
Wenn Sie Projektionen in der SELECT
-Anweisung verwenden, können Sie auswählen, welche Spalten von einer Abfrage zurückgegeben werden. Projektion wird jetzt sowohl für primitive als auch für komplexe Eigenschaften unterstützt. Weitere Informationen zu Projektionen mit Azure Digital Twins finden Sie in der Referenzdokumentation zur SELECT-Klausel.
Die folgende Beispielabfrage verwendet eine Projektion, um Zwillinge und Beziehungen zurückzugeben. Die folgende Abfrage projiziert die Angaben für Consumer, Factory und Edge aus einem Szenario, in dem eine Factory mit der ID ABC
mit dem Consumer durch eine Beziehung von Factory.customer
verbunden ist und diese Beziehung als Edge
dargestellt wird.
SELECT Consumer, Factory, Edge
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Sie können Projektion auch verwenden, um eine Eigenschaft eines Zwillings zurückzugeben. Die folgende Abfrage projiziert die Eigenschaft Name
der Consumers, die mit der Factory mit einer ID von ABC
durch eine Beziehung von Factory.customer
verbunden sind.
SELECT Consumer.name
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Sie können Projektion auch verwenden, um eine Eigenschaft einer Beziehung zurückzugeben. Wie im vorhergehenden Beispiel projiziert die folgende Abfrage die Eigenschaft Name
der Consumers, die mit der Factory mit einer ID von ABC
über eine Beziehung von Factory.customer
verbunden sind. Jetzt gibt sie aber auch zwei Eigenschaften dieser Beziehung zurück: prop1
und prop2
. Dies geschieht durch Benennen der Beziehung Edge
und Erfassen der zugehörigen Eigenschaften.
SELECT Consumer.name, Edge.prop1, Edge.prop2, Factory.area
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Sie können auch Aliase verwenden, um Abfragen mit Projektion zu vereinfachen.
Mit der folgenden Abfrage werden dieselben Vorgänge wie im vorherigen Beispiel durchgeführt, aber für die Eigenschaftsnamen werden die Aliase consumerName
, first
, second
und factoryArea
verwendet.
SELECT Consumer.name AS consumerName, Edge.prop1 AS first, Edge.prop2 AS second, Factory.area AS factoryArea
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Hier sehen Sie eine ähnliche Abfrage zum Abrufen derselben Menge wie oben, bei der aber nur die Eigenschaft Consumer.name
als consumerName
und die vollständige Factory als Zwilling projiziert wird.
SELECT Consumer.name AS consumerName, Factory
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Erstellen effizienter Abfragen mit dem IN-Operator
Sie können die Anzahl der erforderlichen Abfragen deutlich verringern, indem Sie ein Array aus Zwillingen erstellen und die Abfrage mit dem IN
-Operator durchführen.
Stellen Sie sich beispielsweise ein Szenario vor, in dem Gebäude aus Etagen und Etagen aus Räumen bestehen. Um in einem Gebäude nach heißen Räumen zu suchen, besteht eine Möglichkeit darin, diese Schritte durchzuführen.
Etagen im Gebäude basierend auf der
contains
-Beziehung suchen.SELECT Floor FROM DIGITALTWINS Building JOIN Floor RELATED Building.contains WHERE Building.$dtId = @buildingId
Wenn Sie Räume suchen möchten, können Sie eine Abfrage mit einer Sammlung der Etagen im Gebäude (in der nachstehenden Abfrage als Floor bezeichnet) ausführen, anstatt die Etagen einzeln zu überprüfen und jeweils eine
JOIN
-Abfrage zum Auffinden der Räume auszuführen.In der Client-App:
var floors = "['floor1','floor2', ..'floorn']";
In der Abfrage:
SELECT Room FROM DIGITALTWINS Floor JOIN Room RELATED Floor.contains WHERE Floor.$dtId IN ['floor1','floor2', ..'floorn'] AND Room. Temperature > 72 AND IS_OF_MODEL(Room, 'dtmi:com:contoso:Room;1')
Weitere zusammengesetzte Abfragebeispiele
Mithilfe von Kombinationsoperatoren können Sie jeden der oben genannten Abfragetypen kombinieren, um mehr Details in eine einzelne Abfrage einzubeziehen. Es folgen einige weitere Beispiele für zusammengesetzte Abfragen, die mehrere Zwillingsdeskriptortypen gleichzeitig abfragen.
- Von den Geräten, über die Room 123 verfügt, geben Sie die MxChip-Geräte zurück, die die Rolle des Operators übernehmen
SELECT device FROM DIGITALTWINS space JOIN device RELATED space.has WHERE space.$dtid = 'Room 123' AND device.$metadata.model = 'dtmi:contoso:com:DigitalTwins:MxChip:3' AND has.role = 'Operator'
- Rufen Sie Zwillinge ab, die eine Beziehung namens
Contains
mit einem anderen Zwilling aufweisen, der die IDid1
besitztSELECT Room FROM DIGITALTWINS Room JOIN Thermostat RELATED Room.Contains WHERE Thermostat.$dtId = 'id1'
- Rufen Sie alle Räume dieses Raummodells ab, die in floor11 enthalten sind
SELECT Room FROM DIGITALTWINS Floor JOIN Room RELATED Floor.Contains WHERE Floor.$dtId = 'floor11' AND IS_OF_MODEL(Room, 'dtmi:contoso:com:DigitalTwins:Room;1')
Ausführen von Abfragen mit der API
Nachdem Sie sich für eine Abfragezeichenfolge entschieden haben, führen Sie einen Aufruf der Abfrage-API aus.
Sie können die API direkt aufrufen oder eins der SDKs verwenden, die für Azure Digital Twins verfügbar sind.
Der folgende Codeausschnitt veranschaulicht den .NET (C#) SDK-Aufruf aus einer Client-App:
// Run a query for all twins
string query = "SELECT * FROM DIGITALTWINS";
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>(query);
Durch die in diesem Aufruf verwendete Abfrage wird eine Liste mit digitalen Zwillingen zurückgegeben (im obigen Beispiel durch Objekte vom Typ BasicDigitalTwin dargestellt). Der Rückgabetyp Ihrer Daten für die jeweilige Abfrage hängt von den Begriffen ab, die Sie mit der Anweisung SELECT
angeben:
- Bei Abfragen, die mit
SELECT * FROM ...
beginnen, wird eine Liste mit digitalen Zwillingen zurückgegeben. (Diese können als Objekte vom TypBasicDigitalTwin
oder als andere benutzerdefinierte Typen für digitale Zwillinge serialisiert werden, die Sie ggf. erstellt haben.) - Bei Abfragen, die im Format
SELECT <A>, <B>, <C> FROM ...
beginnen, wird ein Wörterbuch mit den Schlüsseln<A>
,<B>
und<C>
zurückgegeben. - Andere Formate von
SELECT
-Anweisungen können für die Rückgabe benutzerdefinierter Daten erstellt werden. Sie können das Erstellen eigener Klassen erwägen, um benutzerdefinierte Resultsets zu verarbeiten.
Abfrage mit Paging
Abfrageaufrufe unterstützen Paging. Im Folgenden finden Sie ein vollständiges Beispiel mit Verwendung von BasicDigitalTwin
als Abfrageergebnistyp mit Fehlerbehandlung und Auslagerung:
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>("Select * From DigitalTwins");
try
{
await foreach (BasicDigitalTwin twin in result)
{
// You can include your own logic to print the result
// The logic below prints the twin's ID and contents
Console.WriteLine($"Twin ID: {twin.Id} \nTwin data");
foreach (KeyValuePair<string, object> kvp in twin.Contents)
{
Console.WriteLine($"{kvp.Key} {kvp.Value}");
}
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Error {ex.Status}, {ex.ErrorCode}, {ex.Message}");
throw;
}
Nächste Schritte
Erfahren Sie mehr über die Azure Digital Twins-APIs und SDKs, einschließlich der Abfrage-API, die zum Ausführen der Abfragen in diesem Artikel verwendet wird.