Azure Digital Twins ikiz grafını sorgulama
Bu makalede, bilgi için ikiz grafınızı sorgulamak üzere Azure Digital Twins sorgu dilini kullanmaya yönelik sorgu örnekleri ve yönergeler sunulmaktadır. (Sorgu diline giriş için bkz. Sorgu dili.)
Makale, dijital ikizler için sorgu dili yapısını ve yaygın sorgu işlemlerini gösteren örnek sorgular içerir. Ayrıca, Azure Digital Twins Sorgu API'sini veya SDK'yı kullanarak sorgularınızı yazdıktan sonra nasıl çalıştırabileceğiniz de açıklanır.
Not
Aşağıdaki örnek sorguları bir API veya SDK çağrısıyla çalıştırıyorsanız, sorgu metnini tek bir satırda daraltmanız gerekir.
Başvuru belgeleri
Sorgu dili başvurusu, Azure Digital Twins belgelerinin sol içindekiler tablosunda başvuru bölümünde bulunabilir . Aşağıdaki bağlantıları kullanarak doğrudan başvuru bölümlerine de gidebilirsiniz:
Tüm dijital ikizleri göster
Örnekteki tüm dijital ikizlerin listesini döndürecek temel sorgu aşağıdadır:
SELECT * FROM DIGITALTWINS
Özelliğe göre sorgulama
Özelliklere göre dijital ikizleri alın (kimlik ve meta veriler dahil):
SELECT *
FROM DIGITALTWINS T
WHERE T.firmwareVersion = '1.1'
AND T.$dtId in ['123', '456']
AND T.Temperature = 70
Yukarıdaki sorguda gösterildiği gibi, dijital ikizin kimliği meta veri alanı $dtId
kullanılarak sorgulanır.
İpucu
ile başlayan $
meta veri alanlarıyla bir sorgu çalıştırmak için Cloud Shell kullanıyorsanız, Cloud Shell değişken olmadığını ve sorgu metninde değişmez değer olarak kullanılması gerektiğini bildirmek için ters eğik çizgiyle kaçış karakteri kullanmanız gerekir$
.
Ayrıca belirli bir özelliğin tanımlanıp tanımlanmadığına bağlı olarak ikizleri de alabilirsiniz. Tanımlı özelliğe sahip ikizleri alan bir sorgu aşağıdadır Location
:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(Location)
Bu sorgu, Dijital ikizlere etiket ekleme bölümünde açıklandığı gibi ikizleri tag
özelliklerine göre almanıza yardımcı olabilir. Tüm ikizleri ile red
etiketleyen bir sorgu aşağıdadır:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)
Ayrıca bir özelliğin türüne göre ikizler de alabilirsiniz. Özelliği sayı olan Temperature
ikizleri alan bir sorgu aşağıdadır:
SELECT * FROM DIGITALTWINS T WHERE IS_NUMBER(T.Temperature)
Sorgu Eşlemesi özellikleri
Bir özellik karmaşık türdeyse Map
, eşleme anahtarlarını ve değerlerini doğrudan sorguda kullanabilirsiniz, örneğin:
SELECT * FROM DIGITALTWINS T WHERE T.<propertyName>.<mapKey> = '<mapValue>'
Harita anahtarı sayısal bir karakterle başlıyorsa, ayrılmış anahtar sözcüklerle sorgulama stratejisine benzer şekilde, sorguda kaçabilmek için anahtarı çift köşeli ayraç içine ([[<mapKey>]]
) sarmalamanız gerekir.
Modele göre sorgulama
İşleç, IS_OF_MODEL
ikizin modeline göre filtrelemek için kullanılabilir.
Devralma ve model sürümü oluşturmayı dikkate true
alır ve ikiz aşağıdaki koşullardan birini karşılıyorsa belirli bir ikiz için olarak değerlendirilir:
- İkiz, için sağlanan
IS_OF_MODEL()
modeli doğrudan uygular ve ikiz üzerindeki modelin sürüm numarası, sağlanan modelin sürüm numarasından büyük veya buna eşit - İkiz, sağlanan modeli ile
IS_OF_MODEL()
genişleten bir model uygular ve ikizin genişletilmiş model sürüm numarası, sağlanan modelin sürüm numarasından büyük veya buna eşit
Bu nedenle örneğin, modelin dtmi:example:widget;4
ikizlerini sorgularsanız sorgu, pencere öğesi modelinin 4 veya daha sonraki bir sürümüne göre tüm ikizleri ve pencere öğesinden devralan modellerin 4. veya daha sonraki bir sürümünü temel alan ikizleri döndürür.
IS_OF_MODEL
birkaç farklı parametre alabilir ve bu bölümün geri kalanı farklı aşırı yükleme seçeneklerine ayrılmıştır.
en basit kullanımı IS_OF_MODEL
yalnızca bir twinTypeName
parametre alır: IS_OF_MODEL(twinTypeName)
.
Bu parametredeki bir değeri geçiren bir sorgu örneği aşağıda verilmiştir:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1')
Birden fazla olduğunda (örneğin, kullanıldığında) aranacak bir JOIN
ikiz koleksiyonu belirtmek için parametresini twinCollection
ekleyin: IS_OF_MODEL(twinCollection, twinTypeName)
.
Bu parametre için değer ekleyen bir sorgu örneği aşağıda verilmiştir:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1')
Tam eşleşme yapmak için parametresini exact
ekleyin: IS_OF_MODEL(twinTypeName, exact)
.
Bu parametre için değer ekleyen bir sorgu örneği aşağıda verilmiştir:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1', exact)
Ayrıca üç bağımsız değişkeni de birlikte geçirebilirsiniz: IS_OF_MODEL(twinCollection, twinTypeName, exact)
.
Üç parametre için de değer belirten bir sorgu örneği aşağıda verilmiştir:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1', exact)
İlişkiye göre sorgulama
Azure Digital Twins sorgu dilinde dijital ikizleri ilişkilerine göre sorgulamak için kullanılacak özel bir söz dizimi vardır.
İlişkiler, FROM
yan tümcesinde sorgu kapsamına çekilir. "Klasik" SQL türündeki dillerden farklı olarak yan tümcesindeki FROM
her ifade bir tablo değildir; bunun yerine yan FROM
tümcesi bir çapraz varlık ilişkisi geçişi ifade eder. Azure Digital Twins, ilişkiler arasında geçiş yapmak için özel bir sürümünü JOIN
kullanır.
Azure Digital Twins modeli özellikleriyle ilişkilerin ikizlerden bağımsız olarak mevcut olmadığını, yani buradaki ilişkilerin bağımsız olarak sorgulanamayacağını ve bir ikize bağlı olması gerektiğini unutmayın.
Bu olguyu yansıtmak için, ikiz koleksiyonundan gelen belirli bir ilişki türü kümesini çekmek için yan tümcesinde anahtar sözcüğü RELATED
kullanılır JOIN
. Sorgunun, ilişki sorgusunda WHERE
hangi ikizlerin kullanılacağını (ikizlerin $dtId
değerlerini kullanarak) belirtmek için yan tümcesinde filtreleme yapması gerekir.
Aşağıdaki bölümlerde bunun nasıl göründüğüne ilişkin örnekler verilmiştir.
Temel ilişki sorgusu
İlişki tabanlı örnek bir sorgu aşağıda verilmiştır. Bu kod parçacığı özelliğine sahip tüm dijital ikizleri ve bir ID
ABC
contains
ilişki aracılığıyla bu dijital ikizlerle ilgili tüm dijital ikizleri seçer.
SELECT T, CT
FROM DIGITALTWINS T
JOIN CT RELATED T.contains
WHERE T.$dtId = 'ABC'
İlişkinin türü (contains
yukarıdaki örnekte) DTDL tanımındaki ilişki name
alanı kullanılarak belirtilir.
Not
Geliştiricinin bunu JOIN
yan tümcedeki WHERE
bir anahtar değeriyle ilişkilendirmesi gerekmez (veya tanımla JOIN
satır içinde bir anahtar değeri belirtin). İlişki özellikleri hedef varlığı tanımladığından bu bağıntı sistem tarafından otomatik olarak hesaplanır.
İlişkinin kaynağına veya hedeflerine göre sorgulama
İlişkinin kaynağı veya hedefi olan bir dijital ikizi tanımlamak için ilişki sorgu yapısını kullanabilirsiniz.
Örneğin, bir kaynak ikizle başlayıp ilişkileri takip ederek ilişkilerin hedef ikizlerini bulabilirsiniz. Aşağıda, ikiz kaynak ikizinden gelen ilişkilerin hedef ikizlerini feeds
bulan bir sorgu örneği verilmiştir.
SELECT target
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE source.$dtId = 'source-twin'
Ayrıca ilişkinin hedefiyle başlayabilir ve kaynak ikizini bulmak için ilişkiyi geri izleyebilirsiniz. Aşağıda, ikiz hedef ikizine ilişkin bir ilişkinin kaynak ikizini bulan bir feeds
sorgu örneği verilmiştir.
SELECT source
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE target.$dtId = 'target-twin'
Bir ilişkinin özelliklerini sorgulama
Dijital ikizlerde DTDL aracılığıyla tanımlanan özelliklere benzer şekilde ilişkiler de özelliklere sahip olabilir. İkizleri, ilişkilerinin özelliklerine göre sorgulayabilirsiniz.
Azure Digital Twins sorgu dili, yan tümcesi içindeki JOIN
ilişkiye bir diğer ad atayarak ilişkilerin filtrelenmesine ve yansıtılmasına olanak tanır.
Örneğin, özelliği olan bir servicedBy
reportedCondition
ilişkiyi düşünün. Aşağıdaki sorguda, bu ilişkiye özelliğine başvurmak R
için bir diğer adı verilir.
SELECT T, SBT, R
FROM DIGITALTWINS T
JOIN SBT RELATED T.servicedBy R
WHERE T.$dtId = 'ABC'
AND R.reportedCondition = 'clean'
Yukarıdaki örnekte, ilişkinin özelliğinin servicedBy
nasıl reportedCondition
olduğuna dikkat edin (ilişkisi olan servicedBy
bazı dijital ikizlerin DEĞİlDİ).
Birden çok JOIN ile sorgulama
Tek bir sorguda beş JOIN
adede kadar sn desteklenir ve bu sayede aynı anda birden çok ilişki düzeyinde dolaşmanız sağlanır.
Birden çok ilişki düzeyini sorgulamak için tek FROM
bir deyim ve ardından N JOIN
deyimleri kullanın; burada JOIN
deyimler, önceki FROM
veya JOIN
deyimin sonucuyla ilişkileri ifade eder.
Burada, 1 ve 2. odalardaki ışık panellerinde bulunan tüm ampulleri alan çoklu birleşim sorgusu örneği verilmiştir.
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']
Öğeleri sayma
Yan tümcesini kullanarak bir sonuç kümesindeki Select COUNT
öğe sayısını sayabilirsiniz:
SELECT COUNT()
FROM DIGITALTWINS
Belirli bir WHERE
ölçüte uyan öğe sayısını saymak için bir yan tümce ekleyin. İkiz modelin türüne göre uygulanan filtreyle sayma işlemine ilişkin bazı örnekler aşağıda verilmiştir (bu söz dizimi hakkında daha fazla bilgi için aşağıdaki Modele göre sorgulama bölümüne bakın):
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
Yan tümcesiyle JOIN
birlikte de kullanabilirsinizCOUNT
. 1. ve 2. odaların ışık panellerinde bulunan tüm ampulleri sayan bir sorgu aşağıdadır:
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']
Filtre sonuçları: en çok kullanılan öğeleri seçme
Yan tümcesini kullanarak bir sorgudaki birkaç "en iyi" öğeyi Select TOP
seçebilirsiniz.
SELECT TOP (5)
FROM DIGITALTWINS
WHERE ...
Sonuçları filtrele: yansıtmalarla dönüş kümesi belirtme
Deyimdeki projeksiyonları kullanarak, sorgunun SELECT
hangi sütunları döndüreceğini seçebilirsiniz. Projeksiyon artık hem ilkel hem de karmaşık özellikler için desteklenmektedir. Azure Digital Twins ile projeksiyonlar hakkında daha fazla bilgi için SELECT yan tümcesi başvuru belgelerine bakın.
aşağıda ikizleri ve ilişkileri döndürmek için projeksiyon kullanan bir sorgu örneği verilmiştir. Aşağıdaki sorgu, Consumer, Factory ve Edge'i, kimliğine sahip bir Fabrika'nın ABC
bir ilişkisi aracılığıyla Tüketici ile ilişkili olduğu ve bu ilişkinin olarak sunulduğu bir senaryodan Factory.customer
projelendiriyor Edge
.
SELECT Consumer, Factory, Edge
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
İkizin bir özelliğini döndürmek için projeksiyonu da kullanabilirsiniz. Aşağıdaki sorgu, Factory ile ilişkili Olan Tüketicilerin özelliğini bir ilişkisi aracılığıyla kimliğiyle ABC
projelendiriyor.Name
Factory.customer
SELECT Consumer.name
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Bir ilişkinin özelliğini döndürmek için projeksiyonu da kullanabilirsiniz. Önceki örnekte olduğu gibi, aşağıdaki sorgu, Fabrika ile ilgili Tüketiciler özelliğini bir ilişkisi aracılığıyla kimliğiyle ABC
projelendiriyorName
; ancak şimdi bu ilişkinin prop1
iki özelliğini de döndürüyor ve prop2
.Factory.customer
Bunu ilişkiyi Edge
adlandırarak ve özelliklerini toplayarak yapar.
SELECT Consumer.name, Edge.prop1, Edge.prop2, Factory.area
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
Projeksiyonla sorguları basitleştirmek için diğer adları da kullanabilirsiniz.
Aşağıdaki sorgu önceki örnekle aynı işlemleri yapar, ancak özellik adlarını , , first
second
ve factoryArea
olarak consumerName
adlandırmaktadır.
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'
Aşağıda yukarıdakiyle aynı kümeyi sorgulayan, ancak yalnızca olarak özelliğini ve fabrikanın Consumer.name
tamamını ikiz olarak consumerName
projeleyen benzer bir sorgu bulunmaktadır.
SELECT Consumer.name AS consumerName, Factory
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
IN işleciyle verimli sorgular oluşturma
bir dizi ikiz oluşturup işleciyle IN
sorgulayarak ihtiyacınız olan sorgu sayısını önemli ölçüde azaltabilirsiniz.
Örneğin, Binaların Katlar ve Katlar'ın Odalar içerdiği bir senaryo düşünün. Bina içinde sıcak olan odaları aramak için bu adımları izlemenin bir yolu vardır.
İlişkiye göre binada zeminler
contains
bulun.SELECT Floor FROM DIGITALTWINS Building JOIN Floor RELATED Building.contains WHERE Building.$dtId = @buildingId
Odaları bulmak için, katları tek tek düşünmek ve her birinin odalarını bulmak için bir
JOIN
sorgu çalıştırmak yerine, binadaki katlardan oluşan bir koleksiyonla sorgulayabilirsiniz (aşağıdaki sorguda Floor adlı).İstemci uygulamasında:
var floors = "['floor1','floor2', ..'floorn']";
Sorguda:
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')
Diğer bileşik sorgu örnekleri
Tek bir sorguya daha fazla ayrıntı eklemek için birleşim işleçlerini kullanarak yukarıdaki sorgu türlerinden herhangi birini birleştirebilirsiniz. Burada, aynı anda birden fazla tür ikiz tanımlayıcısı sorgulayan bileşik sorguların diğer örnekleri verilmiştir.
- Room 123'ün sahip olduğu cihazlardan, Operatör rolüne hizmet eden MxChip cihazlarını döndür
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'
- Kimliği olan başka bir ikizle adlı
Contains
bir ilişkiye sahip ikizleri almaid1
SELECT Room FROM DIGITALTWINS Room JOIN Thermostat RELATED Room.Contains WHERE Thermostat.$dtId = 'id1'
- Bu oda modelinin floor11 içindeki tüm odalarını alın
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')
API ile sorgu çalıştırma
Bir sorgu dizesine karar verdikten sonra , Sorgu API'sine bir çağrı yaparak bu dizeyi yürütürsiniz.
API'yi doğrudan çağırabilir veya Azure Digital Twins için kullanılabilen SDK'lardan birini kullanabilirsiniz.
Aşağıdaki kod parçacığı, bir istemci uygulamasından yapılan .NET (C#) SDK çağrısını gösterir:
// Run a query for all twins
string query = "SELECT * FROM DIGITALTWINS";
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>(query);
Bu çağrıda kullanılan sorgu, yukarıdaki örnekte BasicDigitalTwin nesneleriyle temsil edilen dijital ikizlerin listesini döndürür. Her sorgu için verilerinizin dönüş türü, deyimiyle hangi terimleri belirttiğinize SELECT
bağlıdır:
- ile
SELECT * FROM ...
başlayan sorgular dijital ikizlerin listesini döndürür (nesneler olarakBasicDigitalTwin
seri hale getirilebilir veya oluşturmuş olabileceğiniz diğer özel dijital ikiz türleri). - Biçiminde
SELECT <A>, <B>, <C> FROM ...
başlayan sorgular ,<B>
ve<C>
anahtarlarını<A>
içeren bir sözlük döndürür. - Özel veri döndürmek için diğer deyim biçimleri
SELECT
oluşturulabilir. Özelleştirilmiş sonuç kümelerini işlemek için kendi sınıflarınızı oluşturmayı düşünebilirsiniz.
Disk belleği ile sorgulama
Sorgu çağrıları sayfalandırmayı destekler. Hata işleme ve sayfalama ile sorgu sonuç türü olarak kullanan BasicDigitalTwin
tam bir örnek aşağıda verilmiştir:
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;
}
Sonraki adımlar
Bu makaledeki sorguları çalıştırmak için kullanılan Sorgu API'si de dahil olmak üzere Azure Digital Twins API'leri ve SDK'ları hakkında daha fazla bilgi edinin.