Dotazování grafu dvojčat Azure Digital Twins
Tento článek nabízí příklady dotazů a pokyny pro použití dotazovacího jazyka Azure Digital Twins k dotazování na graf dvojčete s informacemi. (Úvod do dotazovacího jazyka najdete v tématu .Dotazovací jazyk.)
Článek obsahuje ukázkové dotazy, které ilustrují strukturu dotazovacího jazyka a běžné operace dotazů pro digitální dvojčata. Popisuje také, jak po napsání dotazů spouštět dotazy pomocí rozhraní API pro dotazy Azure Digital Twins nebo sady SDK.
Poznámka:
Pokud spouštíte ukázkové dotazy níže s voláním rozhraní API nebo sady SDK, budete muset text dotazu zkondenzovat na jeden řádek.
Referenční dokumentace
Referenční informace k dotazovacímu jazyku najdete v části Referenční informace v levém obsahu pro dokumentaci ke službě Azure Digital Twins. Můžete také přejít přímo do referenčních oddílů pomocí následujících odkazů:
Zobrazit všechna digitální dvojčata
Tady je základní dotaz, který vrátí seznam všech digitálních dvojčat v instanci:
SELECT * FROM DIGITALTWINS
Dotazování podle vlastnosti
Získání digitálních dvojčat podle vlastností (včetně ID a metadat):
SELECT *
FROM DIGITALTWINS T
WHERE T.firmwareVersion = '1.1'
AND T.$dtId in ['123', '456']
AND T.Temperature = 70
Jak je znázorněno v dotazu výše, ID digitálního dvojčete se dotazuje pomocí pole $dtId
metadat .
Tip
Pokud ke spuštění dotazu používáte Cloud Shell s poli metadat, která začínají $
, měli byste utéct $
zpětným lomítkem, aby cloud Shell věděl, že se nejedná o proměnnou a měl by být v textu dotazu využit jako literál.
Můžete také získat dvojčata na základě toho, jestli je definována určitá vlastnost. Tady je dotaz, který získá dvojčata s definovanou Location
vlastností:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(Location)
Tento dotaz vám může pomoct získat dvojčata podle jejich tag
vlastností, jak je popsáno v tématu Přidání značek do digitálních dvojčat. Tady je dotaz, který získá všechna dvojčata označená red
:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)
Můžete také získat dvojčata na základě typu vlastnosti. Tady je dotaz, který získá dvojčata, jejichž Temperature
vlastnost je číslo:
SELECT * FROM DIGITALTWINS T WHERE IS_NUMBER(T.Temperature)
Vlastnosti mapy dotazů
Pokud je vlastnost komplexního typu Map
, můžete použít mapové klíče a hodnoty přímo v dotazu, například takto:
SELECT * FROM DIGITALTWINS T WHERE T.<propertyName>.<mapKey> = '<mapValue>'
Pokud klíč mapy začíná číselným znakem, budete muset klíč zabalit do dvojitých hranatých závorek ([[<mapKey>]]
), aby se uvozil do dotazu, podobně jako u strategie pro dotazování s rezervovanými klíčovými slovy.
Dotazování podle modelu
Operátor IS_OF_MODEL
lze použít k filtrování na základě modelu dvojčete.
Považuje dědičnost a správu verzí modelu a vyhodnotí true
se pro dané dvojče, pokud dvojče splňuje některou z těchto podmínek:
- Dvojče přímo implementuje model poskytnutý pro
IS_OF_MODEL()
a číslo verze modelu ve dvojčeti je větší nebo rovno číslu verze poskytnutého modelu. - Dvojče implementuje model, který rozšiřuje model poskytnutý na
IS_OF_MODEL()
, a číslo rozšířené verze modelu dvojčete je větší nebo rovno číslu verze poskytnutého modelu.
Pokud tedy například zadáte dotaz na dvojčata modelu dtmi:example:widget;4
, dotaz vrátí všechna dvojčata založená na verzi 4 nebo vyšší modelu widgetu a také dvojčata založená na verzi 4 nebo vyšší ze všech modelů, které dědí z widgetu.
IS_OF_MODEL
může mít několik různých parametrů a zbytek této části je vyhrazený pro různé možnosti přetížení.
Nejjednodušší použití IS_OF_MODEL
přebírá pouze twinTypeName
parametr: IS_OF_MODEL(twinTypeName)
.
Tady je příklad dotazu, který předá hodnotu v tomto parametru:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1')
Pokud chcete zadat kolekci dvojčat, která se má hledat, když je více než jedna (například při JOIN
použití), přidejte twinCollection
parametr: IS_OF_MODEL(twinCollection, twinTypeName)
.
Tady je příklad dotazu, který přidá hodnotu pro tento parametr:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1')
Chcete-li provést přesnou shodu, přidejte exact
parametr: IS_OF_MODEL(twinTypeName, exact)
.
Tady je příklad dotazu, který přidá hodnotu pro tento parametr:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1', exact)
Můžete také předat všechny tři argumenty dohromady: IS_OF_MODEL(twinCollection, twinTypeName, exact)
.
Tady je příklad dotazu určující hodnotu pro všechny tři parametry:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1', exact)
Dotazování podle relace
Při dotazování na základě relací digitálních dvojčat má dotazovací jazyk Azure Digital Twins speciální syntaxi.
Relace jsou načteny do oboru dotazu v klauzuli FROM
. Na rozdíl od "klasických" jazyků typu SQL není každý výraz v FROM
klauzuli tabulka. Tato klauzule spíše FROM
vyjadřuje procházení relace mezi entitami. K procházení mezi relacemi používá Služba Azure Digital Twins vlastní verzi JOIN
služby .
Vzpomeňte si, že s možnostmi modelu Azure Digital Twins neexistují relace nezávisle na dvojčatech, což znamená, že relace se zde nedají dotazovat nezávisle a musí být svázané s dvojčetem.
Pro vyjádření tohoto faktu se klíčové slovo RELATED
v JOIN
klauzuli používá k načtení sady určitého typu relace pocházející z kolekce dvojčat. Dotaz pak musí filtrovat v WHERE
klauzuli, aby bylo možné určit, která konkrétní dvojčata se mají použít v dotazu relace (pomocí hodnot dvojčat $dtId
).
V následujících částech najdete příklady toho, jak to vypadá.
Základní dotaz na relaci
Tady je ukázkový dotaz založený na relacích. Tento fragment kódu vybere všechna digitální dvojčata s ID
vlastností ABC
a všechna digitální dvojčata související s těmito digitálními dvojčaty prostřednictvím contains
relace.
SELECT T, CT
FROM DIGITALTWINS T
JOIN CT RELATED T.contains
WHERE T.$dtId = 'ABC'
Typ relace (contains
v příkladu výše) je označen pomocí pole relace name
z jeho definice DTDL.
Poznámka:
Vývojář to nemusí korelovat JOIN
s hodnotou klíče v WHERE
klauzuli (nebo zadat hodnotu klíče vloženou s definicí JOIN
). Tato korelace se počítá automaticky systémem, protože samotné vlastnosti relace identifikují cílovou entitu.
Dotazování podle zdroje nebo cíle relace
Strukturu dotazu relace můžete použít k identifikaci digitálního dvojčete, které je zdrojem nebo cílem relace.
Můžete například začít se zdrojovým dvojčem a sledovat jeho relace a najít cílová dvojčata relací. Tady je příklad dotazu, který najde cílová dvojčata relací pocházejících feeds
ze zdrojového dvojčete dvojčete.
SELECT target
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE source.$dtId = 'source-twin'
Můžete také začít s cílem relace a trasovat relaci zpět a najít zdrojové dvojče. Tady je příklad dotazu, který najde zdrojové dvojče feeds
relace s dvojčetem cíle-dvojče.
SELECT source
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE target.$dtId = 'target-twin'
Dotazování vlastností relace
Podobně jako mají digitální dvojčata vlastnosti popisované pomocí DTDL i relace mohou mít vlastnosti. Na dvojčata se můžete dotazovat na základě vlastností jejich relací.
Dotazovací jazyk Azure Digital Twins umožňuje filtrování a projekci relací přiřazením aliasu k relaci v rámci JOIN
klauzule.
Představte si servicedBy
například relaci, která má reportedCondition
vlastnost. V následujícím dotazu má tato relace alias R
odkaz na jeho vlastnost.
SELECT T, SBT, R
FROM DIGITALTWINS T
JOIN SBT RELATED T.servicedBy R
WHERE T.$dtId = 'ABC'
AND R.reportedCondition = 'clean'
V předchozím příkladu si všimněte, jak reportedCondition
je vlastnost servicedBy
samotné relace (NE u některého digitálního dvojčete, které má servicedBy
relaci).
Dotazování s více názvy JOIN
V jednom dotazu se podporuje až pět JOIN
s, což umožňuje procházet více úrovní relací najednou.
K dotazování na více úrovní relací použijte jeden FROM
příkaz následovaný příkazy N JOIN
, kde JOIN
příkazy vyjadřují relace na základě výsledku předchozího FROM
nebo JOIN
příkazu.
Tady je příklad dotazu s více spojeními, který získá všechny žárovky obsažené v světlých panelech v místnostech 1 a 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']
Počet položek
Pomocí klauzule můžete spočítat počet položek v sadě Select COUNT
výsledků:
SELECT COUNT()
FROM DIGITALTWINS
WHERE
Přidejte klauzuli pro spočítání počtu položek, které splňují určitá kritéria. Tady je několik příkladů počítání s použitým filtrem na základě typu modelu dvojčete (další informace o této syntaxi najdete v části Dotaz podle modelu níže):
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
Můžete také použít COUNT
společně s klauzulí JOIN
. Tady je dotaz, který spočítá všechny žárovky obsažené v světlých panelech místností 1 a 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']
Výsledky filtrování: výběr horních položek
Pomocí klauzule můžete vybrat několik "horních" položek v dotazu Select TOP
.
SELECT TOP (5)
FROM DIGITALTWINS
WHERE ...
Výsledky filtru: Určení návratové sady s projekcemi
Pomocí projekcí v SELECT
příkazu můžete zvolit sloupce, které dotaz vrátí. Projekce je nyní podporována pro primitivní i komplexní vlastnosti. Další informace o projekcích s Azure Digital Twins najdete v referenční dokumentaci k klauzuli SELECT.
Tady je příklad dotazu, který pomocí projekce vrací dvojčata a relace. Následující dotazuje příjemce, továrnu a Edge ze scénáře, ve kterém objekt factory s ID ABC
souvisí s příjemcem prostřednictvím relace Factory.customer
, a tato relace se zobrazí jako Edge
.
SELECT Consumer, Factory, Edge
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Pomocí projekce můžete také vrátit vlastnost dvojčete. Následující dotaz projektuje Name
vlastnost Uživatele, které souvisí s objektem factory s ID ABC
prostřednictvím relace Factory.customer
.
SELECT Consumer.name
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
K vrácení vlastnosti relace můžete použít také projekci. Podobně jako v předchozím příkladu následující dotazuje Name
vlastnost Uživatele související s Objektem pro vytváření s ID ABC
prostřednictvím relace Factory.customer
; ale nyní také vrátí dvě vlastnosti této relace, prop1
a prop2
. Dělá to pojmenováním relace Edge
a shromážděním jeho vlastností.
SELECT Consumer.name, Edge.prop1, Edge.prop2, Factory.area
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Aliasy můžete také použít ke zjednodušení dotazů s projekcí.
Následující dotaz provede stejné operace jako v předchozím příkladu, ale aliasuje názvy vlastností na consumerName
, first
, second
a 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'
Tady je podobný dotaz, který dotazuje stejnou sadu jako výše, ale projekty pouze Consumer.name
vlastnost jako consumerName
a projekty dokončená továrna jako dvojče.
SELECT Consumer.name AS consumerName, Factory
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Vytváření efektivních dotazů pomocí operátoru IN
Počet dotazů, které potřebujete, můžete výrazně snížit vytvořením pole dvojčat a dotazováním pomocí operátoru IN
.
Představte si například scénář, ve kterém budovy obsahují podlahy a podlahy pokoje. Pokud chcete vyhledat místnosti v budově, která je horká, je jedním ze způsobů, jak postupovat podle těchto kroků.
Najděte podlahy v budově na základě vztahu
contains
.SELECT Floor FROM DIGITALTWINS Building JOIN Floor RELATED Building.contains WHERE Building.$dtId = @buildingId
Pokud chcete najít místnosti, nemusíte zvažovat podlahy 1 po druhém a spouštět
JOIN
dotaz, abyste našli místnosti pro každou z nich, můžete dotazovat s kolekcí podlah v budově (pojmenovanou Podlaha v dotazu níže).V klientské aplikaci:
var floors = "['floor1','floor2', ..'floorn']";
V dotazu:
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')
Další příklady složených dotazů
Pomocí kombinovaných operátorů můžete zkombinovat libovolný z výše uvedených typů dotazů, abyste do jednoho dotazu zahrnuli více podrobností. Tady je několik dalších příkladů složených dotazů, které se dotazují na více než jeden typ popisovače dvojčete najednou.
- Ze zařízení, která má místnost 123, vraťte zařízení MxChip, která obsluhuje roli operátora.
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'
- Získání dvojčat, která mají relaci s
Contains
názvem jiného dvojčete s IDid1
SELECT Room FROM DIGITALTWINS Room JOIN Thermostat RELATED Room.Contains WHERE Thermostat.$dtId = 'id1'
- Získejte všechny pokoje tohoto modelu místnosti, které jsou součástí podlahy11.
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')
Spouštění dotazů pomocí rozhraní API
Jakmile se rozhodnete pro řetězec dotazu, spustíte ho voláním rozhraní API pro dotazy.
Rozhraní API můžete volat přímo nebo můžete použít některou ze sad SDK dostupných pro Azure Digital Twins.
Následující fragment kódu znázorňuje volání sady .NET (C#) SDK z klientské aplikace:
// Run a query for all twins
string query = "SELECT * FROM DIGITALTWINS";
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>(query);
Dotaz použitý v tomto volání vrátí seznam digitálních dvojčat, které výše uvedený příklad představuje s objekty BasicDigitalTwin . Návratový typ dat pro každý dotaz bude záviset na tom, jaké termíny zadáte pomocí SELECT
příkazu:
- Dotazy, které začínají
SELECT * FROM ...
, vrátí seznam digitálních dvojčat (které lze serializovat jakoBasicDigitalTwin
objekty nebo jiné vlastní typy digitálních dvojčat, které jste mohli vytvořit). - Dotazy, které začínají ve formátu
SELECT <A>, <B>, <C> FROM ...
, vrátí slovník s klíči<A>
,<B>
a<C>
. - Další formáty
SELECT
příkazů lze vytvořit tak, aby vracely vlastní data. Můžete zvážit vytvoření vlastních tříd pro zpracování přizpůsobených sad výsledků.
Dotaz se stránkováním
Volání dotazů podporují stránkování. Tady je úplný příklad použití BasicDigitalTwin
jako typu výsledku dotazu se zpracováním chyb a stránkováním:
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;
}
Další kroky
Přečtěte si další informace o rozhraních API a sadách SDK služby Azure Digital Twins, včetně rozhraní API pro dotazy, které se používá ke spouštění dotazů z tohoto článku.