1. مقدمة
مرحبًا بك في المرحلة الأخيرة من التحقيق في قضية "الشحنة المفقودة". بعد تتبُّع الحاوية المسروقة التي تضمّ مجسّمات Android من لندن إلى سيدني، توقّف أثرها. من خلال إيقاف جهاز الإرسال والاستقبال، فعَّل خزنة الأمان الذكية للحاوية عملية إغلاق طارئة تلقائية.
لاسترداد الشحنة القيّمة قبل إغلاقها نهائيًا، عليك العثور على الموقع الجغرافي النهائي للحاوية واسترداد رمز المرور اليدوي لفتح الخزنة.

للعثور على الحاوية المفقودة وتأمين الشحنة، عليك إنشاء رسم بياني للمواقع في BigQuery لتتبُّع رحلة الشحنة، ثمّ الاستعلام عن هذه الشبكة باللغة العادية باستخدام التحليلات الحوارية، وأخيرًا إجراء بحث دلالي في البيانات الوصفية لبياناتك باستخدام كتالوج المعرفة لتحديد رموز التجاوز.
💡 هل فاتك التدريب العملي 1 أو التدريب العملي 2؟ لا داعي للقلق. هذا المختبر مستقل تمامًا. ستوفّر خطوات إعداد البيئة كل ما تحتاج إليه، ما يتيح لك البدء مباشرةً وإكمالها بشكل مستقل.
الإجراءات التي ستنفذّها
- استنسِخ المستودع وشغِّل نص التهيئة البرمجي في Google Cloud Shell.
- إنشاء رسم بياني للعلاقات في BigQuery يربط بيانات الشركة والسفينة وبيانات البيان
- استخدِم "إحصاءات المحادثات" لطلب معلومات من الرسم البياني بلغة طبيعية، وتتبُّع رحلة الشحنة لتحديد المشغّل المسؤول.
- ابحث عن الجدول الذي يتضمّن رموز التجاوز النهائية باستخدام كتالوج المعرفة.
- استخدِم ميزة "التحكّم في الوصول على مستوى العمود" في BigQuery لإزالة التمويه والكشف عن الرمز النهائي.
المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع Google Cloud تم تفعيل الفوترة فيه
- الوصول إلى Google Cloud Shell
تم تصميم هذا الدرس التطبيقي حول الترميز ليناسب ممارسي البيانات من جميع المستويات.
يجب أن تكون تكلفة الموارد التي تم إنشاؤها في هذا الدرس التطبيقي حول الترميز أقل من 5 دولارات أمريكية.
المدة المقدّرة: يستغرق إكمال هذا الدرس العملي حوالي 45 دقيقة.
2. قبل البدء
إنشاء مشروع على Google Cloud
- في Google Cloud Console، في صفحة اختيار المشروع، اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
- تأكَّد من تفعيل الفوترة لمشروعك على السحابة الإلكترونية.
بدء Cloud Shell
ستستخدم Google Cloud Shell لتنزيل الرمز البرمجي وتشغيل نصوص الإعداد البرمجية ونشر التطبيق.
- في علامة تبويب متصفّح جديدة، افتح Cloud Shell:

- بعد الاتصال، اضبط رقم تعريف مشروعك وأكِّد بيئتك:
gcloud config set project <<YOUR_PROJECT_ID>>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
من المفترض أن تظهر لك رسالة مشابهة لما يلي:
Your active configuration is: [cloudshell-####] Updated property [core/project]
تفعيل واجهات برمجة التطبيقات المطلوبة
نفِّذ الأمر التالي في Cloud Shell لتفعيل واجهات برمجة التطبيقات المطلوبة:
gcloud services enable \
bigquery.googleapis.com \
aiplatform.googleapis.com \
datacatalog.googleapis.com \
geminidataanalytics.googleapis.com \
cloudaicompanion.googleapis.com
عند التنفيذ بنجاح، من المفترض أن تظهر لك رسالة مشابهة لما يلي:
Operation "operations/..." finished successfully.
3- إعداد البيئة
في الجلسات السابقة من هذه السلسلة، وضعنا الأساس لتحقيقنا.
1. إنشاء نسخة طبق الأصل من المستودع
أنشئ نسخة طبق الأصل من مستودع الدرس التطبيقي حول الترميز إلى بيئة Cloud Shell:
cd ~/
git clone --filter=blob:none --no-checkout https://github.com/GoogleCloudPlatform/devrel-demos.git
cd ~/devrel-demos
git sparse-checkout init --cone
git sparse-checkout set codelabs/bigquery-graph-analytics
git checkout main
cd codelabs/bigquery-graph-analytics/
2. إعداد الجداول الأساسية وعلامات السياسات
نفِّذ نص التهيئة البرمجي لتعبئة مجموعة بيانات BigQuery وتطبيق علامات الأمان على مستوى العمود من أجل حصر البيانات الحسّاسة:
bash setup_lab.sh
تأكَّد من أنّ الناتج في نافذة الأوامر يعرض عملية إعداد ناجحة:
🚀 Provisioning foundational tables and deploying Policy Tag security bindings... 🎯 Active Project: your-project-id ... 🎉 Success! Foundational tables initialized and Column-Level Policy Tags fully mapped out of the box!
بعد إعداد بيئتك بنجاح وتعبئة بيانات الخدمات اللوجستية في BigQuery، يمكنك الآن إنشاء "رسم بياني للعناصر" لربط جداولك وتتبُّع رحلة الشحن.
4. ربط بياناتك باستخدام BigQuery Graph
لتحليل بيانات سلسلة الإمداد، سنحدّد كيفية ارتباط الشركات والسفن وبيانات الشحن ببعضها البعض. يتيح لنا إنشاء رسم بياني للخصائص الاستعلام عن هذه الروابط بسهولة.
1. كيفية تصميم العلاقات باستخدام الرسوم البيانية للعقارات

يصمّم الرسم البياني للعلاقات في BigQuery الشبكات باستخدام:
- العُقد: هي الكيانات في الشبكة. في هذا الدرس العملي، تمثّل العُقد الشركات (التي تخزّن تفاصيل الاتصال مباشرةً) وبيانات البيان والحاويات.
- الحواف: هي العلاقات التي تربط العُقد ببعضها، مثل:
- يربط الحافة بيان بـ حاوية (من خلال العلاقات في الجدول
manifests). - يربط الحافة سفينة بشركة (من خلال العلاقات في جدول
vessels).
- يربط الحافة بيان بـ حاوية (من خلال العلاقات في الجدول
- السمات: البيانات الوصفية المخزّنة في العُقد أو الحواف على سبيل المثال، تحتوي عقدة الشركة على أعمدة مثل
company_nameوphone_number، وتحتوي عقدة بيان علىseal_integrity_statusوإحداثيات (last_ping_lat،last_ping_long). - التصنيفات: أسماء العلامات المخصّصة للعُقد (مثل
CompanyوVesselوManifest) والحواف (مثلCARRIED_BYوOPERATED_BY) لكي تتمكّن أدوات طلب البحث من التعرّف على أنواع العُقد والعلاقات
2. نشر Property Graph في BigQuery
يحتوي ملف setup_graph.sql على SQL DDL لتحديد وإنشاء الرسم البياني للعناصر، ولكنّه غير مكتمل حاليًا. عليك تحديد تصنيفات الحواف (العلاقات) في ملف المخطط هذا قبل تجميعه ونشره:
- افتح "محرِّر Cloud Shell".

- افتح الملف
setup_graph.sqlفي "محرِّر Cloud Shell".

- ابحث عن العناصر النائبة لتصنيفات الحواف:
- السطر 22: استبدِل
`EDGE_TABLE_PLACEHOLDER`بعلامة ذات معنى تمثّل كيفية ارتباط بيانات البيان بالسفن (مثلCARRIED_BY). - السطر 27: استبدِل
`EDGE_TABLE_PLACEHOLDER`بعلامة تمثّل العلاقة بين السفن والشركات (مثلاً،OPERATED_BY).
- السطر 22: استبدِل
- احفظ الملف.
الآن، ارجع إلى نافذة Cloud Shell الطرفية ونفِّذ الرسم البياني المعدَّل للعناصر باستخدام النص البرمجي المكتمل:
bq query --use_legacy_sql=false < setup_graph.sql
من المفترض أن تظهر لك نتيجة تشير إلى اكتمال المهمة:
Waiting on bqjob_r... ... (0s) Current status: DONE
يمكنك الاطّلاع على تفاصيل "مخطط الموقع" في وحدة تحكّم BigQuery:
ابحث عن lost_cargo_dataset وانقر على "الرسومات البيانية":

بعد تجميع الرسم البياني للعناصر بنجاح، لننتقل إلى BigQuery Studio للاستعلام عن عمليات الربط وعرضها.
5- طلب البحث في الرسم البياني
يمكنك طلب البحث عن الرسم البياني واستكشافه بشكل مرئي باستخدام لغة طلبات الرسم البياني (GQL) الأصلية مباشرةً داخل BigQuery Studio.
1. طلب البحث عن سلسلة الحاويات -> السفن -> الشركات
لنستكشف طلبات بحث GQL من خلال تحديد الجهة التي تشغّل السفن التي تنقل البضائع. يتطلّب العثور على المشغّل الانتقال بين ثلاث عقد كيانات منفصلة في شبكة الخدمات اللوجستية:

- ابدأ من عُقدة الحاوية
Manifest. - اتّبِع حافة العلاقة
CARRIED_BYللعثور علىVessel. - اتّبِع حافة العلاقة
OPERATED_BYمن تلك السفينة إلىCompanyالمسؤول واسترجِع معرّفه.
أولاً، لننفّذ طلب بحث لعرض الشبكة بأكملها (بدون أي فلاتر) لرؤية الرسم البياني الكامل.
- افتح علامة تبويب جديدة في محرِّر SQL في BigQuery Studio، والصِق طلب بحث GQL التالي، ثم انقر على تنفيذ:
SELECT * FROM GRAPH_TABLE( `lost_cargo_dataset.logistics_network` MATCH p = (m:Manifest)-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company) RETURN TO_JSON(p) AS path ); - عند اكتمال طلب البحث، انقر على علامة التبويب الرسم البياني (بجانب علامة التبويب جدول النتائج) في لوحة نتائج طلب البحث أسفل الصفحة.

- يعرض BigQuery النتائج على شكل تمثيل بياني مرئي تفاعلي. يمكنك تكبير الشاشة للاطّلاع على الشبكة الكاملة للحاويات والسفن والمشغّلين المرتبطين.
بنية طلب بحث GQL
لنحلّل استعلام GQL الذي أجريناه للتو:
- استبدِل
GRAPH_TABLEبما يلي: يوجّه BigQuery لتنفيذ طلب بحث في الرسم البياني للعناصر استنادًا إلى الرسم البيانيlogistics_network. -
MATCH: تحدّد نمط التنقّل المتعدد الخطوات. نبدأ منManifest(m)، ثم نربط علاقة الحافة:CARRIED_BYالتي تشير إلىVessel(v)، ثم نربط علاقة الحافة:OPERATED_BYالتي تشير إلىCompany(comp). - يحلّ GQL محلّ منطق الربط المعقّد باستخدام أسهم العلاقات البديهية التي يمكن قراءتها والمكتوبة بأسلوب ASCII-art
()->[]->()، ما يجعل كتابة طلبات البحث المتعددة الخطوات وتحسينها أمرًا بسيطًا للغاية. -
RETURN: تعرض هذه السمة الخصائص أو مسار JSON من العناصر المطابِقة.
2. فلترة نتائج طلب بحث GQL
الآن، لنفلتر طلب البحث حتى نلقي نظرة فقط على مسار الحاوية المستهدَفة المخترَقة MV-CAPYBARA-003.
- ألصِق الاستعلام التالي في محرّر SQL وانقر على تشغيل:
SELECT * FROM GRAPH_TABLE( `lost_cargo_dataset.logistics_network` MATCH p = (m:Manifest {shipment_id: 'MV-CAPYBARA-003'})-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company) RETURN TO_JSON(p) AS path ); - انقر على علامة التبويب الرسم البياني ضمن النتائج.

- لا يعرض المشاهد الآن سوى مسار التجوال النشط لـ
MV-CAPYBARA-003. كبِّر الخريطة لعرض العُقد وعمليات الربط:- انقر نقرًا مزدوجًا على العقدة
Companyلفتح لوحة الخصائص. ضمن الخصائص، سيظهر لك عامل التشغيلcompany_id:103(Davy Jones Shipping). دوِّن معرّف الشركة هذا، لأنّك ستحتاج إليه لاحقًا لاسترداد رمز المرور الخاص بالتصريح من سجلّ الأمان. - انقر مرّتين على العقدة
Vesselللتأكّد من أنّهاFlying Dutchman.
- انقر نقرًا مزدوجًا على العقدة
6. الدردشة مع الرسم البياني باستخدام Conversational Analytics
بعد أن أرسلت طلب بحث إلى الرسم البياني يدويًا للعثور على معرّف الشركة، لنستخدِم الآن ميزة "الإحصاءات الحوارية" للدردشة مباشرةً مع الرسم البياني وتحديد المكان الذي يتّجه إليه الحاوي.
1. بدء جلسة Conversational Analytics
- في Google Cloud Console، انتقِل إلى وحدة تحكّم BigQuery، ووسِّع لوحة الموارد للعثور على مجموعة البيانات (
lost_cargo_dataset). - انقر على مرجع "الرسم البياني للمواقع":
logistics_network. - في شريط أدوات لوحة التفاصيل في أعلى الصفحة، انقر على الزر المحادثة. يؤدي ذلك إلى فتح جلسة Conversational Analytics محمَّلة مسبقًا بسياق الرسم البياني.

2. تحديد أقرب ميناء ترسو فيه الحاوية المختطَفة
رصدت طائرة دورية بحرية للتو سفينة تطابق وصف سفينة الشحن التابعة لنا وهي تبحر خارج نطاق الشبكة (مع إيقاف تشغيل جهاز الإرسال والاستقبال) عند الإحداثيات POINT(-122.48 37.55). لاعتراض الشحنة، علينا العثور على أقرب ميناء رسو تعمل فيه عصابة الظل Davy Jones Shipping.
بدلاً من البحث يدويًا في جميع الموانئ العالمية، سنطلب من شبكة الرسم البياني استرداد الموانئ المرتبطة بأسطول النقابة النشط وقياس أقربها جغرافيًا إلى مكان الرصد.
- في مربّع المحادثة في "الإحصاءات الحوارية"، أدخِل الطلب التالي:
Find all ports associated with Davy Jones Shipping vessels. Which port is closest to coordinate POINT(-122.48 37.55), show the distance in km, and display it on a map.

- ألقِ نظرة فاحصة على الردّ. يتنقّل الوكيل في الرسم البياني ويعرض أقرب محطة إرساء والمسافة إليها:
- منفذ توصيل:
Mountain View Terminal - المسافة:
39.42 kilometers
- منفذ توصيل:
- بما أنّ ميزة "إحصاءات حوارية" تستند إلى Gemini مع دمج جغرافي مكاني (GIS) أصلي، يمكنها تفسير نقاط الإحداثيات الجغرافية والاستفادة من معلوماتها حول العالم للتحقّق من الموقع الجغرافي:"تبعد السفينة حوالي 39.42 كيلومترًا عن محطة Mountain View في كاليفورنيا، ما يشير إلى أنّها تتّجه إلى هناك للرسو".
هذا يؤكّد أنّ شحنتنا متّجهة مباشرةً إلى Mountain View.
التفاصيل الفنية: لغة طلبات الرسم البياني (GQL) ونظام المعلومات الجغرافية (GIS) المكانية
في الخلفية، جمع وكيل "التحليلات الحوارية" ونفّذ بشكل ديناميكي طلب بحث يجمع بين مطابقة مسار الرسم البياني واحتساب المسافة الجغرافية المكانية. ويتم ذلك باستخدام عبارة GQL COLUMNS أصلية، مع احتساب المسافة الجيوديسية بشكل أصلي داخل مطابقة اجتياز الرسم البياني:
SELECT port_id, port_name, country, latitude, longitude, distance_km
FROM GRAPH_TABLE(
`lost_cargo_dataset.logistics_network`
MATCH (c:Company)<-[]-(v:Vessel)-[]->(p:Port)
WHERE LOWER(c.company_name) = 'davy jones shipping'
COLUMNS (
p.port_id,
p.port_name,
p.country,
p.latitude,
p.longitude,
ROUND(ST_DISTANCE(ST_GEOGPOINT(p.longitude, p.latitude), ST_GEOGPOINT(-122.48, 37.55)) / 1000, 2) AS distance_km
)
)
ORDER BY distance_km ASC;
من خلال الجمع بين وظائف المعلومات الجغرافية المكانية (GIS) الأصلية (ST_DISTANCE وST_GEOGPOINT) ومطابقة الرسم البياني للخصائص في GQL، يحلّ BigQuery بشكلٍ ديناميكي البصمة التشغيلية للمجموعة ويحسب القرب الفعلي في العالم الحقيقي في طلب بحث واحد.
7. العثور على البيانات المفقودة باستخدام "كتالوج المعارف"
يعرض الرسم البياني للعناصر العلاقات، ولكنّه لا يحتوي على الجدول الذي يتم فيه تخزين رموز التجاوز الفعلية.
في بيئة مؤسسة حقيقية تضم مئات من مجموعات البيانات والجداول، قد يكون العثور على هذه المعلومات أمرًا صعبًا. سنستخدم كتالوج المعرفة لإجراء بحث دلالي وتحديد موقع الجدول الصحيح.
1. البحث الدلالي في "كتالوج المعارف"
- في Google Cloud Console، ابحث عن Knowledge Catalog وانتقِل إليه ➔ بحث.
- في عمود فلتر البحث ضمن الأنظمة، ضَع علامة في المربّع بجانب BigQuery لتضييق نطاق النتائج.
- في مربّع البحث، أدخِل طلب البحث التالي:
container override codes

- انقر على مصدر الجدول
maritime_security_registryالذي يظهر في نتائج البحث:
عند فحص مخطط بيانات التعريف، سيظهر لك أنّ الجدول يتضمّن أعمدة لبيانات أمان الحاوية، مثل الشركة المنسّقة co_id ورمز الحماية cust_tok، والأهم من ذلك، عمود رمز المرور لتجاوز الحاوية الآمنة: clc_ovr_cd.
لقد عثرنا بنجاح على الجدول والعمود الآمن الذي نحتاج إليه لاسترداد حمولتنا.
🔓 الإدارة في بيئة فعلية: في بيئة المؤسسة الإنتاجية، تستفيد فِرق الأمان والإدارة أيضًا من:
- الجوانب ونماذج العلامات: لربط البيانات الوصفية للنشاط التجاري (مثل مالك البيانات أو فترة التخزين أو تصنيف معلومات تكشف الهوية الشخصية) بمخططات الجداول
- مصدر البيانات: لإنشاء مخططات انسيابية مرئية تلقائيًا تمثّل طريقة طلب البيانات من جداول مثل
maritime_security_registryواستخدامها من قِبل الأنظمة النهائية
2. فحص أمان الأعمدة في BigQuery
- انتقِل مجددًا إلى وحدة تحكّم BigQuery.
- في علامة التبويب المستكشف، انقر على
lost_cargo_datasetثمّ على جدولmaritime_security_registry. - انقر على علامة التبويب المخطط.

- لاحظ أنّ العمود
clc_ovr_cdمحمي بعلامة سياسة باسمMaskShippingDetails(مُدرَجة في عمود "علامات السياسة"). - افتح علامة تبويب جديدة في "أداة تعديل SQL" في BigQuery وحاوِل عرض رموز إلغاء التسجيل من خلال تنفيذ طلب البحث التالي:
SELECT * FROM `lost_cargo_dataset.maritime_security_registry` WHERE co_id = 103; - بما أنّ حسابك لا يملك بعد أذونات قراءة الأعمدة التي تمّت الإشارة إليها بالعلامة
MaskShippingDetails، سيتعذّر تنفيذ طلب البحث على الفور وسيظهر خطأ أمان قاعدة البيانات Access Denied:

8. اختراق أمان العمود لاسترداد رمز المرور
لقراءة رمز التجاوز النهائي بنص عادي، يجب منح حساب المستخدم إذن قراءة الأعمدة التي تمّت الإشارة إليها باستخدام MaskShippingDetails.
1. أذونات علامات سياسة المنح
- في لوحة التنقّل اليمنى في وحدة تحكّم BigQuery، انتقِل إلى علامات السياسة.
- اختَر التصنيف المسمّى
LostCargoSecurity_. - في قائمة العلامات، انقر على
MaskShippingDetails. - في لوحة المعلومات على يسار الشاشة، انقر على إضافة مدير. (إذا كانت اللوحة مخفية، انقر على إظهار لوحة المعلومات في أعلى يسار الصفحة).
- في حقل الجهات الرئيسية الجديدة، أدخِل عنوان البريد الإلكتروني النشط لمستخدم Google Cloud.
- في القائمة المنسدلة اختيار دور، ابحث عن قارئ دقيق واختَره، ثم انقر على حفظ.

2. طلب البحث عن رمز التجاوز
ارجِع إلى محرِّر مساحة عمل BigQuery. بما أنّه يمكنك الآن الوصول إلى بيانات القارئ بشكل دقيق، من المفترض أن نتمكّن من تنفيذ طلب البحث مرة أخرى والاطّلاع على البيانات غير المحجوبة:
SELECT * FROM `lost_cargo_dataset.maritime_security_registry`
WHERE co_id = 103;
🔓 النتيجة
يعرض طلب البحث رمز التجاوز غير المخفي:
SHIVER-ME-TIMBERS-888

9- تَنظيم
لتجنُّب تحمّل رسوم، عليك تنظيف موارد وضع الحماية التي تم إنشاؤها أثناء هذا الدرس العملي.
ارجع إلى "وحدة طرفية Cloud Shell" واحذف مجموعة بيانات BigQuery التي تحتوي على جداول الخدمات اللوجستية:
bq rm -r -f -d lost_cargo_dataset
أزِل ملفات المستودع المستنسخ:
cd ..
rm -rf data-cloud-roadshow-26
10. تهانينا
لقد حللت التحقيق بنجاح واسترددت رمز تجاوز الإذن.
ما تعلّمته
- كيفية إنشاء رسم بياني للعلاقات في BigQuery لتمثيل الكيانات والعلاقات المعقّدة
- كيفية ضبط العُقد والحواف والسمات والتصنيفات لتسجيل عمليات ربط البيانات
- كيفية طلب البحث عن الرسومات البيانية للعناصر باستخدام اللغة العادية من خلال Conversational Analytics في BigQuery
- طريقة تنظيم تعبيرات لغة طلبات الرسم البياني (GQL) لتتبُّع المسارات العلائقية
- كيفية استكشاف مواد العرض الآمنة باستخدام كتالوج المعرفة والوصول إلى البيانات المحظورة على مستوى العمود باستخدام علامات السياسة