دعم وتوافق Azure Cosmos DB للرسم البياني Gremlin مع ميزات TinkerPop

ينطبق على: العفريت

يدعم Azure Cosmos DB لغة اجتياز الرسم البياني Apache Tinkerpop والمعروفة باسم Gremlin. ويمكنك استخدام لغة Gremlin لإنشاء كيانات الرسم البياني (الرؤوس والحواف)، وتعديل الخصائص داخل تلك الكيانات، وإجراء الاستعلامات والاجتياز، وحذف الكيانات.

ويتبع محرك Azure Cosmos DB Graph مواصفات خطوات اجتياز Apache TinkerPop ولكن توجد اختلافات في التنفيذ خاصة بـ Azure Cosmos DB. في هذه المقالة، نقدم معاينة سريعة ل Gremlin ونعد ميزات Gremlin التي تدعمها واجهة برمجة التطبيقات ل Gremlin.

مكتبات العملاء المتوافقة

يعرض الجدول التالي برامج تشغيل Gremlin الشائعة التي يمكنك استخدامها مع Azure Cosmos DB:

تنزيل المصدر الشروع في العمل إصدار موصل مدعوم/مستحسن
.NET Gremlin.NET on GitHub إنشاء رسم بياني باستخدام .NET 3.4.13
Java Gremlin JavaDoc إنشاء رسم بياني باستخدام Java 3.4.13
Python Gremlin-Python on GitHub إنشاء رسم بياني باستخدام Python 3.4.13
Gremlin console TinkerPop docs إنشاء رسم بياني باستخدام وحدة تحكم Gremlin 3.4.13
Node.js Gremlin-JavaScript on GitHub إنشاء رسم بياني باستخدام Node.js 3.4.13
PHP Gremlin-PHP on GitHub إنشاء رسم بياني باستخدام PHP 3.1.0
Go Lang Go Lang تم بناء هذه المكتبة من قبل مساهمين خارجيين. لا يقدم فريق Azure Cosmos DB أي دعم أو صيانة للمكتبة.

ملاحظة

تحتوي إصدارات برنامج تشغيل عميل Gremlin لـ 3.5.*، 3.6.* على مشكلات توافق معروفة، لذلك نوصي باستخدام أحدث إصدارات برنامج التشغيل المدعومة 3.4.* المذكورة أعلاه. سيتم تحديث هذا الجدول عند معالجة مشكلات التوافق لإصدارات برنامج التشغيل الأحدث هذه.

عناصر الرسم البياني المدعمة

يعد TinkerPop معيار يغطي مجموعة واسعة من تقنيات الرسم البياني. ولذلك، لديه مصطلحات قياسية لوصف الميزات التي يوفرها موفر الرسم البياني. يوفر Azure Cosmos DB قاعدة بيانات رسم بياني ثابتة ومتزامنة عالية وقابلة للكتابة يمكن تقسيمها عبر خوادم أو مجموعات متعددة.

يسرد الجدول التالي ميزات TinkerPop التي يتم تنفيذها بواسطة Azure Cosmos DB:

الفئة تنفيذ Azure Cosmos DB ملاحظات
ميزات الرسم البياني يوفر الثبات والوصول المتزامن. مصممة لدعم المعاملات يمكن تنفيذ أساليب الكمبيوتر عبر موصل Spark.
ميزات متغيرة يدعم منطقي، عدد صحيح، بايت، مزدوج، عائم، طويل، سلسلة يدعم الأنواع البدائية، ومتوافق مع الأنواع المعقدة عبر نموذج البيانات
ميزات الرأس يدعم RemoveVertices، وMetaProperties، وAddVertices، وMultiProperties، وStringIds، وUserSuppliedIds، وAddProperty، وRemoveProperty يدعم إنشاء الرؤوس وتعديلها وحذفها
ميزات خصائص الرأس StringIds، وUserSuppliedIds، وAddProperty، وRemoveProperty، وBooleanValues، وByteValues، وDoubleValues، وFloatValues، وIntegerValues، وLongValues، وStringValues يدعم إنشاء خصائص الرأس وتعديلها وحذفها
ميزات الحواف AddEdges، وRemoveEdges، وStringIds، وUserSuppliedIds، وAddProperty، وRemoveProperty يدعم إنشاء الحواف وتعديلها وحذفها
ميزات خصائص الحواف Properties، وBooleanValues، وByteValues، وDoubleValues، وFloatValues، وIntegerValues، وLongValues، وStringValues يدعم إنشاء خصائص الحواف وتعديلها وحذفها

تنسيق مخطط Gremlin

يستخدم Azure Cosmos DB تنسيق JSON عند عرض النتائج من عمليات Gremlin. ويدعم Azure Cosmos DB حالياً تنسيق JSON. على سبيل المثال، يعرض الجزء التالي تمثيل JSON لرأس تم إرجاعه إلى العميل من Azure Cosmos DB:

  {
    "id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
    "label": "person",
    "type": "vertex",
    "outE": {
      "knows": [
        {
          "id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
          "inV": "04779300-1c8e-489d-9493-50fd1325a658"
        },
        {
          "id": "21984248-ee9e-43a8-a7f6-30642bc14609",
          "inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
        }
      ]
    },
    "properties": {
      "firstName": [
        {
          "value": "Thomas"
        }
      ],
      "lastName": [
        {
          "value": "Andersen"
        }
      ],
      "age": [
        {
          "value": 45
        }
      ]
    }
  }

يتم وصف الخصائص المستخدمة بواسطة تنسيق JSON للرؤوس أدناه:

الخاصية الوصف
id معرّف الرأس. يجب أن يكون فريداً (مع قيمة _partition إن أمكن). وإذا لم يتم توفير أي قيمة، فسيتم تزويدها تلقائياً بمعرف GUID
label تسمية الرأس. تُستخدم هذه الخاصية لوصف نوع الكيان.
type وتُستخدم لتمييز الرؤوس عن المستندات غير الرسومية
properties مجموعة من الخصائص المُعرفة من قبل المستخدم المقترنة بالرأس. يمكن أن تمتلك كل خاصية قيم متعددة.
_partition مفتاح تقسيم الرأس. يُستخدم في تقسيم الرسم البياني.
outE تحتوي هذه الخاصية على قائمة بالحواف الخارجية من الرأس. يسمح تخزين المعلومات المتجاورة من خلال الرأس بتنفيذ سريع لعمليات الاجتياز. يتم تجميع الحواف بناءً على تسمياتها.

يمكن لكل خاصية تخزين قيم متعددة داخل صفيف.

الخاصية الوصف
value قيمة الخاصية

وتحتوي الحافة على المعلومات التالية للمساعدة في التنقل إلى أجزاء أخرى من الرسم البياني.

الخاصية الوصف
id معرّف الحافة. يجب أن يكون فريداً (مع قيمة _partition إن أمكن)
label تسمية الحافة. تعد هذه الخاصية اختيارية وتُستخدم لوصف نوع العلاقة.
inV وتحتوي هذه الخاصية على قائمة بالرؤوس للحافة. يسمح تخزين المعلومات المتجاورة من خلال الحافة بتنفيذ سريع لعمليات الاجتياز. يتم تجميع الرؤوس بناءً على تسمياتها.
properties مجموعة من الخصائص المُعرفة من قبل المستخدم المقترنة بالحافة.

خطوات Gremlin

لنلقي نظرة الآن على خطوات Gremlin التي يدعمها Azure Cosmos DB. للحصول على مرجع كامل عن Gremlin، راجع مرجع TinkerPop.

الخطوة الوصف وثائق TinkerPop 3.2
addE تضيف حافة بين رأسين addE step
addV تضيف رأس للرسم البياني addV step
and تضمن أن جميع عمليات الاجتياز تُرجع قيمة and step
as معدل الخطوة لتخصيص متغير لمخرج الخطوة as step
by معدل خطوة يُستخدم مع group وorder by step
coalesce تُرجع أول عملية اجتياز تُرجع نتيجة coalesce step
constant تُرجع قيمة ثابتة. يُستخدم مع coalesce constant step
count تُرجع العدد من الاجتياز count step
dedup تُرجع القيم مع إزالة التكرارات dedup step
drop يضع القيم (رأس/حافة) drop step
executionProfile تنشئ وصفاً لجميع العمليات التي تم إنشاؤها بواسطة خطوة Gremlin المنفذة executionProfile step
fold تعمل كحاجز يحسب مجموع النتائج fold step
group تجمع القيم بناءً على التسميات المحددة group step
has تُستخدم لتصفية الخصائص والرؤوس والحواف. تدعم المتغيرات hasLabel وhasId وhasNot وhas. has step
inject تُدخل القيم في الدفق inject step
is تُستخدم لإجراء تصفية باستخدام تعبير منطقي is step
limit تُستخدم لتحديد عدد العناصر في الاجتياز limit step
local تُضمن مقطعاً من عملية الاجتياز محلياً، مثل طلب بحث فرعي local step
not تُستخدم لإنتاج رفض عامل التصفية not step
optional تُرجع نتيجة الاجتياز المحدد إذا أسفرت عن نتيجة، وإلا فإنها تُرجع العنصر المستدعي optional step
or تضمن إرجاع قيمة واحدة على الأقل من عمليات الاجتياز or step
order تُرجع النتائج بترتيب الفرز المحدد order step
path تُرجع المسار الكامل للاجتياز path step
project تعرض الخصائص كخريطة project step
properties تُرجع خصائص التسميات المحددة properties step
range تقوم بالتصفية حتى تصل إلى نطاق محدد من القيم range step
repeat تُكرر الخطوة لعدد معين من المرات. وتستخدم للتكرار repeat step
sample تُستخدم لأخذ عينات من النتائج من الاجتياز sample step
select تُستخدم لعرض عينات من النتائج من الاجتياز select step
store تُستخدم للتجمعات التي لا تمنع الاجتياز store step
TextP.startingWith(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية مع بداية سلسلة معينة TextP predicates
TextP.endingWith(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية مع نهاية سلسلة معينة TextP predicates
TextP.containing(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية مع محتوى سلسلة معينة TextP predicates
TextP.notStartingWith(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية لا تبدأ بسلسلة معينة TextP predicates
TextP.notEndingWith(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية لا تنتهي بسلسلة معينة TextP predicates
TextP.notContaining(string) وظيفة تصفية السلسلة. تُستخدم هذه الوظيفة كتخمين للخطوة has() لمطابقة خاصية لا تحتوي على سلسلة معينة TextP predicates
tree تجمع المسارات من رأس إلى شجرة tree step
unfold تفك المكرر كخطوة unfold step
union تدمج النتائج من عمليات الاجتياز المتعددة union step
V تتضمن الخطوات اللازمة لعمليات اجتياز بين الرؤوس والحواف V، وE، وout، وin، وboth، وoutE، وinE، وbothE، وoutV، وinV، وbothV، وotherV لـ vertex steps
where تُستخدم لتصفية عينات من النتائج من الاجتياز. تدعم عوامل التشغيل eq، وneq، وlt، وlte، وgt، وgte، وbetween where step

يدعم المحرك المحسن للكتابة الذي يوفره Azure Cosmos DB الفهرسة التلقائية لجميع الخصائص داخل الرؤوس والحواف بشكل افتراضي. ولذلك، تتم معالجة الاستعلامات ذات عوامل التصفية أو استعلامات النطاق أو الفرز أو التجميعات على أي خاصية من الفهرس، ويتم تقديمها بكفاءة. ولمزيد من المعلومات حول كيفية عمل الفهرسة في Azure Cosmos DB، اطلع على مقالتنا حول الفهرسة الحيادية للمخطط.

اختلافات السلوك

  • يشغل محرك Azure Cosmos DB Graph اجتياز البحث المتسع أولاً بينما يعمل TinkerPop Gremlin على اجتياز البحث المتعمق الأول. يحقق هذا السلوك أداء أفضل في نظام قابل للتطوير أفقيا مثل Azure Cosmos DB.

ميزات غير معتمدة

  • Gremlin Bytecode هي مواصفات حيادية للغة البرمجة لعمليات اجتياز الرسم البياني. لا يدعمه Azure Cosmos DB Graph حتى الآن. استخدم GremlinClient.SubmitAsync() وقم بتمرير الاجتياز كسلسلة نصية.

  • مجموعة العلاقات الأساسية property(set, 'xyz', 1) غير مدعمة حالياً. استخدم property(list, 'xyz', 1) بدلاً من ذلك. لمعرفة المزيد، اطلع على خصائص Vertex مع TinkerPop.

  • الخطوة match() غير متاحة حالياً. توفر هذه الخطوة إمكانات الاستعلام الإلزامي.

  • الكائنات كخصائص على الرؤوس أو الحواف غير مدعومة. يمكن أن تكون الخصائص عبارة عن صفيفات أو أنواعاً بدائية فقط.

  • الفرز حسب خصائص الصفيفorder().by(<array property>) غير مدعوم. الفرز مدعم فقط من قبل الأنواع البدائية.

  • أنواع JSON غير البدائية غير مدعومة. استخدم أنواع string أو number أو true/false. قيم null غير مدعمة.

  • المحول المتسلسل GraphSONv3 غير مدعوم حالياً. استخدم فئات المحول التسلسلي والقارئ والكاتب لـ GraphSONv2 في تكوين الاتصال. لا تحتوي النتائج التي تم إرجاعها بواسطة Azure Cosmos DB ل Gremlin على نفس تنسيق تنسيق GraphSON.

  • وظائف وتعبيرات Lambda غير مدعمة حالياً. يتضمن ذلك الوظائف .map{<expression>} و.by{<expression>} و.filter{<expression>}. لمعرفة المزيد، ولمعرفة كيفية إعادة كتابتها باستخدام خطوات Gremlin، اطلع على الملاحظات حول Lambdas.

  • العمليات غير مدعومة بسبب الطبيعة الموزعة للنظام. قم بتكوين نموذج تناسق مناسب على حساب Gremlin "لقراءة كتاباتك" واستخدام التزامن المعزز بحماية التغييرات لحل عمليات الكتابة المتضاربة.

القيود المعروفة

  • استخدام الفهرس لاستعلامات Gremlin ذات خطوات .V() متوسطة الاجتياز: في الوقت الحالي، سيتم استخدام أول استدعاء .V() فقط من الفهرس لحل أي عوامل تصفية أو تخمينات مرتبطة به. ولن تراجع المكالمات اللاحقة الفهرس، مما قد يزيد من وقت الاستجابة وتكلفة الاستعلام.

بافتراض استخدام الفهرسة الافتراضية، فإن استعلام Gremlin للقراءة النموذجي الذي يبدأ بالخطوة .V() قد يستخدم المعلمات في خطوات التصفية المرفقة، مثل .has() أو .where() لتحسين تكلفة وأداء الاستعلام. على سبيل المثال:

g.V().has('category', 'A')

ولكن عند تضمين أكثر من خطوة .V() واحدة في استعلام Gremlin، فقد لا تكون دقة بيانات الاستعلام هي الأمثل. اتخذ الاستعلام التالي كمثال:

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

سيعيد هذا الاستعلام مجموعتين من الرؤوس بناءً على خاصية تسمى category. في هذه الحالة، فإن الاستدعاء الأول فقط سوف يستخدم g.V().has('category', 'A') الفهرس لحل الرؤوس بناءً على قيم خصائصها.

ويتمثل الحل البديل لهذا الاستعلام في استخدام الخطوات الفرعية مثل .map() وunion(). ويوضح ذلك أدناه:

// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')

// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))

يمكنك مراجعة أداء الاستعلامات باستخدام خطوة executionProfile() Gremlin.

الخطوات التالية