قواعد بيانات الرسوم البيانية (Graph Databases) مبنية للبيانات المترابطة. فبدلًا من فرض العلاقات عبر عمليات الربط (joins) وجداول البحث، فإنها تتعامل مع العلاقات كجزء أساسي من النموذج. هذا ما يجعلها مناسبة تمامًا للأنظمة التي تكون فيها الروابط بنفس أهمية السجلات نفسها.
في هذا الدليل، سنتناول:
- ما هي قواعد بيانات الرسوم البيانية
- لماذا يُستخدم Neo4j على نطاق واسع
- أنماط استعلام Cypher الأساسية
- كيفية تثبيت Neo4j Desktop
- كيفية بناء رسم بياني بسيط كمثال
تعرّف على Neo4j
تخزّن قواعد بيانات الرسوم البيانية البيانات على شكل عقد (nodes) وعلاقات (relationships).
- تمثّل العقد كيانات مثل الأشخاص أو الشركات أو المنتجات أو الأماكن.
- تمثّل العلاقات كيفية ارتباط تلك الكيانات ببعضها.
هذا النموذج مفيد بشكل خاص لـ:
- الشبكات الاجتماعية
- محركات التوصية
- كشف الاحتيال
- تحليل الشبكات
- رسم خرائط الاعتماديات
على عكس قواعد البيانات العلائقية، التي غالبًا ما تحتاج إلى عمليات ربط متعددة للإجابة عن أسئلة كثيفة العلاقات، صُممت قواعد بيانات الرسوم البيانية لتتنقل عبر تلك الروابط مباشرة.
ما هو Neo4j؟
Neo4j هو أحد أشهر قواعد بيانات الرسوم البيانية، إلى جانب أنظمة مثل JanusGraph وAmazon Neptune وOrientDB وArangoDB وAzure Cosmos DB.
بدأ Neo4j عام 2007، على يد Emil Eifrem وفريقه، بهدف بناء قاعدة بيانات مُحسّنة للبيانات شديدة الترابط.
يُستخدم Neo4j اليوم في مختلف القطاعات التي يكون فيها فهم العلاقات أساسيًا للمنتج أو سير العمل.
أساسيات Neo4j
Neo4j هو قاعدة بيانات NoSQL للرسوم البيانية بشكل أصلي (native)، وتدعم معاملات ACID.
الذرية (Atomicity)
إما أن تنجح المعاملة بأكملها، أو لا ينجح أي جزء منها.
الاتساق (Consistency)
تنقل المعاملة قاعدة البيانات من حالة صالحة إلى حالة صالحة أخرى.
العزل (Isolation)
لا تتداخل المعاملات المتزامنة مع بعضها البعض.
الديمومة (Durability)
بمجرد تثبيت التغييرات، تبقى محفوظة حتى لو حدث عطل لاحقًا.
يُنفَّذ Neo4j بشكل أساسي بلغة Java، مع بعض مكونات Scala، ويتوفر في:
- إصدار المجتمع (Community Edition) للاستخدام مفتوح المصدر
- إصدار المؤسسات (Enterprise Edition) لميزات تشغيلية متقدمة مثل النسخ الاحتياطي والعنقدة (clustering) والمراقبة
لماذا يحظى Neo4j بشعبية
- نموذج بيانات رسومي بديهي
- تخزين ومعالجة أصليان للرسوم البيانية
- دعم ACID
- أداء استعلام قوي للبيانات المترابطة
- نموذج رسم بياني مرن بخصائص موسومة (labeled-property)
- لغة استعلام معبّرة عبر Cypher
- دعم نظام بيئي واسع عبر Java وPython وNET. وJavaScript وغيرها
المقايضات
- التوسع الأفقي يعتمد على نموذج النشر والبنية المعمارية
- أحمال العمل الكبيرة جدًا لا تزال تتطلب تخطيطًا دقيقًا للبنية التحتية
- الأمان والتشفير المتقدمان غالبًا ما يحتاجان إلى قرارات معمارية إضافية
لغة استعلام Cypher
Cypher هي لغة الاستعلام في Neo4j. غالبًا ما تُوصف بأنها "SQL للرسوم البيانية"، لكن هذا الوصف دقيق جزئيًا فقط. تتمحور Cypher حول مطابقة الأنماط (pattern matching) والتنقل بين العلاقات، ما يجعل استعلامات الرسوم البيانية أسهل في القراءة والكتابة.
مثال: SQL مقابل Cypher
أسلوب SQL:
SELECT name FROM Person
LEFT JOIN Person_Department ON Person.Id = Person_Department.PersonId
LEFT JOIN Department ON Department.Id = Person_Department.DepartmentId
WHERE Department.name = "IT Department";أسلوب Cypher:
MATCH (p:Person)<-[:EMPLOYEE]-(d:Department)
WHERE d.name = "IT Department"
RETURN p.name;تعبّر نسخة Cypher عن نمط العلاقة مباشرة، وهذا هو السبب الرئيسي وراء شعور استعلامات الرسوم البيانية بأنها أكثر طبيعية في Neo4j.
إنشاء عقدة
CREATE (n:Actor { name: "Tom Hanks", age: 44 });- Actor هي الوسم (label)
- n هي المتغيّر
- تعيش الخصائص داخل { ... }
قراءة عقدة
MATCH (actor:Actor)
WHERE actor.name = "Tom Hanks"
RETURN actor; تحديث الخصائص
MATCH (person:Person {name: "Name"})
SET person.address = "New address"
RETURN person; حذف البيانات
حذف عقدة فقط إذا لم يكن لها أي علاقات:
MATCH (n)
DELETE n;حذف عقدة وجميع علاقاتها:
MATCH (n)
DETACH DELETE n; استخدام MERGE لتجنب التكرار
CREATE تُدرج بيانات جديدة دائمًا. MERGE تحاول أولًا مطابقة البيانات الموجودة، ولا تُنشئها إلا عند الحاجة.
متطلبات النظام
- بنية x86_64 أو ARM
- آلة جافا افتراضية (JVM) متوافقة
التحميل: مركز نشر Neo4j
بعد التثبيت، فعّل Neo4j Desktop باستخدام مفتاحك.
خطوات التثبيت
- شغّل برنامج التثبيت
- اختر مجلد الوجهة
- أنهِ الإعداد
- فعّل Neo4j Desktop
استعراض مشروع مصغّر
أنشئ مشروعًا وقاعدة بيانات محلية في Neo4j Desktop، وشغّل قاعدة البيانات، وافتح متصفح Neo4j.
إدراج أشخاص كمثال
CREATE (person1:Person {
name: "First Name",
last_name: "Last Name",
date_of_birth: "YYYY-MM-DD",
address: "Address",
mob: "mob"
});
CREATE (person2:Person {
name: "First Name 2",
last_name: "Last Name 2",
date_of_birth: "YYYY-MM-DD",
address: "Address",
mob: "mob2"
});
CREATE (person3:Person {
name: "First Name 3",
last_name: "Last Name 3",
date_of_birth: "YYYY-MM-DD",
address: "Address",
mob: "mob3"
}); التحقق من الرسم البياني الحالي
MATCH (n)
RETURN n;
إضافة مكان وعلاقة
CREATE (place:Place {name: "Name of place", address: "Address"});
MATCH (person:Person {name: "Name"})
MATCH (place:Place {name: "Name of place", address: "Address"})
CREATE (person)-[:LIVES_ON]->(place)
RETURN person, place;
إضافة وظائف وعلاقة
CREATE (job1:Job {name: "Bitcoin trader", address: "Remote", type: "trader"});
CREATE (job2:Job {name: "Waiter", address: "Caffe NN", type: "service industry"});
MATCH (person:Person {name: "Admir"})
MATCH (job:Job {name: "Waiter", address: "Caffe NN", type: "service industry"})
CREATE (person)-[:WORKS_AS]->(job);
إضافة علاقة عائلية وحدث
MATCH (person1:Person {name: "Name"})
MATCH (person3:Person {name: "Name"})
CREATE (person1)-[:BROTHER]->(person3);
CREATE (murder:Murder {date: "Date", time: "Time", location: "Location"});
MATCH (person1:Person {name: "Name"})
MATCH (person2:Person {name: "Name"})
MATCH (person3:Person {name: "Name"})
MATCH (murder:Murder {location: "Location"})
CREATE (person1)-[:WAS_LOCATED_AT]->(murder)
CREATE (person2)-[:WAS_LOCATED_AT]->(murder)
CREATE (person3)-[:WAS_LOCATED_AT]->(murder);
يمكن توسيع هذا السيناريو الأخير كما تشاء بإضافة المزيد من الأشخاص والأماكن والأحداث وأنواع العلاقات.
أين يُستخدم Neo4j عادةً
- الشبكات الاجتماعية
- أنظمة التوصية
- تحليل الشبكات
- تحليل الاحتيال والأمان
- رسوم المعرفة البيانية (Knowledge Graphs)
- الخدمات اللوجستية ورسم خرائط الاعتماديات
الخلاصة
يُعد Neo4j خيارًا عمليًا كلما كان مجالك كثيف العلاقات.
باستخدام Cypher، يمكنك نمذجة واستعلام البيانات المترابطة بطريقة غالبًا ما تكون أكثر مباشرة وتعبيرًا من عمليات الربط العلائقية. توفّر لك أوامر مثل CREATE وMATCH وSET وWHERE وMERGE وRETURN وDETACH DELETE أساسًا متينًا لبناء تطبيقات حقيقية مدفوعة بالرسوم البيانية.