دعم وتوافق 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.
الخطوات التالية
- البدء في إنشاء تطبيق الرسم البياني باستخدام حزم SDK
- تعرّف على المزيد حول دعم الرسم البياني في Azure Cosmos DB