Skip to content

architecture_multi_model

makr-code edited this page Dec 21, 2025 · 1 revision

ThemisDB: Integrierte Multi-Model Architektur

Stand: 5. Dezember 2025
Version: 1.0.0
Kategorie: Architecture


Übersicht

ThemisDB verwendet einen vollstΓ€ndig integrierten Ansatz fΓΌr Multi-Model-Abfragen. Anstatt separate Sprachelemente fΓΌr Graph, Vektor, Geo und Prozesse einzufΓΌhren, werden alle Datentypen als Collections behandelt und ΓΌber den bestehenden AQL-Wortschatz abgefragt.

Design-Prinzipien

1. Einheitliche Collection-Abstraktion

Alle Datentypen werden als Collections modelliert:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     ThemisDB Collection                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Dokument (Relational)  β”‚  Felder, Indizes, Constraints         β”‚
β”‚  Graph (Knoten/Kanten)  β”‚  _from, _to, _type, Adjazenzlisten    β”‚
β”‚  Vektor (Embeddings)    β”‚  _embedding, Dimensionen, Index       β”‚
β”‚  Geo (Geometrie)        β”‚  _geometry, SRID, Spatial-Index       β”‚
β”‚  Temporal (Zeit)        β”‚  _valid_from, _valid_to               β”‚
β”‚  Prozess (Workflow)     β”‚  _state, _tokens, _variables          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. Reservierte Felder fΓΌr Multi-Model

Feld Typ Beschreibung
_from string Graph: Quellknoten-ID
_to string Graph: Zielknoten-ID
_type string Graph: Kantentyp / Prozess: Knotentyp
_embedding float[] Vektor: Embedding-Array
_geometry string/object Geo: WKT oder GeoJSON
_valid_from int64 Temporal: GΓΌltig ab (ms)
_valid_to int64 Temporal: GΓΌltig bis (ms)
_state string Prozess: AusfΓΌhrungszustand
_parent string Prozess: Eltern-Instanz

3. Bestehende AQL-Syntax fΓΌr alle Modelle

FOR ... IN Collection

-- Dokumente (Relational)
FOR doc IN customers
  FILTER doc.country == "DE"
  RETURN doc

-- Graph-Knoten
FOR node IN process_nodes
  FILTER node._type == "USER_TASK"
  RETURN node

-- Graph-Kanten
FOR edge IN process_edges
  FILTER edge._type == "SEQUENCE_FLOW"
  RETURN edge

-- Prozess-Instanzen (sind auch Dokumente)
FOR instance IN process_instances
  FILTER instance._state == "RUNNING"
  RETURN instance

Graph-Traversierung (bestehende Syntax)

-- Prozess-Fluss traversieren
FOR v, e, p IN 1..10 OUTBOUND "start_event" process_edges
  FILTER e._type == "SEQUENCE_FLOW"
  RETURN { node: v, edge: e, path: p }

-- KΓΌrzester Prozess-Pfad
FOR v IN SHORTEST_PATH "start" TO "end" process_edges
  RETURN v

Vektor-Suche (SIMILARITY)

-- Γ„hnliche Prozesse finden
FOR process IN process_definitions
  LET sim = SIMILARITY(process._embedding, [0.1, 0.2, ...], 10)
  FILTER sim > 0.8
  RETURN { process, similarity: sim }

Geo-Abfragen (PROXIMITY, GEO_*)

-- Aufgaben in der NΓ€he
FOR task IN active_tasks
  FILTER GEO_DISTANCE(task._geometry, [8.68, 50.11]) < 10000
  RETURN task

Prozess-Collections

Systemdefinierte Collections

Collection Beschreibung
_process_definitions Prozess-Modelle (BPMN/EPK)
_process_nodes Knoten im Prozess-Modell
_process_edges Kanten/FlΓΌsse im Prozess-Modell
_process_instances Laufende Prozess-Instanzen
_process_tokens Token (AusfΓΌhrungsposition)
_process_history Audit-Log der AusfΓΌhrung
_process_variables Prozess-Variablen

Beispiel-Abfragen

1. Alle laufenden Bestellprozesse

FOR instance IN _process_instances
  FILTER instance.process_id == "order-process"
  FILTER instance._state == "RUNNING"
  RETURN instance

2. Aktive Benutzeraufgaben fΓΌr einen Benutzer

FOR token IN _process_tokens
  FOR node IN _process_nodes
    FILTER token.current_node == node.id
    FILTER node._type == "USER_TASK"
    FILTER node.assignee == "john.doe"
    RETURN { task: node, token: token }

3. Prozess-Fluss-Analyse

FOR v, e IN 1..20 OUTBOUND "start_event" _process_edges
  COLLECT type = e._type WITH COUNT INTO count
  RETURN { edgeType: type, count: count }

4. Cross-Instance Korrelation

FOR order IN _process_instances
  FILTER order.process_id == "order-process"
  FOR shipping IN _process_instances
    FILTER shipping.process_id == "shipping-process"
    FILTER order.variables.orderId == shipping.variables.orderId
    RETURN { order, shipping }

Integrierte Multi-Model-Abfragen

Kombination aller Modelle in einer Abfrage

-- Finde ΓΌberfΓ€llige Aufgaben in der NΓ€he des Kunden
-- mit Γ€hnlichen historischen FΓ€llen

FOR task IN _process_tokens
  -- Relational: Join mit Prozess-Knoten
  FOR node IN _process_nodes
    FILTER task.current_node == node.id
    FILTER node._type == "USER_TASK"
    
  -- Relational: Join mit Kunden-Daten
  LET customer = DOCUMENT("customers", task.variables.customerId)
  
  -- Temporal: ÜberfÀllige Aufgaben (> 24h)
  FILTER DATE_DIFF(task.created_at, DATE_NOW(), "hour") > 24
  
  -- Geo: Aufgaben in der NΓ€he des Kunden
  FILTER GEO_DISTANCE(node._geometry, customer._geometry) < 50000
  
  -- Vektor: Γ„hnliche historische FΓ€lle
  LET similar = (
    FOR hist IN _process_history
      FILTER SIMILARITY(hist._embedding, task._embedding) > 0.85
      LIMIT 5
      RETURN hist
  )
  
  RETURN {
    task: task,
    node: node,
    customer: customer,
    waitingHours: DATE_DIFF(task.created_at, DATE_NOW(), "hour"),
    distanceKm: GEO_DISTANCE(node._geometry, customer._geometry) / 1000,
    similarCases: similar
  }

Prozess-Funktionen (als regulΓ€re AQL-Funktionen)

AusfΓΌhrungsfunktionen

Funktion Beschreibung
PROCESS_START(processId, vars) Startet neue Instanz
PROCESS_SIGNAL(instanceId, event, payload) Sendet Signal
PROCESS_SUSPEND(instanceId) Pausiert Instanz
PROCESS_RESUME(instanceId) Setzt Instanz fort
PROCESS_TERMINATE(instanceId, reason) Beendet Instanz

Aufgaben-Funktionen

Funktion Beschreibung
TASK_COMPLETE(instanceId, nodeId, output) Schließt Aufgabe ab
TASK_CLAIM(instanceId, nodeId, user) Übernimmt Aufgabe
TASK_DELEGATE(instanceId, nodeId, newUser) Delegiert Aufgabe

Analyse-Funktionen

Funktion Beschreibung
PROCESS_DURATION(instanceId) Laufzeit in ms
TASK_DURATION(instanceId, nodeId) Aufgaben-Dauer in ms
PROCESS_PATH(instanceId) Durchlaufener Pfad
PROCESS_VARIABLES(instanceId) Alle Variablen

Beispiel mit Funktionen

-- Starte Prozess und erhalte Instanz-ID
LET instanceId = PROCESS_START("order-process", { orderId: "ORD-123", amount: 500 })

-- Gib Instanz-Details zurΓΌck
FOR instance IN _process_instances
  FILTER instance.id == instanceId
  RETURN {
    id: instance.id,
    state: instance._state,
    variables: PROCESS_VARIABLES(instance.id),
    path: PROCESS_PATH(instance.id)
  }

Implementierungs-Hinweise

1. Collection-Registry

Die Collection-Registry erkennt automatisch den Datentyp basierend auf:

  • PrΓ€fix _process_* β†’ Prozess-Collection
  • Feld _from/_to vorhanden β†’ Graph-Edge
  • Feld _embedding vorhanden β†’ Vektor-fΓ€hig
  • Feld _geometry vorhanden β†’ Geo-fΓ€hig

2. Query-Optimizer

Der Query-Optimizer wΓ€hlt automatisch den optimalen AusfΓΌhrungsplan:

  • Graph-Traversierung β†’ GraphIndexManager
  • Vektor-Suche β†’ VectorIndex (HNSW/FAISS)
  • Geo-Abfragen β†’ SpatialIndex (R-Tree)
  • Relationale Filter β†’ SecondaryIndex

3. Einheitlicher Executor

Ein einziger QueryExecutor verarbeitet alle Abfragetypen:

class QueryExecutor {
    // Dispatch basierend auf Collection-Typ und Operationen
    Result execute(const Query& query) {
        for (const auto& forNode : query.for_nodes) {
            auto collType = registry_.getCollectionType(forNode.collection);
            
            switch (collType) {
                case CollectionType::Document:
                    return executeRelational(forNode);
                case CollectionType::Graph:
                    return executeGraphTraversal(forNode);
                case CollectionType::Process:
                    return executeProcess(forNode);
            }
        }
    }
};

Fazit

Durch die vollstΓ€ndige Integration:

  1. Keine neuen Sprachelemente - Bestehender AQL-Wortschatz reicht
  2. Einheitliche Semantik - FOR, FILTER, RETURN fΓΌr alles
  3. Transparente Optimierung - System wΓ€hlt besten Index
  4. Kombinierbare Abfragen - Multi-Model in einer Query
  5. Einfache Lernkurve - Ein Sprachkonzept fΓΌr alle Modelle

ThemisDB Wiki

🏠 Overview

πŸš€ Getting Started

πŸ“– Tutorials

πŸ“— User Guide

βš™οΈ Operations & Security

πŸ“Ÿ Ops Runbooks

πŸ—οΈ Architecture

πŸ“ ADRs

πŸ”§ Contributing

πŸ“‹ Governance

πŸ” Audit

🧩 Plugins

πŸ”Œ Adapters

πŸ’‘ Examples

πŸ“¦ Client SDKs

πŸŽ“ Training

πŸ› οΈ Tools

πŸ€– Developer LLM Wiki

Clone this wiki locally