Neomodel Python OGM: الغوص العميق في نمذجة Neo4j

آخر تحديث: 12/06/2025
نبذة عن الكاتب: ج مصدر تريل
  • Neomodel هو Pythonic OGM لـ Neo4j، حيث يوفر نماذج تعتمد على الفئة، وفرض المخطط، وواجهة برمجة تطبيقات استعلام غنية أعلى برنامج التشغيل الرسمي.
  • تتبع الإصدارات الحالية SemVer، وتدعم إصدارات Python وNeo4j الحديثة، وتقدم عمليات فحص أكثر صرامة للعناصر الأساسية، وتكوينًا أفضل، وضوابط دمج الدفعات.
  • توفر المكتبة واجهات برمجة التطبيقات المتزامنة وغير المتزامنة، وأدوات المخطط التلقائية، وتكامل Django، وفتحة هروب مرنة إلى Cypher الخام للاستعلامات المعقدة.
  • تعد neomodel الآن جزءًا من مختبرات Neo4j، وتستفيد من الصيانة النشطة واختبارات التكامل وردود الفعل الإنتاجية في العالم الحقيقي من عمليات النشر في المؤسسات.

نيوموديل بايثون أو جي إم

Neomodel هو أداة ربط كائنات الرسوم البيانية (OGM) بلغة بايثون، مصممة لجعل العمل مع Neo4j سلسًا وبديهيًا ككتابة أكواد بايثون عادية. فبدلًا من كتابة استعلامات Cypher يدويًا في كل مرة، يمكنك وصف نطاق الرسم البياني الخاص بك باستخدام الفئات والحقول والعلاقات، ودع Neomodel يتولى عملية الربط بين كائنات بايثون وعُقد وعلاقات Neo4j. يعتمد Neomodel على برنامج تشغيل Neo4j الرسمي لبايثون، مع طبقة تجريد بسيطة، مما يوفر لك سهولة استخدام عالية دون التضحية بالأداء.

كجزء من نظام Neo4j Labs البيئي، يتم صيانة neomodel بشكل نشط، ويدعم بشكل كامل إصدارات Python وNeo4j الحديثة، ويقدم واجهات برمجة تطبيقات متزامنة وغير متزامنة. إنه يوفر تعريفات نموذجية مألوفة تشبه Django، وواجهة برمجة تطبيقات استعلام غنية، وتطبيق المخطط عبر الكاردينالية، والمعاملات المضمنة، والتكامل الوثيق مع Django من خلال django_neomodelوفي الوقت نفسه، يظل قريبًا من المعدن: يمكنك دائمًا الرجوع إلى Cypher الخام عندما يتطلب الأداء أو تعقيد الاستعلام ذلك.

ما هو النيومودل ولماذا هو مهم

Neomodel هو برنامج لإنشاء كائنات رسم بياني لقاعدة بيانات الرسم البياني Neo4j، وهو يربط بين فئات Python وهياكل الرسم البياني. بدلاً من إنشاء العقد والعلاقات يدويًا باستخدام سلاسل Cypher، يمكنك تعريف فئات Python التي تمثل كيانات نطاقك، ويحولها neomodel إلى عقد مُسمّاة بخصائص وقيود مُفهرسة في Neo4j. وهو يعتمد على الإصدار الرسمي neo4j-python-driver، وبالتالي فإن سلوكه يتوافق مع ما ستفعله باستخدام برنامج التشغيل مباشرةً.

تركز المكتبة على أسلوب نمذجة مألوف قائم على الأصناف، مع وراثة قوية، وخطافات، وآليات تحقق. هذا النهج يجعلها مريحة للغاية للمطورين المعتادين على Django ORM أو غيرها من أنظمة إدارة الكائنات العلائقية في بايثون: تتوافق سمات أصناف النموذج مع خصائص Neo4j، بينما تلتقط حقول العلاقات الخاصة حواف الرسم البياني. مع هذا الإعداد، يصبح اجتياز الرسم البياني مسألة تتبع سمات الكائنات بدلاً من كتابة أكواد Cypher مطولة في كل مرة.

تحت الغطاء، يوفر neomodel واجهة برمجة تطبيقات استعلام قوية تغطي أنماط الوصول إلى الرسم البياني الشائعة دون إجبارك على استخدام Cypher الخام على الفور. يمكنك تصفية وترتيب واجتياز العلاقات وتقسيم مجموعات العقد وإجراء عمليات متقدمة من خلال واجهة بايثون. عند الحاجة، لا يزال بإمكانك الوصول إلى cypher_query مساعد لتنفيذ الاستعلامات المخصصة والعمل مع النتائج المرتجعة بشكل مباشر.

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

يدعم Neomodel العمليات المعاملاتية بشكل كامل، وهو آمن للاستخدام في بيئات متعددة الخيوط. يمكن فتح المعاملات وإتمامها بطريقة متوقعة، ولأن الطبقة الوسيطة حول برنامج التشغيل الرسمي بسيطة عمدًا، فإن تأثيرها على الأداء ضئيل. تُظهر الاختبارات المعيارية باستخدام أدوات مثل Locust أن طبقة التجريد في Neomodel تضيف زمن استجابة ضئيلًا، حتى في ظل الأحمال المتزامنة.

دعم الإصدار، SemVer والتكوين

تتبع إصدارات Neomodel الحديثة الترقيم الدلالي (SemVer) باستخدام نمط الإصدار الرئيسي.الثانوي.التصحيحي الكلاسيكي. وهذا يعني أن التغييرات الجذرية لا تُضاف إلا مع ترقيات الإصدار الرئيسي، بينما تُضاف الميزات الجديدة التي لا تُسبب أي تغييرات جذرية مع الإصدارات الثانوية، وتُصدر إصلاحات الأخطاء مع إصدارات التصحيح. تُسهّل استراتيجية الترقيم هذه تخطيط الترقيات، خاصةً لأنظمة الإنتاج.

في سلسلة الإصدارات 6.x، يستهدف neomodel أحدث إصدارات Python وNeo4j ليتوافق مع ما تستخدمه معظم التطبيقات الاحترافية. تحديدًا، يتطلب neomodel 6.x الإصدار Python 3.10 أو أحدث، ويدعم Neo4j 5.x وNeo4j 4.4 LTS والإصدار الأحدث Neo4j 2025.xx. يدعم neomodel كلاً من Neo4j Community وNeo4j Enterprise وNeo4j Aura (الخدمة المستضافة)، مما يمنحك مرونة في كيفية ومكان استضافة قاعدة البيانات.

بالنسبة للبيئات القديمة، لا تزال فروع neomodel السابقة تدعم إصدارات Python وNeo4j القديمة. يدعم الإصدار 5.x من neomodel إصدارات Python 3.8 والإصدارات الأحدث مع Neo4j 5.x و4.4 (إصدار الدعم طويل الأمد)، بينما يدعم الإصدار 4.x إصدارات Python من 3.7 إلى 3.10 مع Neo4j 4.x، بما في ذلك 4.4 (إصدار الدعم طويل الأمد) عند استخدام neomodel 4.0.10. تتيح هذه الميزة التوافقية إمكانية الترقية التدريجية مع الحفاظ على تشغيل إعداداتك الحالية.

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

يقدم الإصدار 6.0 أيضًا تغييرات صريحة وإصلاحات سلوكية لجعل واجهة برمجة التطبيقات أكثر قابلية للتنبؤ. على سبيل المثال، يقوم حل القائمة من Cypher الآن بإرجاع العمق المتوقع: استعلام مثل RETURN collect(node) سيتم رسم الخريطة إلى results[0][0] بدلا من السابق، غير بديهي results[0][0][0] الهيكل. أصبحت عمليات التحقق من الكاردينالية أكثر صرامة وتم تمكينها افتراضيًا، وتم نقل العديد من وظائف المساعدة المستقلة إلى المركز Database() و AsyncDatabase() فئات فردية.

التثبيت والإعداد

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

قبل تشغيل أي كود neomodel، يجب عليك تكوين عنوان URL للاتصال حتى تعرف المكتبة كيفية الوصول إلى مثيل Neo4j الخاص بك. يتضمن هذا الإعداد عادةً المخطط (Bolt أو Neo4j)، والمضيف، والمنفذ، واسم المستخدم، وكلمة المرور، واسم قاعدة البيانات الاختياري. بالنسبة لمشاريع Django، عادةً ما يُوضع هذا التكوين في settings.py لذلك يتم تهيئته بمجرد بدء التطبيق.

إذا تم تثبيت خادم Neo4j الخاص بك حديثًا، فيجب عليك تغيير كلمة المرور الافتراضية باستخدام متصفح Neo4j أو لوحة الإدارة. بشكل افتراضي، يمكن الوصول إلى هذه اللوحة في http://localhost:7474. بمجرد تحديث كلمة المرور والتأكيد dbms.security.auth_enabled=true في تكوين قاعدة البيانات، أنت جاهز للاتصال من neomodel.

من أجل التطوير والاختبار، من الشائع استخدام قواعد بيانات Neo4j منفصلة وبيانات اعتماد مخصصة. تتوقع مجموعة اختبارات Neomodel قاعدة بيانات Neo4j 4+‎ وتعتمد على متغيرات بيئة محددة للاتصال. إذا أجريت الاختبارات على قاعدة بيانات جديدة، فستضبط مجموعة الاختبارات كلمة المرور على test بشكل افتراضي؛ إذا اكتشف وجود مجموعة بيانات موجودة، فسوف يرفض الاستمرار ما لم تمرر صراحةً علامة إعادة تعيين، مما يساعدك على تجنب فقدان البيانات عن طريق الخطأ.

عند الرغبة في اختبار Neomodel على إصدارات متعددة من Python وNeo4j، يُمكن لـ Docker وdocker-compose إدارة كل شيء تلقائيًا. يوفر المشروع إعدادات لإنشاء مصفوفة من إصدارات المفسر وإصدارات Neo4j، ما يسمح بتنفيذ اختبارات التكامل بشكل متسق. يُعد هذا مفيدًا للغاية عند المساهمة بميزات يجب أن تعمل على عدة إصدارات مدعومة.

الميزات الأساسية: النماذج والمخططات والمؤشرات

يتمثل جوهر Neomodel في تعريفات النموذج المستندة إلى الفئة والتي تتوافق مباشرة مع علامات وعلاقات عقد Neo4j. عادةً ما تستمد فئات العقدة الخاصة بك من StructuredNode، وفئات العلاقة من StructuredRelيتم تعريف حقول العقد باستخدام أنواع خصائص خاصة بـ neomodel، والتي تتحكم في كيفية تخزين البيانات والتحقق من صحتها في Neo4j.

يُصبح كل نموذج فئةً مُعرّفًا في Neo4j، ويتولى neomodel إدارة الفهارس والقيود تلقائيًا بناءً على تعريفاتك. هذا يعني أنه يُمكن تحديد التفرد والخصائص المطلوبة والحقول المفهرسة باستخدام لغة Python دون الحاجة إلى كتابة أوامر Cypher يدويًا لإنشاء المخطط. في الخلفية، يُترجم neomodel بيانات تعريف النموذج إلى عمليات مخطط Neo4j المناسبة.

يتم ربط العلاقات بفئات العقد باستخدام أوصاف خاصة مثل RelationshipTo, RelationshipFromو Relationship. تعرف هذه الوصافات نوع العلاقة، وعدد العناصر، واتجاه العبور. RelationshipTo و RelationshipFrom التعبير عن التنقل أحادي الاتجاه من وجهة نظر بايثون، بينما Relationship يتم استخدامه عندما تريد معالجة العلاقة على أنها قابلة للملاحة في كلا الاتجاهين من الكود، على الرغم من أن Neo4j نفسه يخزن العلاقات دائمًا باتجاه.

عندما تكون العلاقات ثنائية الاتجاه منطقيًا، فإن الممارسة الموصى بها هي تجنب إنشاء حقلين معكوسين واستخدام حقل واحد Relationship بدلا من ذلك. يحافظ هذا على نموذجك نظيفًا ومتسقًا، مع السماح بالتنقل في كلا الاتجاهين في شيفرة بايثون. سيظل Neo4j يخزن علاقة موجهة، لكن تجريد neomodel يُخفي هذه التفاصيل عند التنقل.

بالنسبة للسيناريوهات التي لا تكون فيها هياكل العقد معروفة بالكامل مسبقًا، يقدم neomodel SemiStructuredNode الفئة الأساسية. يمكن للفئات المشتقة من هذا النوع الاحتفاظ بخصائص "مخصصة" لم تُعرّف صراحةً في النموذج. يُعد هذا مفيدًا بشكل خاص عندما يتطور مخطط الرسم البياني لديك باستمرار أو عندما تحتاج إلى إضافة سمات إضافية من حين لآخر دون الحاجة إلى إعادة هيكلة النموذج في كل مرة.

تُحدد قواعد عدد العلاقات المسموح بها بين العُقد، وهي مدعومة الآن بفحوصات أكثر صرامة في Neomodel 6. تتوفر فحوصات عدد العلاقات المرنة لجميع أنواع العلاقات، ويتم تفعيل الفحص الصارم افتراضيًا. إذا خالفت بياناتك قواعد العلاقات المُكوّنة، فسيكشف Neomodel عن هذه المشكلة بدلًا من السماح باستمرار بنية غير متناسقة دون تنبيه.

إدارة المخططات والتفتيش التلقائي

بمجرد تحديد نماذجك أو تحديثها، ستحتاج إلى تطبيق القيود والمؤشرات المقابلة على قاعدة بيانات Neo4j. يتم شحن Neomodel مع برنامج نصي يسمى neomodel_install_labels يقوم بمسح نماذجك وإنشاء أو تحديث الفهارس والقيود المطلوبة. بعد تعديل مخططك، يجب عليك تشغيل هذا البرنامج النصي ومراجعة عدد الفئات المعالجة المُبلغ عنها للتأكد من مزامنة كل شيء.

إذا كنت بحاجة إلى مسح القيود والمؤشرات التي يديرها neomodel، فهناك أمر تكميلي يسمى neomodel_remove_labels. يقوم هذا البرنامج النصي تلقائيًا بإلغاء جميع القيود والفهرسات الموجودة التي ثبّتها neomodel سابقًا. كما يطبع ما تم حذفه لتتمكن من رؤية تأثير العملية بوضوح.

يدعم كلا أمري إدارة المخطط --db الحجة والافتراضية إلى NEO4J_BOLT_URL متغير البيئة عندما لا يتم توفيره. يساعد هذا السلوك على إبقاء بيانات الاعتماد وتفاصيل الاتصال خارج سجل سطر الأوامر، ويُمكّن من تبسيط التكوين من خلال متغيرات البيئة. كما يُسهّل إدارة نصوص الأتمتة والنشر.

بالإضافة إلى إنشاء المخطط، يتضمن neomodel أداة فحص قاعدة البيانات التي يمكنها إجراء هندسة عكسية لرسم بياني موجود وإنشاء ملف نموذجي. باستخدام inspect باستخدام الأمر (الذي يتطلب إجراءات APOC المثبتة في Neo4j)، يمكنك مسح قاعدة البيانات وإنتاج models.py ملف تحت دليل هدف مثل yourappيتضمن الملف الناتج عمليات الاستيراد وتعريفات فئة العقدة وتعريفات العلاقة التي تتطابق مع بنية الرسم البياني المكتشفة.

يمكن ضبط عملية التفتيش للرسوم البيانية الكبيرة عن طريق تخطي خصائص العلاقة ومسح الكاردينالية. بالنسبة لقواعد البيانات التي تحتوي على مئات الآلاف من العقد وأكثر من مليون علاقة، قد يستغرق الفحص الكامل عشرات الثواني. خيارات مثل --no-rel-props و --no-rel-cardinality تسريع الأمور عن طريق حذف التحليل التفصيلي، مع الاستمرار في إنشاء حقول العلاقة ولكن تعيين الكاردينالية إلى قيمة عامة مثل ZeroOrMore.

العمل مع واجهة برمجة تطبيقات استعلام neomodel

تتيح لك واجهة برمجة تطبيقات الاستعلام الخاصة بـ Neomodel تنفيذ استعلامات بيانية غنية عبر طرق Python على فئات النموذج الخاصة بك بدلاً من كتابة Cypher مباشرةً. كل نموذج يعرض .nodes سمة شبيهة بخاصية المدير، تُمثل مجموعة من العقد مع التسمية المقابلة. من هناك، يمكنك عدّ بيانات الرسم البياني الأساسية وتصفيتها وترتيبها وتقسيمها وجلبها.

دعوة len(MyModel.nodes) يؤدي إلى تشغيل استعلام Cypher الذي يحسب العقد ذات العلامة المقابلة لـ MyModel. يُوفر هذا طريقة بديهية للحصول على الأعداد دون الحاجة لمغادرة بنية بايثون. إذا كانت مجموعة العقد لديك مُفلترة، فسيعكس العدد فقط العقد التي تُطابق تلك المرشحات، مُطابقًا السلوك المتوقع من مُعامل ORM نموذجي.

يتم دعم التقطيع بشكل مباشر على مجموعات العقد، وهو أمر مفيد للغاية عندما تريد العمل مع نتائج مجمعة. تعبيرات مثل MyModel.nodes[0:10] أرجع مجموعة عقد مُقسَّمة يمكنك تكرارها أو ربطها بسلسلة أخرى باستخدام مرشحات إضافية. لا تُرجع الشريحة قائمة خام فورًا، بل كائن مجموعة عقد آخر، ما يُتيح لك بناء استعلامات مُعقَّدة تدريجيًا.

تدعم مجموعات العقد عمليات التحقق من التكرار والقيم المنطقية، على الرغم من أن عمليات الطول والحقيقة نهائية. بمجرد تقييمك len() أو استخدام مجموعة عقد في سياق منطقي، فأنت تُفعّل فعليًا خطوة تقييم تُرجع نتيجة ملموسة بدلًا من كائن استعلام آخر قابل للتسلسل. يوازن هذا التصميم بين مصطلحات بايثون والطبيعة البطيئة لبناء الاستعلامات.

لاسترجاع الكائنات الفعلية، عادةً ما تستخدم طرقًا مثل .all() و .get() على .nodes مدير. يمكن لهذه الطرق الحصول على lazy=True وسيطة لإرجاع مُعرِّفات العقد فقط، بدلاً من الكائنات الكاملة وجميع خصائصها. هذا مفيد إذا كنت ترغب في تقليل نقل البيانات أو إجراء استعلامات متابعة يدويًا بناءً على المُعرِّفات.

إنشاء وتحديث وحذف العلاقات

إن إنشاء العقد باستخدام neomodel أمر بسيط مثل إنشاء مثيل لفئة النموذج الخاصة بك واستدعاء save(). بمجرد تحديد خصائصك والإعدادات الافتراضية، يمكنك إنشاء مثيل بقيم الحقول المطلوبة، واستدعاء save، وسيُنشئ neomodel العقدة المقابلة في Neo4j أو يُحدِّثها. هذا يُشبه طريقة تعامل معظم ORMs مع الثبات.

تتبع عملية تحديث العُقد النمط نفسه: جلب نسخة، وتعيين قيم جديدة لخصائصها، ثم حفظها مرة أخرى. يتولى Neomodel مهمة إنشاء كود Cypher المناسب لتعديل الخصائص المتغيرة فقط في العقدة الموجودة. يُبقي هذا الأسلوب الكود بسيطًا وواضحًا، ويُبعد تفاصيل عمليات التحديث عن منطق العمل.

حذف العقدة هو أمر مباشر أيضًا: بمجرد حصولك على مثيل، يمكنك استدعاءه delete() الأسلوب. يؤدي هذا إلى إزالة العقدة، وقد يؤدي أيضًا، بناءً على إعدادات العلاقة وقيود قاعدة البيانات، إلى إزالة العلاقات المُرفقة. يمكن تحديد خطافات ما قبل الحذف وما بعده لتحسين السلوك أو التسجيل.

يتم إدارة العلاقات بين العقد من خلال حقول العلاقات وطرق الراحة مثل connect(). بمجرد حصولك على عقدتين، يمكنك استدعاء شيء مثل actor.movies.connect(movie) لإنشاء مثيل علاقة مناسب في الرسم البياني. يمكن نمذجة خصائص العلاقة عبر StructuredRel-الفئات القائمة على، مما يتيح لك مساحة لتخزين السمات على الحواف أيضًا.

يمكن تحقيق عمليات عبور الرسم البياني الأكثر تعقيدًا من خلال اتباع سمات العلاقة أو الجمع بين مرشحات الاستعلام عبر العلاقات. على سبيل المثال، قد تبدأ من Entity مجموعة عقد، وفلترتها حسب خاصية معينة، ثم انتقل إلى العقد ذات الصلة لتصفية سماتها أيضًا. يؤدي هذا تدريجيًا إلى إنشاء استعلام Cypher داخلي، والذي ينفذه neomodel نيابةً عنك.

نموذج جديد غير متزامن وواجهة برمجة تطبيقات المزامنة المترجمة

يتضمن Neomodel دعمًا غير متزامن مبنيًا على إمكانيات البرمجة غير المتزامنة لبرنامج تشغيل Neo4j الرسمي للغة Python. هذا يعني أنه يمكنك دمج عمليات Neo4j في أطر عمل وخدمات Python الحديثة غير المتزامنة، والاستفادة الكاملة من التزامن في أحمال العمل التي تتضمن العديد من عمليات الإدخال/الإخراج.

أظهرت اختبارات الأداء باستخدام أدوات مثل Locust أن استخدام نموذج neomodel غير المتزامن يتفوق على كل من الاستعلامات التسلسلية واستدعاءات نموذج neomodel المتزامنة. ولأن العديد من عمليات الرسم البياني تتضمن عمليات إدخال/إخراج شبكية وانتظار استجابات قاعدة البيانات، فإن السماح لحلقة الأحداث بمعالجة استعلامات متعددة في وقت واحد يُحسّن الإنتاجية واستخدام الموارد.

داخليًا، يحافظ neomodel على محاذاة واجهات برمجة التطبيقات غير المتزامنة والمتزامنة باستخدام خطوة الترجمة التي تحول الكود غير المتزامن إلى ما يعادله المتزامن. يتم استخدام مكتبة مخصصة للتجريد تلقائيًا await الكلمات الرئيسية، وإعادة تسمية الفئات (على سبيل المثال، إزالة Async البادئات)، وإجراء عمليات استبدال مستهدفة مثل تغيير adb إلى db or mark_async_test إلى mark_sync_testيتجنب هذا النهج الحفاظ على قاعدتي بيانات منفصلتين تمامًا.

عند المساهمة، فإنك تعمل بشكل أساسي على التنفيذ غير المتزامن تحت neomodel/async_ ثم قم بتشغيل البرنامج النصي للترجمة المقدم لتوليد متغير المزامنة. يمكنك أيضًا الاعتماد على خطافات ما قبل الالتزام لأتمتة هذه الخطوة وضمان مزامنة كلا الإصدارين. في كثير من الحالات، لا يلزم كتابة منطق عملك إلا مرة واحدة في طبقة عدم التزامن.

قد تكون بعض الوظائف مخصصة للاستخدام غير المتزامن فقط أو للاستخدام المتزامن فقط، ويُوفر neomodel نمطًا برمجيًا مساعدًا (مستوحى من برنامج تشغيل Neo4j الرسمي) لفصل مسارات التعليمات البرمجية هذه. يتيح لك هذا تحديد سلوكيات مختلفة بين الوضعين مع الحفاظ على اتساق واجهة برمجة التطبيقات (API) بشكل عام. تُوضح وحدات الاختبار، مثل تلك التي تُغطي واجهة برمجة تطبيقات المطابقة، كيفية تحويل التعليمات البرمجية غير المتزامنة وكيفية عمل التعليمات البرمجية المتزامنة الناتجة.

وحدات قاعدة البيانات وقاعدة البيانات غير المتزامنة

في النموذج الجديد 6، Database() و AsyncDatabase() يتم تنفيذ الفئات كعناصر فردية حقيقية لتوضيح كيفية التعامل مع العمليات العالمية. بدلاً من تشتيت وظائف المرافق المستقلة، يقوم neomodel الآن بتجميع العمليات على مستوى قاعدة البيانات في هذه الحالات الفردية، مما يجعل واجهة برمجة التطبيقات أكثر قابلية للاكتشاف ومتسقة.

تم نقل العديد من الوظائف القديمة إلى Database() تم إزالة الفئة من مساحة الاسم العالمية. ومن الأمثلة على ذلك change_neo4j_password, clear_neo4j_database, drop_constraints, drop_indexes, remove_all_labels, install_labelsو install_all_labelsيمكن الوصول إلى النظراء غير المتزامنين من AsyncDatabase() مفرد، يشار إليه عادةً باسم adb في السياق غير المتزامن.

يُبسّط هذا التصميم الجديد النماذج الذهنية المتعلقة بعمليات قاعدة البيانات، ويتجنب الغموض في كيفية إدارة الإعدادات والحالة العامة. ومن خلال ضمان تشابه بنية كلٍ من الوضعين المتزامن وغير المتزامن، يصبح من الأسهل تحديد متى يُمكن التبديل بأمان بين أسلوبين أو تشغيلهما جنبًا إلى جنب في أجزاء مختلفة من تطبيق أكبر.

بالإضافة إلى ذلك، قدم الإصدار 6.0 merge_by معلمة لعمليات الدفعات، توفر المزيد من التحكم في كيفية دمج العقد والعلاقات. يمكنك تخصيص العلامات ومفاتيح الخصائص التي تحدد التفرد لعمليات الدمج الدفعية، وهو أمر بالغ الأهمية عند التعامل مع كميات كبيرة من مهام استيعاب البيانات أو مزامنتها.

تكامل Django والاستخدام في العالم الحقيقي

يتكامل Neomodel بشكل نظيف مع Django من خلال django_neomodel الحزمة، التي تمكنك من معالجة نماذج الرسم البياني الخاصة بك كجزء من مشروع Django. مع هذا التكامل، عادةً ما يكون التكوين موجودًا في settings.py، وتتعايش فئات العقدة والعلاقات الخاصة بك مع بقية نظام Django البيئي الخاص بك، بما في ذلك التطبيقات والبرامج الوسيطة والعروض.

ومن الأمثلة الملموسة على ذلك البرنامج التعليمي Django المكون من عدة أجزاء والذي يستخدم neomodel لاستكشاف قاعدة بيانات الرسوم البيانية على غرار Paradise Papers والبحث فيها. في الأجزاء الأولى، تقوم بإعداد مشروع Django ودمج neomodel؛ وفي الأجزاء اللاحقة، تقوم ببناء fetch_api التطبيق، وتحديد النماذج التي تعكس الكيانات والعلاقات والخصائص في الرسم البياني، ثم بناء الأدوات المساعدة والآراء فوقها تدريجيًا.

في مثل هذا المشروع، يمكنك استخدام نماذج neomodel مباشرة داخل عروض Django أو المسلسلات أو وحدات المساعدة. النهج الشائع هو إنشاء utils.py ملف تُعرّف فيه دوال الراحة التي تُستدعى إلى واجهة برمجة تطبيقات الاستعلام. على سبيل المثال، قد تُنفّذ count_nodes, fetch_nodesو fetch_node_details مساعدات تستوعب المرشحات ومعلمات الترقيم وأسماء النماذج بشكل ديناميكي.

قد يكون من المكلف الاستعلام عن بعض البيانات بشكل متكرر، مثل قوائم البلدان أو الولايات القضائية أو مصادر البيانات، لذا يمكنك حسابها مسبقًا باستخدام Cypher الخام وتخزينها كقيم ثابتة. A constants.py يمكن للوحدة تنفيذ استعلامات Cypher تلك مرة واحدة، واستنباط قوائم مرتبة مثل COUNTRIES, JURISDICTIONSو DATASOURCE، وجعلها قابلة للاستيراد بسهولة عبر تطبيق Django الخاص بك.

لضمان جاهزية هذه الثوابت عند بدء تشغيل التطبيق، يمكنك الاتصال بتكوين تطبيق Django من خلال تعريف ready() الطريقة في fetch_api/app.py. داخل هذه الطريقة، يمكنك الاستيراد constants.py، مما يُفعّل استعلامات Cypher الأولية ويُكمل القوائم المقابلة. بهذه الطريقة، يُمكن للطلبات اللاحقة القراءة بسهولة من هياكل البيانات المُعدّة مسبقًا.

Raw Cypher مقابل OGM للاستعلامات المعقدة

على الرغم من أن لغة OGM الخاصة بـ neomodel مثالية لعمليات CRUD اليومية واجتياز العلاقات، إلا أن هناك حالات يكون فيها استخدام استعلامات Cypher المكتوبة يدويًا أكثر كفاءة. ففي بعض الأحيان، يمكن التعبير عن عمليات الاجتياز المتداخلة بعمق، والاستعلامات من الدرجة الثانية أو متعددة القفزات، وعمليات التجميع المعقدة بشكل أوضح وبأداء أفضل باستخدام لغة Cypher الخام مقارنةً بسلاسل OGM.

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

قد يتطلب تكرار هذا السلوك نفسه باستخدام طرق OGM المساعدة فقط عمليةً معقدةً من رتبة O(n²)، تتضمن المرور على الأفلام والشخصيات المرتبطة بها على مستوى بايثون. هذا أقل أناقةً وكفاءةً من ترك Neo4j يتولى الجزء الأكبر من العمل في جملة Cypher واحدة. وهذا يُبيّن أن OGMs ليست حلاً سحرياً لكل نمط وصول إلى الرسوم البيانية.

علاوة على ذلك، عند الاعتماد على عمليات OGM للتنقل العميق، قد يصبح شكل البيانات المُسترجعة معقدًا للغاية. غالبًا ما تتضمن لغة Cypher المُولّدة العقدة البادئة، والعلاقات الوسيطة، والعقد المجاورة، وعلاقاتها. قد يكون هذا مفيدًا عند الحاجة إلى سياق غني، ولكنه قد يكون مبالغًا فيه عند الرغبة في الحصول على نتائج مُجمّعة مُحددة أو مجموعة فرعية من الخصائص فقط.

في المواقف التي يكون فيها الأداء والوضوح أمرًا بالغ الأهمية، استخدم cypher_query يمكن أن يكون تنفيذ Cypher المصنوع يدويًا بشكل مباشر هو الخيار الأفضل. يجعل Neomodel هذا المخرج مقصودًا: يمكنك مزج ومطابقة تفاعلات OGM عالية المستوى مع Cypher منخفضة المستوى في نفس المشروع، واختيار الأداة المناسبة لكل استعلام معين مع الاستمرار في الاحتفاظ بالنماذج كمصدر وحيد للحقيقة لمخططك.

Neomodel في مختبرات Neo4j وحوكمة المشروع

عزز انضمام Neomodel إلى برنامج Neo4j Labs مكانتها كمشروع نشط مدعوم من المجتمع، مع معايير جودة واضحة. يوفر Neo4j Labs بيئة حاضنة للمشاريع التجريبية والمتقدمة التي تحظى باهتمام كبير ولكنها ليست جزءًا من المنتج الأساسي. العديد من الأدوات المعروفة، مثل مكونات علوم بيانات الرسوم البيانية، ومكتبة GraphQL، وAPOC الأساسي، وتكاملات البث المباشر، لها جذور في هذا البرنامج.

إن انتماء neomodel إلى مختبرات Neo4j يعني التزامها بالمعايير الأساسية المتعلقة بالاختبارات، والفحوصات الأمنية، والأدوات الآلية مثل خطوط أنابيب التكامل المستمر/التسليم المستمر (CI/CD). يُجري فريق الصيانة اختبارات تكاملية على مجموعة واسعة من إصدارات Python وNeo4j، لضمان التوافق مع الإصدارات الجديدة. وهذا أحد أسباب قدرة neomodel على تقديم دعم كامل لجميع إصدارات Python وNeo4j المدعومة حاليًا، سواءً كانت إصدارات المجتمع أو المؤسسات.

يظل المشروع مفتوح المصدر بالكامل ويركز على المجتمع، حيث يعمل GitHub كمركز رئيسي للمشاكل والمناقشات والمساهمات. يتم تحديث سجل المشاكل بانتظام، مع فرز العناصر القديمة وتلخيصها كلما سمح الوقت بذلك، بينما قسم المناقشات مفتوح للجميع ويُستخدم للإعلانات ومناقشات التصميم. يوجد على الأقل موظف واحد من Neo4j يعمل كمسؤول صيانة، يربط الخبرة العملية بالمشروع.

تلعب عمليات النشر في بيئات الإنتاج الواقعية، مثل OpenStudyBuilder من Novo Nordisk، دورًا هامًا في صياغة خارطة طريق neomodel. توفر هذه التطبيقات واسعة النطاق والواقعية متطلبات ملموسة وملاحظات تُترجم إلى ميزات وتحسينات جديدة تُساهم بها بدورها في خدمة المجتمع. تُظهر هذه الحلقة الإيجابية كيف يُمكن لاستخدام المؤسسات وتطوير البرمجيات مفتوحة المصدر أن يُعزز كل منهما الآخر.

بفضل نمذجة بايثونية، وتوافقها القوي مع Neo4j، وواجهات برمجة التطبيقات المتزامنة وغير المتزامنة، وتطويرها المستمر المدعوم من مختبرات التطوير، تُقدم neomodel طريقةً فعّالة للعمل مع الرسوم البيانية من بايثون في المشاريع الصغيرة وأنظمة الإنتاج عالية المتطلبات. عند استخدامها بوعي - بالاعتماد على OGM لنمذجة المجال بوضوح وتفاعلات الرسوم البيانية النموذجية، واللجوء إلى Cypher مباشرةً عند الحاجة إلى أنماط معقدة أو تحسين الأداء - يُمكنها تبسيط تصميم تطبيقات الرسوم البيانية والاستعلام عنها وصيانتها بشكل كبير.

الوظائف ذات الصلة: