23.01.2024 12 min read

تعرّف على Neo4j: دليل خطوة بخطوة لقواعد بيانات الرسوم البيانية

بواسطة Valens

مقدمة عملية عن قواعد بيانات الرسوم البيانية، وNeo4j، وأنماط استعلام Cypher، والتثبيت، ومشروع تطبيقي.

Neo4j Logo

قواعد بيانات الرسوم البيانية (Graph Databases) مبنية للبيانات المترابطة. فبدلًا من فرض العلاقات عبر عمليات الربط (joins) وجداول البحث، فإنها تتعامل مع العلاقات كجزء أساسي من النموذج. هذا ما يجعلها مناسبة تمامًا للأنظمة التي تكون فيها الروابط بنفس أهمية السجلات نفسها.

في هذا الدليل، سنتناول:

  • ما هي قواعد بيانات الرسوم البيانية
  • لماذا يُستخدم Neo4j على نطاق واسع
  • أنماط استعلام Cypher الأساسية
  • كيفية تثبيت Neo4j Desktop
  • كيفية بناء رسم بياني بسيط كمثال

تعرّف على Neo4j

تخزّن قواعد بيانات الرسوم البيانية البيانات على شكل عقد (nodes) وعلاقات (relationships).

  • تمثّل العقد كيانات مثل الأشخاص أو الشركات أو المنتجات أو الأماكن.
  • تمثّل العلاقات كيفية ارتباط تلك الكيانات ببعضها.

هذا النموذج مفيد بشكل خاص لـ:

  • الشبكات الاجتماعية
  • محركات التوصية
  • كشف الاحتيال
  • تحليل الشبكات
  • رسم خرائط الاعتماديات
Graph Database Example

على عكس قواعد البيانات العلائقية، التي غالبًا ما تحتاج إلى عمليات ربط متعددة للإجابة عن أسئلة كثيفة العلاقات، صُممت قواعد بيانات الرسوم البيانية لتتنقل عبر تلك الروابط مباشرة.

ما هو Neo4j؟

Neo4j هو أحد أشهر قواعد بيانات الرسوم البيانية، إلى جانب أنظمة مثل JanusGraph وAmazon Neptune وOrientDB وArangoDB وAzure Cosmos DB.

بدأ Neo4j عام 2007، على يد Emil Eifrem وفريقه، بهدف بناء قاعدة بيانات مُحسّنة للبيانات شديدة الترابط.

Graph Databases Landscape
Emil Eifrem

يُستخدم Neo4j اليوم في مختلف القطاعات التي يكون فيها فهم العلاقات أساسيًا للمنتج أو سير العمل.

أساسيات Neo4j

Neo4j هو قاعدة بيانات NoSQL للرسوم البيانية بشكل أصلي (native)، وتدعم معاملات ACID.

الذرية (Atomicity)

إما أن تنجح المعاملة بأكملها، أو لا ينجح أي جزء منها.

الاتساق (Consistency)

تنقل المعاملة قاعدة البيانات من حالة صالحة إلى حالة صالحة أخرى.

العزل (Isolation)

لا تتداخل المعاملات المتزامنة مع بعضها البعض.

الديمومة (Durability)

بمجرد تثبيت التغييرات، تبقى محفوظة حتى لو حدث عطل لاحقًا.

يُنفَّذ Neo4j بشكل أساسي بلغة Java، مع بعض مكونات Scala، ويتوفر في:

  • إصدار المجتمع (Community Edition) للاستخدام مفتوح المصدر
  • إصدار المؤسسات (Enterprise Edition) لميزات تشغيلية متقدمة مثل النسخ الاحتياطي والعنقدة (clustering) والمراقبة
Neo4j Nebula

لماذا يحظى Neo4j بشعبية

  • نموذج بيانات رسومي بديهي
  • تخزين ومعالجة أصليان للرسوم البيانية
  • دعم ACID
  • أداء استعلام قوي للبيانات المترابطة
  • نموذج رسم بياني مرن بخصائص موسومة (labeled-property)
  • لغة استعلام معبّرة عبر Cypher
  • دعم نظام بيئي واسع عبر Java وPython وNET. وJavaScript وغيرها

المقايضات

  • التوسع الأفقي يعتمد على نموذج النشر والبنية المعمارية
  • أحمال العمل الكبيرة جدًا لا تزال تتطلب تخطيطًا دقيقًا للبنية التحتية
  • الأمان والتشفير المتقدمان غالبًا ما يحتاجان إلى قرارات معمارية إضافية

لغة استعلام Cypher

Cypher هي لغة الاستعلام في Neo4j. غالبًا ما تُوصف بأنها "SQL للرسوم البيانية"، لكن هذا الوصف دقيق جزئيًا فقط. تتمحور Cypher حول مطابقة الأنماط (pattern matching) والتنقل بين العلاقات، ما يجعل استعلامات الرسوم البيانية أسهل في القراءة والكتابة.

Cypher Concept

مثال: 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 تحاول أولًا مطابقة البيانات الموجودة، ولا تُنشئها إلا عند الحاجة.

متطلبات النظام

  1. بنية x86_64 أو ARM
  2. آلة جافا افتراضية (JVM) متوافقة

التحميل: مركز نشر Neo4j

Neo4j Desktop

بعد التثبيت، فعّل Neo4j Desktop باستخدام مفتاحك.

Activation Key

خطوات التثبيت

  1. شغّل برنامج التثبيت
  2. اختر مجلد الوجهة
  3. أنهِ الإعداد
  4. فعّل Neo4j Desktop
Installation Step
Choose Destination
Finish Installation
Key Activation

استعراض مشروع مصغّر

أنشئ مشروعًا وقاعدة بيانات محلية في Neo4j Desktop، وشغّل قاعدة البيانات، وافتح متصفح Neo4j.

Mini Project Start
Project Setup
Project Ready
Launch Browser
Neo4j Browser

إدراج أشخاص كمثال

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;
Current Graph

إضافة مكان وعلاقة

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;
Graph Update

إضافة وظائف وعلاقة

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);
Jobs Added

إضافة علاقة عائلية وحدث

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);
Scenario Graph
Who Did It?

يمكن توسيع هذا السيناريو الأخير كما تشاء بإضافة المزيد من الأشخاص والأماكن والأحداث وأنواع العلاقات.

أين يُستخدم Neo4j عادةً

  • الشبكات الاجتماعية
  • أنظمة التوصية
  • تحليل الشبكات
  • تحليل الاحتيال والأمان
  • رسوم المعرفة البيانية (Knowledge Graphs)
  • الخدمات اللوجستية ورسم خرائط الاعتماديات
Application Use Cases

الخلاصة

يُعد Neo4j خيارًا عمليًا كلما كان مجالك كثيف العلاقات.

باستخدام Cypher، يمكنك نمذجة واستعلام البيانات المترابطة بطريقة غالبًا ما تكون أكثر مباشرة وتعبيرًا من عمليات الربط العلائقية. توفّر لك أوامر مثل CREATE وMATCH وSET وWHERE وMERGE وRETURN وDETACH DELETE أساسًا متينًا لبناء تطبيقات حقيقية مدفوعة بالرسوم البيانية.

قراءات إضافية عرض الكل
الخطوة التالية

طبّق هذه الأفكار على منتجك

يساعد استوديو فالنس الفرق ذات المخاطر العالية على تحويل الوضوح الهندسي إلى تسليم منتج معياري.