Fråga Azure Digital Twins-tvillingdiagrammet
Den här artikeln innehåller frågeexempel och instruktioner för hur du använder Azure Digital Twins-frågespråket för att fråga tvillingdiagrammet om du vill ha information. (En introduktion till frågespråket finns i Frågespråk.)
Artikeln innehåller exempelfrågor som illustrerar frågespråkstrukturen och vanliga frågeåtgärder för digitala tvillingar. Den beskriver också hur du kör dina frågor när du har skrivit dem med hjälp av Azure Digital Twins Query API eller en SDK.
Anteckning
Om du kör exempelfrågorna nedan med ett API- eller SDK-anrop måste du komprimera frågetexten till en enda rad.
Referensdokumentation
Referensen för frågespråk finns under Referens i den vänstra innehållsförteckningen för Azure Digital Twins-dokumentationen. Du kan också gå direkt till referensavsnitten med hjälp av länkarna nedan:
Visa alla digitala tvillingar
Här är den grundläggande frågan som returnerar en lista över alla digitala tvillingar i instansen:
SELECT * FROM DIGITALTWINS
Fråga efter egenskap
Hämta digitala tvillingar efter egenskaper (inklusive ID och metadata):
SELECT *
FROM DIGITALTWINS T
WHERE T.firmwareVersion = '1.1'
AND T.$dtId in ['123', '456']
AND T.Temperature = 70
Som du ser i frågan ovan efterfrågas ID:t för en digital tvilling med hjälp av metadatafältet $dtId
.
Tips
Om du använder Cloud Shell för att köra en fråga med metadatafält som börjar med $
bör du undvika $
med ett omvänt snedstreck för att låta Cloud Shell veta att det inte är en variabel och bör användas som en literal i frågetexten.
Du kan också hämta tvillingar baserat på om en viss egenskap har definierats. Här är en fråga som hämtar tvillingar som har en definierad Location
egenskap:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(Location)
Den här frågan kan hjälpa dig att få tvillingar efter deras tag
egenskaper, enligt beskrivningen i Lägg till taggar i digitala tvillingar. Här är en fråga som hämtar alla tvillingar taggade med red
:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)
Du kan också hämta tvillingar baserat på typen av en egenskap. Här är en fråga som hämtar tvillingar vars Temperature
egenskap är ett tal:
SELECT * FROM DIGITALTWINS T WHERE IS_NUMBER(T.Temperature)
Egenskaper för frågekarta
Om en egenskap är av den komplexa typen Map
kan du använda kartnycklarna och värdena direkt i frågan, så här:
SELECT * FROM DIGITALTWINS T WHERE T.<propertyName>.<mapKey> = '<mapValue>'
Om kartnyckeln börjar med ett numeriskt tecken måste du omsluta nyckeln med dubbla hakparenteser ([[<mapKey>]]
) för att undkomma den i frågan, ungefär som strategin för att fråga med reserverade nyckelord.
Fråga efter modell
Operatorn IS_OF_MODEL
kan användas för att filtrera baserat på tvillingens modell.
Den tar hänsyn till arvs - och modellversionshantering och utvärderas till true
för en viss tvilling om tvillingen uppfyller något av följande villkor:
- Tvillingen implementerar direkt modellen som tillhandahålls till
IS_OF_MODEL()
och versionsnumret för modellen på tvillingen är större än eller lika med versionsnumret för den angivna modellen - Tvillingen implementerar en modell som utökar modellen till
IS_OF_MODEL()
, och tvillingens utökade modellversionsnummer är större än eller lika med versionsnumret för den angivna modellen
Om du till exempel frågar efter tvillingar i modellen dtmi:example:widget;4
returnerar frågan alla tvillingar baserat på version 4 eller senare av widgetmodellen och även tvillingar baserat på version 4 eller senare av alla modeller som ärver från widgeten.
IS_OF_MODEL
kan ta flera olika parametrar och resten av det här avsnittet är dedikerat till sina olika överlagringsalternativ.
Den enklaste användningen av IS_OF_MODEL
tar bara en twinTypeName
parameter: IS_OF_MODEL(twinTypeName)
.
Här är ett frågeexempel som skickar ett värde i den här parametern:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1')
Om du vill ange en tvillingsamling att söka efter när det finns fler än en (till exempel när en JOIN
används) lägger du till parametern twinCollection
: IS_OF_MODEL(twinCollection, twinTypeName)
.
Här är ett frågeexempel som lägger till ett värde för den här parametern:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1')
Om du vill göra en exakt matchning lägger du till parametern exact
: IS_OF_MODEL(twinTypeName, exact)
.
Här är ett frågeexempel som lägger till ett värde för den här parametern:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1', exact)
Du kan också skicka alla tre argumenten tillsammans: IS_OF_MODEL(twinCollection, twinTypeName, exact)
.
Här är ett frågeexempel som anger ett värde för alla tre parametrarna:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1', exact)
Fråga efter relation
När du kör frågor baserat på digitala tvillingars relationer har Azure Digital Twins-frågespråket en speciell syntax.
Relationer hämtas in i frågeomfånget i FROM
-satsen. Till skillnad från i "klassiska" SQL-språk är varje uttryck i FROM
-satsen inte en tabell, FROM
utan satsen uttrycker en korsentitetsrelationsbläddering. För att bläddra mellan relationer använder Azure Digital Twins en anpassad version av JOIN
.
Kom ihåg att med Azure Digital Twins-modellfunktionerna finns inte relationer oberoende av tvillingar, vilket innebär att relationer här inte kan efterfrågas oberoende av varandra och måste vara knutna till en tvilling.
För att återspegla detta används nyckelordet RELATED
JOIN
i -satsen för att hämta en uppsättning av en viss typ av relation som kommer från tvillingsamlingen. Frågan måste sedan filtrera i WHERE
-satsen för att ange vilka specifika tvillingar som ska användas i relationsfrågan (med hjälp av tvillingarnas $dtId
värden).
Följande avsnitt innehåller exempel på hur detta ser ut.
Grundläggande relationsfråga
Här är en exempelrelationsbaserad fråga. Det här kodfragmentet väljer alla digitala tvillingar med egenskapen ID
ABC
, och alla digitala tvillingar som är relaterade till dessa digitala tvillingar via en contains
relation.
SELECT T, CT
FROM DIGITALTWINS T
JOIN CT RELATED T.contains
WHERE T.$dtId = 'ABC'
Typen av relation (contains
i exemplet ovan) anges med hjälp av relationens name
fält från dess DTDL-definition.
Anteckning
Utvecklaren behöver inte korrelera detta JOIN
med ett nyckelvärde i WHERE
-satsen (eller ange ett nyckelvärde infogat med JOIN
definitionen). Den här korrelationen beräknas automatiskt av systemet, eftersom relationsegenskaperna själva identifierar målentiteten.
Fråga efter källa eller mål för en relation
Du kan använda relationsfrågestrukturen för att identifiera en digital tvilling som är källan eller målet för en relation.
Du kan till exempel börja med en källtvilling och följa dess relationer för att hitta måltvillingarna för relationerna. Här är ett exempel på en fråga som hittar måltvillingarna för feeds
relationerna som kommer från tvillingens källtvilling.
SELECT target
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE source.$dtId = 'source-twin'
Du kan också börja med målet för relationen och spåra relationen tillbaka för att hitta källtvillingen. Här är ett exempel på en fråga som hittar källtvillingen för en feeds
relation till tvillingmåltvillingen.
SELECT source
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE target.$dtId = 'target-twin'
Ställ frågor till en relations egenskaper
På liknande sätt som digitala tvillingar har egenskaper som beskrivs via DTDL så kan även relationer ha egenskaper. Du kan ställa frågor till tvillingar baserat på deras relationers egenskaper.
Azure Digital Twins-frågespråket tillåter filtrering och projektion av relationer genom att tilldela ett alias till relationen i JOIN
-satsen.
Tänk dig till exempel en servicedBy
relation som har en reportedCondition
egenskap. I frågan nedan får den här relationen ett alias R
för för att referera till dess egenskap.
SELECT T, SBT, R
FROM DIGITALTWINS T
JOIN SBT RELATED T.servicedBy R
WHERE T.$dtId = 'ABC'
AND R.reportedCondition = 'clean'
Observera i exemplet ovan hur reportedCondition
är en egenskap för servicedBy
själva relationen (INTE för någon digital tvilling som har en servicedBy
relation).
Fråga med flera JOIN:er
Upp till fem JOIN
s stöds i en enda fråga, vilket gör att du kan korsa flera nivåer av relationer samtidigt.
Om du vill fråga efter flera nivåer av relationer använder du en enda FROM
instruktion följt av N-instruktioner JOIN
, där uttrycken JOIN
uttrycker relationer på resultatet av en tidigare FROM
instruktion eller JOIN
-instruktion.
Här är ett exempel på en fråga med flera kopplingar, som hämtar alla glödlampor som finns i ljuspanelerna i rum 1 och 2.
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']
Räkna objekt
Du kan räkna antalet objekt i en resultatuppsättning med hjälp av Select COUNT
-satsen:
SELECT COUNT()
FROM DIGITALTWINS
Lägg till en WHERE
sats för att räkna antalet objekt som uppfyller ett visst villkor. Här är några exempel på att räkna med ett tillämpat filter baserat på typen av tvillingmodell (mer information om den här syntaxen finns i Fråga efter modell nedan):
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
Du kan också använda COUNT
tillsammans med JOIN
-satsen. Här är en fråga som räknar alla glödlampor som finns i ljuspanelerna i rum 1 och 2:
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']
Filterresultat: välj de översta objekten
Du kan välja flera "översta" objekt i en fråga med hjälp av Select TOP
-satsen.
SELECT TOP (5)
FROM DIGITALTWINS
WHERE ...
Filterresultat: ange returuppsättning med projektioner
Med hjälp av projektioner i -instruktionen SELECT
kan du välja vilka kolumner en fråga ska returnera. Projektion stöds nu för både primitiva och komplexa egenskaper. Mer information om projektioner med Azure Digital Twins finns i referensdokumentationen för SELECT-satsen.
Här är ett exempel på en fråga som använder projektion för att returnera tvillingar och relationer. Följande fråga projicerar Konsument, Fabrik och Edge från ett scenario där en fabrik med ett ID ABC
är relaterat till konsumenten via en relation till Factory.customer
och den relationen presenteras som Edge
.
SELECT Consumer, Factory, Edge
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Du kan också använda projektion för att returnera en egenskap för en tvilling. Följande fråga projicerar Name
egenskapen för de konsumenter som är relaterade till fabriken med ett ID ABC
via en relation med Factory.customer
.
SELECT Consumer.name
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Du kan också använda projektion för att returnera en egenskap för en relation. Precis som i föregående exempel projicerar Name
följande fråga egenskapen För konsumenter som är relaterade till fabriken med ett ID ABC
via en relation till Factory.customer
, men nu returneras även två egenskaper för relationen, prop1
och prop2
. Det gör den genom att namnge relationen Edge
och samla in dess egenskaper.
SELECT Consumer.name, Edge.prop1, Edge.prop2, Factory.area
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Du kan också använda alias för att förenkla frågor med projektion.
Följande fråga utför samma åtgärder som i föregående exempel, men den aliaserar egenskapsnamnen till consumerName
, first
, second
och factoryArea
.
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'
Här är en liknande fråga som frågar samma uppsättning som ovan, men projekterar endast Consumer.name
egenskapen som consumerName
och projicerar hela Factory som en tvilling.
SELECT Consumer.name AS consumerName, Factory
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Skapa effektiva frågor med IN-operatorn
Du kan avsevärt minska antalet frågor som du behöver genom att skapa en matris med tvillingar och fråga med operatorn IN
.
Tänk dig till exempel ett scenario där Byggnader innehåller Golv och Golv innehåller Rum. Om du vill söka efter rum i en byggnad som är varm är ett sätt att följa dessa steg.
Hitta golv i byggnaden baserat på
contains
relationen.SELECT Floor FROM DIGITALTWINS Building JOIN Floor RELATED Building.contains WHERE Building.$dtId = @buildingId
För att hitta rum, i stället för att överväga golven en i taget och köra en
JOIN
fråga för att hitta rummen för var och en, kan du fråga med en samling av våningarna i byggnaden (med namnet Floor i frågan nedan).I klientappen:
var floors = "['floor1','floor2', ..'floorn']";
I fråga:
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')
Andra sammansatta frågeexempel
Du kan kombinera någon av ovanstående typer av frågor med hjälp av kombinationsoperatorer för att inkludera mer information i en enda fråga. Här är några andra exempel på sammansatta frågor som frågar efter mer än en typ av tvillingbeskrivning samtidigt.
- Av de enheter som rum 123 har returnerar du MxChip-enheterna som fungerar som operator
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'
- Hämta tvillingar som har en relation med namnet
Contains
med en annan tvilling som har ett ID förid1
SELECT Room FROM DIGITALTWINS Room JOIN Thermostat RELATED Room.Contains WHERE Thermostat.$dtId = 'id1'
- Hämta alla rum i denna rumsmodell som finns på våning 11
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')
Köra frågor med API:et
När du har bestämt dig för en frågesträng kör du den genom att anropa fråge-API:et.
Du kan anropa API:et direkt eller använda någon av de SDK:er som är tillgängliga för Azure Digital Twins.
Följande kodfragment illustrerar .NET-SDK-anropet (C#) från en klientapp:
// Run a query for all twins
string query = "SELECT * FROM DIGITALTWINS";
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>(query);
Frågan som används i det här anropet returnerar en lista över digitala tvillingar, som exemplet ovan representerar med BasicDigitalTwin-objekt . Returtypen för dina data för varje fråga beror på vilka termer du anger med -instruktionen SELECT
:
- Frågor som börjar med
SELECT * FROM ...
returnerar en lista över digitala tvillingar (som kan serialiseras somBasicDigitalTwin
objekt eller andra anpassade typer av digitala tvillingar som du kan ha skapat). - Frågor som börjar i formatet
SELECT <A>, <B>, <C> FROM ...
returnerar en ordlista med nycklarna<A>
,<B>
och<C>
. - Andra format för
SELECT
instruktioner kan skapas för att returnera anpassade data. Du kan överväga att skapa egna klasser för att hantera anpassade resultatuppsättningar.
Fråga med växling
Frågeanrop stöder växling. Här är ett komplett exempel som använder BasicDigitalTwin
som frågeresultattyp med felhantering och växling:
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ästa steg
Läs mer om Azure Digital Twins-API:er och SDK:er, inklusive fråge-API:et som används för att köra frågorna från den här artikeln.