Skip to content

Latest commit

 

History

History
502 lines (375 loc) · 22.1 KB

File metadata and controls

502 lines (375 loc) · 22.1 KB

RushDB Logo

RushDB

طبقة الذاكرة لوكلاء وتطبيقات الذكاء الاصطناعي.

ادفع أي JSON. يحصل وكيلك على مخطط حيّ قابل للاستعلام، وعلاقات رسم بياني، وبحث دلالي — يُستنتج تلقائيًا. لا خطوط معالجة. لا مخازن منفصلة. لا مخطط لتصميمه.

GitHub Stars Follow on X NPM Version PyPI Version License CI

🌐 Website📖 Documentation☁️ Cloud🔍 Examples

English中文日本語한국어DeutschFrançaisPortuguêsEspañolहिन्दीالعربيةBahasa Indonesiaไทย


المشكلة

يحتاج وكيلك إلى ذاكرة. الإجابة المعتادة هي ثلاث قواعد بيانات: Redis للمفتاح-القيمة، ومخزن متجهات للبحث الدلالي، وقاعدة بيانات رسم بياني للعلاقات — بالإضافة إلى شيفرة ربط للحفاظ على تزامنها.

يستبدل RushDB الثلاثة جميعًا. ادفع JSON مرة واحدة. استعلم عنه بالتنقل في الرسم البياني، أو البحث الدلالي، أو كليهما — في استدعاء واحد.

بدون RushDB مع RushDB
Redis + Pinecone + Neo4j + شيفرة ربط واجهة برمجة تطبيقات واحدة
تصميم المخطط ← كتابة الترحيلات ← التكرار ادفع أي شكل، دون الحاجة إلى مخطط
خط معالجة تضمين منفصل تضمينات مُدارة، على جانب الخادم
صياغة حواف العلاقات يدويًا اكتشاف تلقائي من بنية بياناتك

بداية سريعة

مساران حسب إعدادك:

مسار السحابة

npm install @rushdb/javascript-sdk
# or
pip install rushdb

تخزين واسترجاع ذاكرة الوكيل

import RushDB from '@rushdb/javascript-sdk'

const db = new RushDB('RUSHDB_API_KEY')

// One-time: tell RushDB to auto-embed 'output' on every write
await db.ai.indexes.create({ label: 'MEMORY', propertyName: 'output' })

// Store an agent action — no embedder, no vectors array
await db.records.create({
  label: 'MEMORY',
  data: {
    agent_id: 'agent-42',
    session_id: 'sess-001',
    action: 'summarized',
    topic: 'Q4 results',
    output: summaryText
  }
})

// Recall by meaning — graph filter + semantic search in one call
const memories = await db.records.vectorSearch({
  labels: ['MEMORY'],
  propertyName: 'output',
  query: 'what did we decide about Q4?',
  where: { agent_id: 'agent-42' },
  limit: 10
})
from rushdb import RushDB

db = RushDB('RUSHDB_API_KEY')

# Store — graph links sessions, actions, and context automatically
db.records.create(
    label='MEMORY',
    data={
        'agent_id': 'agent-42',
        'action': 'summarized',
        'topic': 'Q4 results',
        'output': summary_text,
    },
)

# Recall — traverse relationships and filter by meaning
results = db.records.find({
    'labels': ['MEMORY'],
    'where': {
        'agent_id': 'agent-42',
        'topic': {'$contains': 'Q4'},
    },
    'limit': 10,
})

التعامل مع بياناتك

استيراد JSON المتداخل

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

await db.records.importJson({
  label: 'COMPANY',
  data: {
    name: 'Acme Corp',
    DEPARTMENT: [
      {
        name: 'Engineering',
        budget: 2_000_000,
        EMPLOYEE: [
          { name: 'Alice', role: 'Staff Engineer', salary: 210_000 },
          { name: 'Bob', role: 'Engineer', salary: 160_000 }
        ]
      }
    ]
  }
})

يصبح كل مفتاح متداخل (DEPARTMENT، EMPLOYEE) تسمية، وكل كائن سجلًا، ويصبح الاحتواء علاقة — كلها تُنشأ تلقائيًا.

استيراد CSV

const csv = `name,email,department
Alice,alice@acme.co,Engineering
Bob,bob@acme.co,Sales`

await db.records.importCsv({
  label: 'EMPLOYEE',
  data: csv,
  options: { suggestTypes: true, skipEmptyValues: true },
  parseConfig: { header: true }
})

يستنتج suggestTypes الأرقام والقيم المنطقية والتواريخ من السلاسل النصية؛ ويعامل skipEmptyValues الخلايا الفارغة على أنها غير محدّدة بدلًا من تخزين قيم فارغة (تُحفظ 0 وfalse).

التنقل في الرسم البياني

رشّح السجلات الجذرية بشروط على سجلاتها المرتبطة — بأي عمق كان — في استعلام واحد. توضع التسميات المرتبطة داخل where، وليس في labels:

// Engineers in Acme's Engineering department
const engineers = await db.records.find({
  labels: ['EMPLOYEE'],
  where: {
    role: { $contains: 'Engineer' },
    DEPARTMENT: {
      name: 'Engineering',
      COMPANY: { name: 'Acme Corp' }
    }
  }
})

الاستعلامات التحليلية (التجميع والتجميع حسب)

يشكّل select المخرجات بعمليات التجميع ($sum، $avg، $count، $min، $max)؛ ويتحكم groupBy في الأبعاد. لا تُضِف limit إلى عملية تجميع — فهي ستفحص أول N سجلات فقط وتشوّه الإجماليات.

// Portfolio KPIs across ALL projects → one row
const kpis = await db.records.find({
  labels: ['PROJECT'],
  select: {
    totalBudget: { $sum: '$record.budget' },
    avgBudget: { $avg: '$record.budget', $precision: 2 },
    projectCount: { $count: '*' }
  },
  groupBy: ['totalBudget', 'avgBudget', 'projectCount'],
  orderBy: { totalBudget: 'asc' } // late-ordering → aggregates the full dataset
})
// → [{ totalBudget: 18_750_000, avgBudget: 568181.82, projectCount: 33 }]

// Breakdown by dimension → one row per status
const byStatus = await db.records.find({
  labels: ['PROJECT'],
  select: { count: { $count: '*' }, avgBudget: { $avg: '$record.budget', $precision: 2 } },
  groupBy: ['$record.status'],
  orderBy: { count: 'desc' }
})
// → [{ status: 'active', count: 18, avgBudget: 612000 }, { status: 'paused', count: 9, ... }]

تتكامل عمليات التجميع مع التنقل — مثلًا عدد الموظفين وكشف الرواتب لكل قسم:

const payroll = await db.records.find({
  labels: ['DEPARTMENT'],
  where: { EMPLOYEE: { $alias: '$emp' } }, // alias the related node for use in select
  select: {
    headcount: { $count: '*' },
    payroll: { $sum: '$emp.salary' }
  },
  groupBy: ['$record.name'],
  orderBy: { payroll: 'desc' }
})
// → [{ name: 'Engineering', headcount: 2, payroll: 370000 }, ...]

الاتصال بـ Claude أو Cursor أو أي عميل MCP

يأتي RushDB مع خادم MCP. يحصل وكيلك على ذاكرة دائمة ومنظّمة — جاهزة فور الاستخدام.

{
  "mcpServers": {
    "rushdb": {
      "command": "npx",
      "args": ["@rushdb/mcp-server"],
      "env": {
        "RUSHDB_API_KEY": "your-api-key-here"
      }
    }
  }
}

ضع هذا في إعداد MCP الخاص بـ Claude Desktop أو Cursor أو Windsurf. يصبح بإمكان الوكيل الآن إنشاء السجلات، والبحث بالمعنى، والتنقل عبر العلاقات، واستبطان المخطط — كل ذلك عبر اللغة الطبيعية.


ما الذي تحتويه العلبة

القدرة ماذا تعني
تضمينات مُدارة فهرس أي خاصية نصية مرة واحدة — وتُضمَّن كل عملية كتابة تلقائيًا على جانب الخادم
رسم بياني + متجه في استعلام واحد يتكامل التشابه الدلالي والتنقل عبر العلاقات في استدعاء واحد
بلا مخطط ادفع أي شكل من JSON. يستنتج RushDB الأنواع، وينشئ الخصائص، ويربط السجلات
مخطط مُستنتَج تصبح الخصائص عقدًا من الدرجة الأولى — تُكتشف الأنواع والتسميات والعلاقات عند الكتابة، فيبني مخطط قابل للاستعلام نفسه بنفسه مع وصول البيانات
معاملات ACID لا يُفسد الوكلاء المتزامنون الذاكرة المشتركة. Neo4j تحت الغطاء
ذاتي الوصف يستبطن الوكلاء المخطط المُستنتَج — التسميات والخصائص ونطاقات القيم — لمعرفة ما يمكنهم الاستعلام عنه بأمان
أصيل في MCP خادم MCP كامل مع موجّه استعلام مبني على مبدأ الاكتشاف أولًا
مهارات الوكيل (Agent Skills) حزمة @rushdb/skills قابلة للتثبيت — علّم أي وكيل متوافق مع المهارات أن يستعلم وينمذج ويتذكر باستخدام RushDB بأمر واحد
واجهة استعلام موحّدة شكل JSON واحد للرسم البياني والمتجه والتجميع والاستبطان
استضافة ذاتية أو سحابة Docker + Neo4j الخاص بك، أو سحابة مُدارة. ملكية كاملة للبيانات

حالات الاستخدام

حالة الاستخدام ما يستبدله RushDB واجهة API الأساسية
ذاكرة الوكيل Redis + مخزن متجهات + قاعدة بيانات رسم بياني db.records.vectorSearch({ query, where: { agent_id } })
RAG مع السياق مخزن متجهات مسطّح db.records.find({ where, labels }) + التنقل عبر العلاقات
تطبيقات بلا مخطط Postgres + ترحيلات + ETL db.records.importJson(nestedJson)
منتجات بيانات مترابطة خدمات متعددة مدمجة db.records.find({ labels, where: { SOME_LABEL: { ... } } })

الاستضافة الذاتية

مسار الاستضافة الذاتية — شغّل RushDB على بنيتك التحتية الخاصة. يتطلب Neo4j 2026.01.4+ مع إضافة APOC.

# docker-compose.yml
version: '3.8'
services:
  rushdb:
    image: rushdb/platform
    ports:
      - '3000:3000'
    environment:
      - NEO4J_URL=neo4j+s://your-instance.neo4j.io
      - NEO4J_USERNAME=neo4j
      - NEO4J_PASSWORD=password
      - RUSHDB_AES_256_ENCRYPTION_KEY=32-char-key-here
      - RUSHDB_LOGIN=admin
      - RUSHDB_PASSWORD=secure-password
      # Optional: managed continuous-sync connectors via synx
      - RUSHDB_BASE_URL=https://rushdb.example.com
      - RUSHDB_SYNX_CONTROL_TOKEN=long-random-shared-token
      - RUSHDB_SYNX_DESTINATION_API_KEY=internal-write-api-key
متغيرات البيئة الكاملة
الاسم الوصف مطلوب الافتراضي
NEO4J_URL عنوان اتصال Neo4j نعم
NEO4J_USERNAME اسم مستخدم Neo4j نعم neo4j
NEO4J_PASSWORD كلمة مرور Neo4j نعم
RUSHDB_AES_256_ENCRYPTION_KEY مفتاح من 32 حرفًا لتشفير رموز API نعم (إنتاج)
RUSHDB_PORT منفذ HTTP لا 3000
RUSHDB_LOGIN تسجيل دخول المسؤول لا admin
RUSHDB_PASSWORD كلمة مرور المسؤول لا password
RUSHDB_BASE_URL عنوان API العام/الأساسي لتعيينات synx لا
RUSHDB_SYNX_CONTROL_TOKEN رمز داخلي لعمّال synx المُدارين لا
RUSHDB_SYNX_DESTINATION_API_KEY مفتاح كتابة داخلي لعمليات الكتابة إلى وجهة synx لا

تعمل عمّال synx المُدارة كخدمات خفية (daemons). تستقصي عن الموصّلات القابلة للتشغيل، وتجدّد عقود إيجار الموصّلات، وتحرّر العقود عند الإيقاف السلس، وتتيح لـ platform/core استعادة العقود المنتهية بعد الأعطال.

التطوير المحلي (Neo4j مضمّن)
version: '3.8'
services:
  rushdb:
    image: rushdb/platform
    depends_on:
      neo4j:
        condition: service_healthy
    ports:
      - '3000:3000'
    environment:
      - NEO4J_URL=bolt://neo4j
      - NEO4J_USERNAME=neo4j
      - NEO4J_PASSWORD=password
  neo4j:
    image: neo4j:2026.01.4
    healthcheck:
      test: ['CMD-SHELL', 'wget --no-verbose --tries=1 --spider localhost:7474 || exit 1']
      interval: 5s
      retries: 30
      start_period: 10s
    ports:
      - '7474:7474'
      - '7687:7687'
    environment:
      - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
      - NEO4J_AUTH=neo4j/password
    volumes:
      - ./neo4j-plugins:/var/lib/neo4j/plugins
# Manage users via CLI
rushdb create-user admin@example.com securepassword123
rushdb update-password admin@example.com newsecurepassword456
البنية المعمارية: كيف يهيكل RushDB البيانات (LMPG)

يستخدم RushDB نموذج الرسم البياني الفائق للخصائص المُسمّى (Labeled Meta Property Graph - LMPG). تُرفَّع الخصائص لتصبح عقدًا من الدرجة الأولى في الرسم البياني ("HyperProperties") — وليست مجرد أزواج مفتاح-قيمة مرتبطة بالسجلات.

هذا يعني:

  • مخطط دون تصميم مسبق — لأن الخصائص عقد في الرسم البياني، فإن المخطط يُستنتج من بياناتك، ولا يُصمّم: تُكتشف التسميات والأنواع ونطاقات القيم وطوبولوجيا العلاقات عند الكتابة وتكون قابلة للاستعلام فورًا — دون نمذجة مخطط يدوية، ودون سلسلة أدوات RDF/OWL
  • علاقات مكتشفة تلقائيًا — تُربط السجلات التي تتشارك خصائص دون صياغة حواف يدويًا
  • استبطان المخطط — يمكن للوكلاء تعداد التسميات وأنواع الخصائص ونطاقات القيم وطوبولوجيا العلاقات في استعلام واحد
  • قيود مرنة — تقييم تماسك الأنواع، وتتبّع التعدّدية (cardinality)، وفرض أبعاد المتجهات دون مخططات صارمة مسبقة
  • سطح استعلام موحّد — يعمل تعبير الترشيح نفسه عبر السجلات والتسميات والخصائص والعلاقات

يسترجع SearchQuery واحد عدة منظورات في آن واحد (السجلات + إحصاءات الخصائص + عمليات التجميع)، متجنّبًا نمط الفحص N+1 الشائع في معماريات الأنظمة المنفصلة.

اقرأ منشور بنية LMPG الكامل ←


التوثيق

الموضوع الرابط
البرنامج التعليمي السريع https://docs.rushdb.com/get-started/quick-tutorial
البحث المتجهي / الدلالي https://docs.rushdb.com/concepts/search/where#vector-operators
الترشيح والتنقل https://docs.rushdb.com/concepts/search/where
التجميع وعمليات التجميع https://docs.rushdb.com/concepts/search/group-by
TypeScript SDK https://docs.rushdb.com/typescript-sdk/introduction
Python SDK https://docs.rushdb.com/python-sdk/introduction
REST API https://docs.rushdb.com/rest-api/introduction
خادم MCP packages/mcp-server/README.md
مهارات الوكيل packages/skills/README.md

متى لا تستخدم RushDB

  • تحتاج إلى زمن استجابة دون المليّ ثانية عند معدّل كتابة عالٍ جدًا — بُني RushDB على Neo4j الذي يعطي الأولوية للاتساق وقدرة التعبير في الاستعلام على حساب سرعة الكتابة الخام.
  • تحتاج فقط إلى تخزين مفتاح-قيمة مسطّح دون علاقات أو بحث دلالي — سيكون مخزن أبسط أخف.
  • تحتاج إلى مخطط علائقي صارم مفروض على مستوى قاعدة البيانات — صُمّم RushDB عمدًا ليكون بلا مخطط.

المساهمة

git clone https://github.com/rush-db/rushdb.git
cd rushdb
pnpm install
pnpm test

راجع CONTRIBUTING.md للاطلاع على الإرشادات الكاملة. المشكلات وطلبات السحب (PRs) مرحّب بها.

الترخيص

المسار الترخيص
platform/core Elastic License 2.0
platform/dashboard Elastic License 2.0
docs Apache 2.0
website Apache 2.0
packages/javascript-sdk Apache 2.0
packages/mcp-server Apache 2.0

هل تحتاج إلى شيء غير مدعوم بعد؟ افتح مشكلة (issue) — مناقشات التصميم مرحّب بها.