ما الذي يفعله Neo4j
يسجّل Neo4j عُقدًا — عميلًا أو منتجًا أو خادمًا — تحمل تسميات (:Person و:Product) وخصائص، وتربط بينها علاقات موجّهة ومسمّاة (:KNOWS و:BOUGHT و:DEPENDS_ON). تُخزَّن العلاقة رابطًا مباشرًا بين عقدتين: لا يتطلب تتبعها أي بحث في فهرس، مهما كبر حجم القاعدة.
ويُستعلَم عنه بلغة Cypher، وهي لغة ترسم النمط المطلوب: (a:Person)-[:KNOWS]->(b:Person). وتُكتب المسارات متغيرة الطول (-[:KNOWS*1..3]->) وأقصر المسارات والتجميعات في سطر واحد، حيث تكدّس SQL عمليات الربط أو الاستعلامات العودية.
ما الذي يقدّمه Neo4j
- Cypher —
MATCHوMERGEوالمسارات متغيرة الطول وأقصر المسارات، بلغة مقروءة. - Neo4j Browser — واجهة ويب تنفّذ الاستعلامات وترسم الرسم البياني الناتج.
- واجهة HTTP — استعلام Cypher في كل طلب
POST، والرد بصيغة JSON، من أي لغة برمجة. - مشغّلات Bolt الرسمية — Python وJavaScript وJava وGo و.NET.
- الفهارس والقيود — التفرّد والبحث النصي الكامل والفهارس المتجهية للتضمينات.
- معاملات ACID — رسم بياني متّسق، حتى عندما تكتب فيه عدة تطبيقات.
Neo4j مقارنة بالخيارات الأخرى
مرّر الجدول أفقيًا
| Neo4j | PostgreSQL | Qdrant | |
|---|---|---|---|
| النموذج | عُقد وعلاقات | جداول وعمليات ربط | متجهات وبيانات وصفية |
| الاستعلامات | Cypher | SQL | بحث بالتشابه |
| نقطة القوة | علاقات على عدة مستويات | المعاملات والبيانات الجدولية | البحث الدلالي |
| الدور في RAG | حقائق مترابطة وموثّقة المصدر | بيانات الأعمال | مقاطع قريبة من السؤال |
| التكلفة | سعر الخادم الافتراضي | سعر الخادم الافتراضي | سعر الخادم الافتراضي |
المتطلبات المسبقة
خادم افتراضي بنظام Ubuntu 24.04 مع ذاكرة 2 غيغابايت وقرص 20 غيغابايت، وDocker مع إضافة Compose، وnginx وCertbot على المضيف، ونطاق فرعي يشير إلى الخادم، مثل neo4j.example.com. يكون Neo4j في أسرع حالاته حين يتسع الرسم البياني في ذاكرة الصفحات المؤقتة: خطّط لذاكرة أكبر لرسم بياني من عشرات ملايين العُقد.
تثبيت Neo4j باستخدام Docker Compose
تحضير المجلد وكلمة المرور
يحمل الملف
.envكلمة مرور المستخدمneo4j. وسيستقبل المجلدbackupsالنسخ الاحتياطية: وهو مملوك للمستخدم 7474، مستخدم الحاوية.mkdir -p /opt/neo4j/backups && cd /opt/neo4j echo "NEO4J_PASSWORD=$(openssl rand -hex 16)" > .env chmod 600 .env chown 7474:7474 backupsكتابة الملف docker-compose.yml
يُنشر المنفذان على واجهة الحلقة المحلية فقط: 7474 لـ Neo4j Browser وواجهة HTTP، و7687 لـ Bolt. ينشئ
NEO4J_AUTHالمستخدمneo4jبكلمة مرورك منذ أول تشغيل، وعنوان Bolt المعلَن هو الذي سينشره nginx عبر HTTPS.services: neo4j: image: neo4j:2026.10.2-community restart: unless-stopped ports: - "127.0.0.1:7474:7474" - "127.0.0.1:7687:7687" environment: NEO4J_AUTH: neo4j/${NEO4J_PASSWORD} NEO4J_server_bolt_advertised__address: neo4j.example.com:443 NEO4J_server_memory_heap_initial__size: 512m NEO4J_server_memory_heap_max__size: 512m NEO4J_server_memory_pagecache_size: 512m volumes: - neo4j-data:/data - neo4j-logs:/logs volumes: neo4j-data: {} neo4j-logs: {}تشغيل Neo4j
يستغرق التشغيل الأول نحو ثلاثين ثانية؛ ثم يجيب الجذر بمستند JSON صغير يذكر الإصدار وعناوين الاتصال.
docker compose up -d docker compose ps curl -s http://127.0.0.1:7474/
لا تنشر أبدًا المنفذين 7474 و7687 على الإنترنت
أبقِ المنفذين على 127.0.0.1: قاعدة البيانات التي يمكن الوصول إليها مباشرة من الإنترنت تُفحص خلال ساعات. يتولى nginx بروتوكول HTTPS على المنفذ 443، ويمر اتصال Bolt الخاص بالمتصفح عبر الاسم نفسه بتقنية WebSocket. واحتفظ أيضًا بـ NEO4J_AUTH: من دونه يبدأ المستخدم neo4j بكلمة مرور المصنع neo4j التي يعرفها الجميع.
وضع Neo4j خلف nginx عبر HTTPS
يحتاج Neo4j Browser إلى أمرين: واجهة HTTP واتصال Bolt يفتحه المتصفح عبر WebSocket. يوجّه nginx الاثنين على الاسم نفسه: الطلبات العادية إلى 7474، وطلبات WebSocket إلى 7687.
map $http_upgrade $neo4j_backend {
default 127.0.0.1:7474;
websocket 127.0.0.1:7687;
}
server {
listen 80;
server_name neo4j.example.com;
location / {
proxy_pass http://$neo4j_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
}
}certbot --nginx -d neo4j.example.comافتح بعد ذلك https://neo4j.example.com. في Neo4j Browser أدخل neo4j+s://neo4j.example.com:443 في حقل Connect URL، ثم المستخدم neo4j وكلمة مرورك.
أولى استعلامات Cypher
في Neo4j Browser، أنشئ قيد تفرّد وبعض العُقد وعلاقاتها، ثم تتبّع مسارًا من مستويين على الأكثر. لا ينشئ MERGE عقدة أو علاقة إلا إذا لم تكن موجودة: يمكن إعادة تشغيل الاستعلام دون تكرار.
CREATE CONSTRAINT person_name IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE;
MERGE (sara:Person {name: 'Sara'})
MERGE (yassine:Person {name: 'Yassine'})
MERGE (casa:City {name: 'Casablanca'})
MERGE (sara)-[:KNOWS]->(yassine)
MERGE (yassine)-[:LIVES_IN]->(casa);
MATCH (p:Person {name: 'Sara'})-[:KNOWS*1..2]->(f)-[:LIVES_IN]->(c:City)
RETURN f.name, c.name;يرسم الـ Browser النتيجة؛ ويفتح الأمر :guide دروسه المدمجة، ويعرض :sysinfo حجم القاعدة واستخدام الذاكرة المؤقتة.
ربط تطبيق
من أي لغة برمجة، تستقبل واجهة HTTP استعلام Cypher بطلب POST وتجيب بصيغة JSON، مع مصادقة HTTP الأساسية. أما التطبيق المثبّت على الخادم نفسه فيستخدم مشغّلًا رسميًا عبر Bolt على bolt://127.0.0.1:7687. ومن جهاز التطوير، يجعل نفق SSH المنفذ نفسه متاحًا دون فتحه على الإنترنت.
curl -s -u neo4j:$NEO4J_PASSWORD \
-H 'Content-Type: application/json' \
-d '{"statement": "MATCH (p:Person) RETURN p.name LIMIT 5"}' \
https://neo4j.example.com/db/neo4j/query/v2from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://127.0.0.1:7687", auth=("neo4j", "<mot-de-passe>"))
records, _, _ = driver.execute_query("MATCH (p:Person) RETURN p.name AS name")
print([r["name"] for r in records])ssh -L 7687:127.0.0.1:7687 [email protected]استخدم المخطط bolt:// لا neo4j:// للاتصال المحلي: فالثاني يطلب جدول التوجيه الذي يعلن العنوان العام على المنفذ 443.
GraphRAG: منح المساعد الذكي حقائق مترابطة
يسترجع RAG التقليدي مقاطع قريبة من السؤال. ويضيف GraphRAG العلاقات: تصبح الكيانات المستخرجة من المستندات (أشخاص وعقود ومنتجات) عُقدًا مرتبطة ببعضها وبالمقاطع التي تذكرها. ويحمل Neo4j الأمرين في القاعدة نفسها بفضل فهارسه المتجهية.
CREATE VECTOR INDEX chunk_embedding IF NOT EXISTS
FOR (c:Chunk) ON c.embedding
OPTIONS {indexConfig: {`vector.dimensions`: 768, `vector.similarity_function`: 'cosine'}};يعثر البحث المتجهي على المقاطع ذات الصلة، ثم يتتبع استعلام Cypher علاقاتها لجمع السياق: يجيب المساعد بحقائق مترابطة مع مصدر كل منها. ويمكن أن تأتي التضمينات من نموذج محلي يقدّمه Ollama على الخادم نفسه.
النسخ الاحتياطي والتحديث
في Community Edition يُؤخذ النسخ الاحتياطي والقاعدة متوقفة، باستخدام neo4j-admin database dump: بضع ثوانٍ من التوقف لرسم بياني متوسط الحجم. جدوِله ليلًا.
cd /opt/neo4j
docker compose stop neo4j
docker compose run --rm -v /opt/neo4j/backups:/backups neo4j \
neo4j-admin database dump neo4j --to-path=/backups --overwrite-destination=true
docker compose start neo4jانسخ بعد ذلك backups/neo4j.dump خارج الخادم. وللتحديث، غيّر رقم إصدار الصورة في docker-compose.yml ثم نفّذ docker compose pull && docker compose up -d مباشرة بعد نسخة احتياطية؛ واقرأ ملاحظات الإصدار قبل الانتقال إلى إصدار رئيسي جديد.
التثبيت بنقرة واحدة على ServOrbit
من متجر مساحة العميل، يُثبَّت Neo4j على خادم ServOrbit افتراضي دون كتابة سطر واحد: تُنشر Neo4j Community Edition خلف وكيل صغير يقدّم Neo4j Browser وواجهة HTTP واتصال Bolt على منفذ واحد، وتُولَّد كلمة مرور المستخدم neo4j وتُعرض في مساحة العميل، ويُنشر الكل عبر HTTPS على نطاقك أو على النطاق الفرعي المجاني للخادم. ويبقى منفذ Bolt متاحًا محليًا على bolt://127.0.0.1:7687 لتطبيقاتك.
servorbit.com/ma-ar/المدونة/استضافة-neo4j-على-vps-قاعدة-بيانات-رسومية