الاستعلام عن الرسم البياني المزدوج ل Azure Digital Twins
تقدم هذه المقالة أمثلة استعلام وإرشادات لاستخدام لغة استعلام Azure Digital Twins للاستعلام عن الرسم البياني المزدوج للحصول على معلومات. (للحصول على مقدمة إلى لغة الاستعلام، راجع لغة الاستعلام.)
تحتوي المقالة على نماذج استعلامات توضح بنية لغة الاستعلام وعمليات الاستعلام الشائعة للتوائم الرقمية. كما يصف كيفية تشغيل الاستعلامات بعد كتابتها، باستخدام Azure Digital Twins Query API أو SDK.
إشعار
إذا كنت تقوم بتشغيل نموذج الاستعلامات أدناه باستخدام استدعاء API أو SDK، فستحتاج إلى تكثيف نص الاستعلام في سطر واحد.
الوثائق المرجعية
يمكن العثور على مرجع لغة الاستعلام ضمن مرجع في جدول المحتويات الأيسر لوثائق Azure Digital Twins. يمكنك أيضا الانتقال مباشرة إلى الأقسام المرجعية باستخدام الارتباطات أدناه:
عرض كل التوائم الرقمية
إليك الاستعلام الأساسي الذي سيعيد قائمة بجميع التوائم الرقمية في المثيل:
SELECT * FROM DIGITALTWINS
الاستعلام عن طريق الملكية
احصل على توائم رقمية حسب الخصائص (بما في ذلك المعرف وبيانات التعريف):
SELECT *
FROM DIGITALTWINS T
WHERE T.firmwareVersion = '1.1'
AND T.$dtId in ['123', '456']
AND T.Temperature = 70
كما هو موضح في الاستعلام أعلاه، يتم الاستعلام عن معرف التوأم الرقمي باستخدام حقل بيانات التعريف $dtId
.
تلميح
إذا كنت تستخدم Cloud Shell لتشغيل استعلام مع حقول بيانات التعريف التي تبدأ ب $
، فيجب عليك الهروب $
باستخدام رد مائل عكسي لإعلام Cloud Shell بأنه ليس متغيرا ويجب استهلاكه كحقل حرفي في نص الاستعلام.
يمكنك أيضًا الحصول على توائم بناءً على ما إذا كانت خاصية معينة محددة أم لا. فيما يلي استعلام يحصل على توائم لها خاصية محددة Location
:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(Location)
يمكن أن يساعدك هذا الاستعلام في الحصول على توائم حسب خصائصها tag
، كما هو موضح في إضافة علامات إلى التوائم الرقمية. إليك استعلاما يحصل على جميع التوائم الموسومة ب red
:
SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)
يمكنك أيضا الحصول على توائم استنادا إلى نوع الخاصية. فيما يلي استعلام يحصل على توائم تكون خاصية الخاصة بها Temperature
رقما:
SELECT * FROM DIGITALTWINS T WHERE IS_NUMBER(T.Temperature)
خصائص مخطط الاستعلام
إذا كانت الخاصية من النوع Map
المعقد ، يمكنك استخدام مفاتيح الخريطة والقيم مباشرة في الاستعلام، مثل هذا:
SELECT * FROM DIGITALTWINS T WHERE T.<propertyName>.<mapKey> = '<mapValue>'
إذا بدأ مفتاح الخريطة بحرف رقمي، فستحتاج إلى تضمين المفتاح بين أقواس مربعة مزدوجة ([[<mapKey>]]
) للهروب منه في الاستعلام، على غرار استراتيجية الاستعلام باستخدام الكلمات الأساسية المحجوزة.
الاستعلام عن طريق النموذج
IS_OF_MODEL
يمكن استخدام عامل التشغيل للتصفية استنادا إلى نموذج التوأم.
وهو يأخذ في الاعتبار التوريث وتعيين إصدار النموذج، ويقيم إلى true
لتوأم معين إذا كان التوأم يفي بأي من هذه الشروط:
- ينفذ التوأم مباشرة النموذج المقدم إلى
IS_OF_MODEL()
، ورقم إصدار النموذج على التوأم أكبر من أو يساوي رقم إصدار النموذج المقدم - ينفذ التوأم نموذجا يوسع النموذج المقدم إلى
IS_OF_MODEL()
، ورقم إصدار النموذج الموسع للتوأم أكبر من أو يساوي رقم إصدار النموذج المقدم
لذلك على سبيل المثال، إذا قمت بالاستعلام عن توائم النموذج dtmi:example:widget;4
، فسيرجع الاستعلام جميع التوائم استنادا إلى الإصدار 4 أو أحدث من نموذج عنصر واجهة المستخدم، وكذلك التوائم استنادا إلى الإصدار 4 أو أحدث من أي نماذج ترث من عنصر واجهة المستخدم.
IS_OF_MODEL
يمكن أن تأخذ العديد من المعلمات المختلفة، وبقية هذا القسم مخصص لخيارات التحميل الزائد المختلفة الخاصة به.
أبسط استخدام يأخذ IS_OF_MODEL
معلمة twinTypeName
فقط: IS_OF_MODEL(twinTypeName)
.
فيما يلي مثال استعلام يمرر قيمة في هذه المعلمة:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1')
لتحديد مجموعة مزدوجة للبحث عند وجود أكثر من مجموعة (مثل عند JOIN
استخدام)، أضف المعلمة twinCollection
: IS_OF_MODEL(twinCollection, twinTypeName)
.
فيما يلي مثال استعلام يضيف قيمة لهذه المعلمة:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1')
للقيام بمطابقة تامة، أضف المعلمة exact
: IS_OF_MODEL(twinTypeName, exact)
.
فيما يلي مثال استعلام يضيف قيمة لهذه المعلمة:
SELECT * FROM DIGITALTWINS WHERE IS_OF_MODEL('dtmi:example:thing;1', exact)
يمكنك أيضا تمرير جميع الوسيطات الثلاثة معا: IS_OF_MODEL(twinCollection, twinTypeName, exact)
.
فيما يلي مثال استعلام يحدد قيمة لجميع المعلمات الثلاثة:
SELECT * FROM DIGITALTWINS DT WHERE IS_OF_MODEL(DT, 'dtmi:example:thing;1', exact)
الاستعلام عن طريق العلاقة
عند الاستعلام بناءً على علاقات التوائم الرقمية، فإن لغة الاستعلام في Azure Digital Twins لها صيغة خاصة.
تُسحب العلاقات الموجودة في نطاق الاستعلام في عبارة FROM
. على عكس اللغات "الكلاسيكية" من نوع SQL، كل تعبير في FROM
العبارة ليس جدولا؛ بدلا من ذلك، FROM
تعبر العبارة عن اجتياز علاقة عبر الكيانات. للاجتياز عبر العلاقات، يستخدم Azure Digital Twins إصدارا مخصصا من JOIN
.
تذكر أنه مع قدرات نموذج Azure Digital Twins، لا توجد العلاقات بشكل مستقل عن التوائم، ما يعني أنه لا يمكن الاستعلام عن العلاقات هنا بشكل مستقل ويجب ربطها بتوأم.
لتعكس هذه الحقيقة، يتم استخدام الكلمة الأساسية RELATED
في JOIN
عبارة لسحب مجموعة نوع معين من العلاقة القادمة من مجموعة التوأم. يجب أن يقوم الاستعلام بعد ذلك بالتصفية WHERE
في عبارة ، للإشارة إلى التوأم (التوأم) المحدد الذي يجب استخدامه في استعلام العلاقة (باستخدام قيم التوائم $dtId
).
تقدم الأقسام التالية أمثلة على الشكل الذي يبدو عليه هذا.
استعلام العلاقة الأساسية
فيما يلي نموذج استعلام يستند إلى العلاقة. تحدد هذه القصاصة البرمجية جميع التوائم الرقمية بخاصية ID
ABC
، وجميع التوائم الرقمية المتعلقة بهذه التوائم الرقمية عبر contains
علاقة.
SELECT T, CT
FROM DIGITALTWINS T
JOIN CT RELATED T.contains
WHERE T.$dtId = 'ABC'
يشار إلى نوع العلاقة (contains
في المثال أعلاه) باستخدام حقل العلاقة name
من تعريف DTDL الخاص به.
إشعار
لا يحتاج المطور إلى ربط هذا JOIN
بقيمة مفتاح في WHERE
عبارة (أو تحديد قيمة مفتاح مضمنة JOIN
مع التعريف). يتم حساب هذا الارتباط تلقائيا بواسطة النظام، حيث تحدد خصائص العلاقة نفسها الكيان الهدف.
الاستعلام حسب مصدر العلاقة أو هدفها
يمكنك استخدام بنية استعلام العلاقة لتحديد التوأم الرقمي الذي هو مصدر العلاقة أو هدفها.
على سبيل المثال، يمكنك البدء بتوأم مصدر واتباع علاقاته للعثور على التوائم المستهدفة للعلاقات. فيما يلي مثال على استعلام يعثر على التوائم المستهدفة للعلاقات feeds
القادمة من التوأم المصدر المزدوج.
SELECT target
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE source.$dtId = 'source-twin'
يمكنك أيضا البدء بهدف العلاقة وتتبع العلاقة مرة أخرى للعثور على التوأم المصدر. فيما يلي مثال على استعلام يعثر على التوأم المصدر لعلاقة feeds
بالتوأم الهدف المزدوج.
SELECT source
FROM DIGITALTWINS source
JOIN target RELATED source.feeds
WHERE target.$dtId = 'target-twin'
الاستعلام عن خصائص العلاقة
على غرار الطريقة التي تحتوي بها التوائم الرقمية على خصائص موصوفة عبر DTDL، يمكن أن يكون للعلاقات أيضا خصائص. يمكنك الاستعلام عن التوائم استنادًا إلى خصائص علاقاتهم.
تسمح لغة استعلام Azure Digital Twins بتصفية العلاقات وإسقاطها، عن طريق تعيين اسم مستعار للعلاقة داخل JOIN
عبارة .
على سبيل المثال، ضع في اعتبارك servicedBy
علاقة لها خاصية reportedCondition
. في الاستعلام أدناه، يتم إعطاء هذه العلاقة R
اسما مستعارا للإشارة إلى الخاصية الخاصة بها.
SELECT T, SBT, R
FROM DIGITALTWINS T
JOIN SBT RELATED T.servicedBy R
WHERE T.$dtId = 'ABC'
AND R.reportedCondition = 'clean'
في المثال أعلاه، لاحظ كيف reportedCondition
هي خاصية للعلاقة servicedBy
نفسها (وليس لبعض التوأم الرقمي الذي له servicedBy
علاقة).
الاستعلام باستخدام عدة JOINs
يتم دعم ما يصل إلى خمسة JOIN
s في استعلام واحد، والذي يسمح لك باجتياز مستويات متعددة من العلاقات في وقت واحد.
للاستعلام عن مستويات متعددة من العلاقات، استخدم عبارة واحدة FROM
متبوعة بجمل N JOIN
، حيث JOIN
تعبر العبارات عن العلاقات بناء على نتيجة سابقة FROM
أو JOIN
عبارة.
فيما يلي مثال على استعلام متعدد الصلات، والذي يحصل على جميع المصابيح الموجودة في لوحات الضوء في الغرف 1 و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']
عدد العناصر
يمكنك حساب عدد العناصر في مجموعة نتائج باستخدام Select COUNT
عبارة :
SELECT COUNT()
FROM DIGITALTWINS
أضف عبارة WHERE
لحساب عدد العناصر التي تفي بمعايير معينة. فيما يلي بعض الأمثلة على العد باستخدام عامل تصفية مطبق استنادا إلى نوع النموذج المزدوج (لمزيد من المعلومات حول بناء الجملة هذا، راجع الاستعلام حسب النموذج أدناه):
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
يمكنك أيضا استخدام COUNT
مع JOIN
عبارة . فيما يلي استعلام يحسب جميع المصابيح الكهربائية الموجودة في اللوحات الضوئية للغرف 1 و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']
تصفية النتائج: حدد أهم العناصر
يمكنك تحديد العديد من العناصر "العلوية" في استعلام باستخدام Select TOP
عبارة .
SELECT TOP (5)
FROM DIGITALTWINS
WHERE ...
نتائج التصفية: تحديد مجموعة الإرجاع مع الإسقاطات
باستخدام الإسقاطات في العبارة SELECT
، يمكنك اختيار الأعمدة التي سيرجعها الاستعلام. الإسقاط مدعوم الآن لكل من الخصائص الأولية والمعقدة. لمزيد من المعلومات حول الإسقاطات باستخدام Azure Digital Twins، راجع الوثائق المرجعية لجملة SELECT.
فيما يلي مثال على استعلام يستخدم الإسقاط لإرجاع التوائم والعلاقات. يعرض الاستعلام التالي المستهلك والمصنع والحافة من سيناريو حيث يرتبط المصنع بمعرف للمستهلك ABC
من خلال علاقة من Factory.customer
، ويتم تقديم هذه العلاقة Edge
ك .
SELECT Consumer, Factory, Edge
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
يمكنك أيضا استخدام الإسقاط لإرجاع خاصية التوأم. يعرض Name
الاستعلام التالي خاصية المستهلكين المرتبطة بالمصنع بمعرف من ABC
خلال علاقة .Factory.customer
SELECT Consumer.name
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
يمكنك أيضا استخدام الإسقاط لإرجاع خاصية علاقة. كما هو الحال في المثال السابق، يعرض Name
الاستعلام التالي خاصية المستهلكين المتعلقة بالمصنع بمعرف من ABC
خلال علاقة Factory.customer
؛ ولكن الآن يقوم أيضا بإرجاع خاصيتين لتلك العلاقة، prop1
و prop2
. يقوم بذلك عن طريق تسمية العلاقة Edge
وجمع خصائصها.
SELECT Consumer.name, Edge.prop1, Edge.prop2, Factory.area
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
يمكنك أيضا استخدام الأسماء المستعارة لتبسيط الاستعلامات مع الإسقاط.
يقوم الاستعلام التالي بنفس العمليات مثل المثال السابق، ولكنه يسمي أسماء consumerName
الخصائص باسم و first
second
و و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'
فيما يلي استعلام مشابه يستعلم عن نفس المجموعة كما هو موضح أعلاه، ولكنه يعرض الخاصية فقط Consumer.name
ك consumerName
، ويعرض المصنع الكامل كتوأم.
SELECT Consumer.name AS consumerName, Factory
FROM DIGITALTWINS Factory
JOIN Consumer RELATED Factory.customer Edge
WHERE Factory.$dtId = 'ABC'
إنشاء استعلامات فعالة باستخدام عامل تشغيل IN
يمكنك تقليل عدد الاستعلامات التي تحتاجها بشكل كبير عن طريق إنشاء صفيف من التوائم والاستعلام مع IN
عامل التشغيل.
على سبيل المثال، ضع في اعتبارك سيناريو تحتوي فيه المباني على أرضيات وطوابق على غرف. للبحث عن غرف داخل مبنى ساخن، تتمثل إحدى الطرق في اتباع هذه الخطوات.
العثور على أرضيات في المبنى بناء على العلاقة
contains
.SELECT Floor FROM DIGITALTWINS Building JOIN Floor RELATED Building.contains WHERE Building.$dtId = @buildingId
للعثور على الغرف، بدلا من النظر في الطوابق واحدا تلو الآخر وتشغيل
JOIN
استعلام للعثور على الغرف لكل غرفة، يمكنك الاستعلام باستخدام مجموعة من الطوابق في المبنى (تسمى Floor في الاستعلام أدناه).في تطبيق العميل:
var floors = "['floor1','floor2', ..'floorn']";
في الاستعلام:
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')
أمثلة استعلام مركبة أخرى
يمكنك دمج أي من أنواع الاستعلام أعلاه باستخدام عوامل التشغيل التركيبية لتضمين مزيد من التفاصيل في استعلام واحد. فيما يلي بعض الأمثلة الأخرى للاستعلامات المركبة التي تستعلم عن أكثر من نوع واحد من واصف التوأم في وقت واحد.
- من الأجهزة التي تحتويها الغرفة 123، قم بإعادة أجهزة MxChip التي تخدم دور المشغل
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'
- الحصول على توائم لها علاقة مسماة
Contains
مع توأم آخر يحتوي على معرفid1
SELECT Room FROM DIGITALTWINS Room JOIN Thermostat RELATED Room.Contains WHERE Thermostat.$dtId = 'id1'
- احصل على جميع غرف طراز الغرفة هذه التي يحتوي عليها floor11
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')
تشغيل الاستعلامات باستخدام واجهة برمجة التطبيقات
بمجرد اتخاذ قرار بشأن سلسلة استعلام، يمكنك تنفيذها عن طريق إجراء استدعاء لواجهة برمجة تطبيقات الاستعلام.
يمكنك استدعاء واجهة برمجة التطبيقات مباشرة، أو استخدام إحدى SDKs المتوفرة ل Azure Digital Twins.
توضح القصاصة البرمجية التالية استدعاء .NET (C#) SDK من تطبيق عميل:
// Run a query for all twins
string query = "SELECT * FROM DIGITALTWINS";
AsyncPageable<BasicDigitalTwin> result = client.QueryAsync<BasicDigitalTwin>(query);
يرجع الاستعلام المستخدم في هذا الاستدعاء قائمة بالتوائم الرقمية، والتي يمثلها المثال أعلاه مع كائنات BasicDigitalTwin . يعتمد نوع إرجاع البيانات لكل استعلام على المصطلحات التي تحددها مع العبارة SELECT
:
- سترجع الاستعلامات التي تبدأ
SELECT * FROM ...
بقائمة من التوائم الرقمية (والتي يمكن تسلسلها ككائناتBasicDigitalTwin
، أو أنواع توائم رقمية مخصصة أخرى قد تكون قمت بإنشائها). - سترجع الاستعلامات التي تبدأ بالتنسيق
SELECT <A>, <B>, <C> FROM ...
قاموسا بالمفاتيح<A>
و<B>
و.<C>
- يمكن صياغة تنسيقات أخرى من
SELECT
العبارات لإرجاع بيانات مخصصة. قد تفكر في إنشاء الفئات الخاصة بك للتعامل مع مجموعات النتائج المخصصة.
استعلام مع ترحيل الصفحات
استدعاءات الاستعلام تدعم ترحيل الصفحات. فيما يلي مثال كامل باستخدام BasicDigitalTwin
كنوع نتيجة الاستعلام مع معالجة الأخطاء وترحيلها:
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;
}
الخطوات التالية
تعرف على المزيد حول واجهات برمجة تطبيقات Azure Digital Twins وSDKs، بما في ذلك واجهة برمجة تطبيقات الاستعلام المستخدمة لتشغيل الاستعلامات من هذه المقالة.