-
Notifications
You must be signed in to change notification settings - Fork 1
aql_language_scope
Stand: 5. Dezember 2025
Version: 1.0.0
Kategorie: Aql
Dieses Dokument analysiert den AQL-Sprachumfang von ThemisDB im Vergleich zu führenden Abfragesprachen und identifiziert notwendige Erweiterungen für vollständige Multi-Model-Unterstützung.
| Sprache | System | Stärken |
|---|---|---|
| AQL | ArangoDB | Multi-Model, Graph-Traversierung |
| Cypher | Neo4j | Pattern Matching, Graph |
| GQL | ISO Standard | Graph Query Language Standard |
| SQL | Relational | Joins, Aggregationen, Window Functions |
| PartiQL | AWS | Semi-strukturierte Daten |
| SPARQL | RDF/Triplestore | Semantische Abfragen |
| MQL | MongoDB | Dokumentenabfragen, Aggregation Pipeline |
| Gremlin | Apache TinkerPop | Imperative Graph-Traversierung |
| PGQL | Oracle | Property Graph Queries |
| Funktion | Status | Beschreibung |
|---|---|---|
LENGTH(arr/str) |
✅ | Länge von Array/String |
CONCAT(s1, s2, ...) |
✅ | String-Verkettung |
SUBSTRING(s, start, len) |
✅ | Teilstring |
UPPER(s) / LOWER(s)
|
✅ | Groß-/Kleinschreibung |
ABS(n) / CEIL(n) / FLOOR(n) / ROUND(n)
|
✅ | Mathematik |
MIN(arr) / MAX(arr)
|
✅ | Min/Max in Array |
| Funktion | Status | Beschreibung |
|---|---|---|
ST_Point(x, y) |
✅ | Punkt erstellen |
ST_Distance(g1, g2) |
✅ | Abstand berechnen |
ST_Within(g1, g2) |
✅ | Enthaltensein prüfen |
ST_Contains(g1, g2) |
✅ | Enthält prüfen |
ST_Intersects(g1, g2) |
✅ | Schnittprüfung |
ST_DWithin(g1, g2, d) |
✅ | Abstand-Prüfung |
ST_Buffer(g, d) |
✅ | Puffer erstellen |
ST_Union(g1, g2) |
✅ | Vereinigung |
ST_GeomFromText(wkt) |
✅ | WKT parsen |
ST_GeomFromGeoJSON(json) |
✅ | GeoJSON parsen |
ST_AsGeoJSON(g) / ST_AsText(g)
|
✅ | Export |
ST_3DDistance(g1, g2) |
✅ | 3D-Abstand |
ST_Z(p) / ST_ZMin(g) / ST_ZMax(g)
|
✅ | Z-Koordinaten |
| Funktion | Status | Beschreibung |
|---|---|---|
SIMILARITY(field, vector, k) |
✅ | Vektor-Ähnlichkeitssuche |
PROXIMITY(field, point) |
✅ | Geo-Nähe-Suche |
| Syntax | Status | Beschreibung |
|---|---|---|
FOR v IN 1..n OUTBOUND start edges |
✅ | Ausgehende Traversierung |
FOR v IN 1..n INBOUND start edges |
✅ | Eingehende Traversierung |
FOR v IN 1..n ANY start edges |
✅ | Bidirektionale Traversierung |
SHORTEST_PATH start TO end edges |
✅ | Kürzester Pfad |
| Syntax | Status | Beschreibung |
|---|---|---|
COLLECT x = expr |
✅ | Gruppierung |
AGGREGATE count = COUNT() |
✅ | Zählen |
AGGREGATE sum = SUM(field) |
✅ | Summieren |
AGGREGATE avg = AVG(field) |
✅ | Durchschnitt |
Analysedatum: 8. Dezember 2024 (Aktualisiert nach Code-Review)
Die ursprüngliche Analyse war unvollständig. Eine tiefere Code-Überprüfung ergab:
Es gibt ZWEI getrennte Funktions-Systeme im Code:
-
Legacy-System (
/src/query/let_evaluator.cpp): Hardcodierte Funktionsprüfungen - nur Basis-Funktionen -
Modernes Registry-System (
/include/query/functions/*.h): Vollständige, modulare Implementierung - ALLE Funktionen!
Das Problem: Das moderne Registry-System ist IMPLEMENTIERT, aber noch NICHT in den Query-Ausführungspfad integriert!
- String-Funktionen: LENGTH, CONCAT, SUBSTRING, UPPER, LOWER
- Mathematik: ABS, CEIL, FLOOR, ROUND, MIN, MAX
- Geo/Spatial: ST_Point, ST_Distance, ST_Within, ST_Contains, ST_Intersects, ST_DWithin, ST_Buffer, ST_Union, ST_GeomFromText, ST_GeomFromGeoJSON, ST_AsGeoJSON, ST_AsText, ST_3DDistance, ST_Z, ST_ZMin, ST_ZMax
- Vektor: SIMILARITY (Vektor-Ähnlichkeitssuche), PROXIMITY (Geo-Nähe)
- Graph-Traversierung: FOR v IN 1..n OUTBOUND/INBOUND/ANY, SHORTEST_PATH
- Aggregation: COLLECT x = expr, AGGREGATE COUNT/SUM/AVG
- Window Functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, FIRST_VALUE, LAST_VALUE
Quelle: /src/query/let_evaluator.cpp, /src/query/window_evaluator.cpp
- Implementiert: DOCUMENT, MERGE, MERGE_RECURSIVE, UNSET, KEEP, HAS, ATTRIBUTES, VALUES, ZIP, UNZIP
- Typ-Funktionen: TYPENAME, IS_NULL, IS_BOOL, IS_NUMBER, IS_STRING, IS_ARRAY, IS_OBJECT
- Konvertierung: TO_NUMBER, TO_STRING, TO_BOOL, TO_ARRAY
- Implementiert: FIRST, LAST, NTH, PUSH, POP, SHIFT, UNSHIFT, SLICE, FLATTEN, UNIQUE, SORTED, REVERSE_ARRAY, UNION, INTERSECTION, MINUS, POSITION, COUNT, RANGE
- Implementiert: 54 Funktionen! Inklusive DATE_NOW, DATE_ADD, DATE_DIFF, DATE_FORMAT, DATE_YEAR, DATE_MONTH, DATE_DAY, CURRENT_TIMESTAMP, WORKDAYS, MAKE_DATE, und viele mehr
- Implementiert: CONCAT, SUBSTRING, LENGTH, UPPER, LOWER, TRIM, LTRIM, RTRIM, SPLIT, REPLACE, REVERSE, CONTAINS, STARTS_WITH, ENDS_WITH, REGEX_TEST, REGEX_REPLACE, LEVENSHTEIN_DISTANCE
Quelle: /include/query/functions/*.h, registriert in /src/query/functions/function_registry.cpp
- Text/Volltext: FULLTEXT, TOKENS, PHRASE, SOUNDEX, METAPHONE, NGRAM_MATCH
- Erweiterte Graph: ALL_SHORTEST_PATHS, K_SHORTEST_PATHS, PATH_LENGTH, PATH_VERTICES, Graph-Algorithmen
- AI/ML: EMBED, CLASSIFY, EXTRACT_ENTITIES, VECTOR_DISTANCE (erweiterte Metriken), HYBRID_SEARCH
- Erweiterte Geo: GEO_DISTANCE (Haversine), GEO_AREA, H3_*, ISOCHRONE
- JSON: JSON_EXTRACT, JSON_SET, JSON_TYPE (komplexe JSON-Pfad-Operationen)
- Statistik: MODE, STDDEV, VARIANCE, CORRELATION, LINEAR_REGRESSION
- Syntax: UPSERT, EXISTS, Transaktionen
Google Tests: 191 Test-Fälle in /tests/test_aql_functions.cpp
- String-Funktionen: LENGTH, CONCAT, SUBSTRING, UPPER, LOWER, TRIM, SPLIT, REGEX_TEST, LEVENSHTEIN_DISTANCE
- Math-Funktionen: ABS, CEIL, FLOOR, ROUND, SQRT, POW, LOG, SIN, COS, TAN, PI, MIN, MAX, SUM, AVG
- Array-Funktionen: FIRST, LAST, NTH, PUSH, POP, SLICE, FLATTEN, UNIQUE, SORTED, UNION, INTERSECTION, RANGE
- Date-Funktionen: DATE_NOW, DATE_ADD, DATE_DIFF, DATE_FORMAT, DATE_YEAR, DATE_MONTH, DATE_DAY
- Document-Funktionen: MERGE, UNSET, KEEP, HAS, ATTRIBUTES, VALUES, ZIP, UNZIP
- Geo-Funktionen: ST_Point, ST_Distance, ST_Contains, ST_GeomFromText, ST_AsText
Benchmarks: 39 Performance-Tests in /benchmarks/bench_aql_functions.cpp
- Alle Funktionskategorien haben Benchmark-Coverage
- Performance-Messungen für kritische Operationen
Zusätzlich: ~40 weitere AQL-Test-Dateien für spezielle Features (Graph, Fulltext, Parser, etc.)
Beweis: Die Funktionen sind vollständig implementiert, getestet UND gebenchmarkt!
✅ ERLEDIGT - FunctionRegistry Integration abgeschlossen (8. Dezember 2024):
-
FunctionRegistry in let_evaluator integrieren- FERTIG!-
src/query/let_evaluator.cppnutzt jetzt FunctionRegistry - ~140+ Funktionen sofort aktiviert
- 96 Zeilen redundanter Code entfernt
-
Hohe Priorität - Fehlende Funktionen implementieren: 2. Text/Volltext-Funktionen (FULLTEXT, TOKENS, PHRASE) 3. Erweiterte Graph-Funktionen
Mittlere Priorität: 4. AI/ML-Funktionen 5. Statistische Funktionen
⚠️ WICHTIGER HINWEIS: Die folgende Analyse basiert auf einer Code-Überprüfung vom 8. Dezember 2024. Viele zuvor als "✅ implementiert" markierte Funktionen sind tatsächlich NICHT im Sourcecode vorhanden. Dieser Abschnitt wurde korrigiert, um den tatsächlichen Stand widerzuspiegeln.
STATUS: Diese Funktionen sind vollständig im Code implementiert (
/include/query/functions/*.h), aber der Query-Executor (let_evaluator.cpp) nutzt das Function Registry-System noch nicht. Integration erforderlich, KEINE Neu-Implementierung!
-- DOCUMENT() - Dokument per ID laden ⚠️ Implementiert, nicht integriert
LET customer = DOCUMENT("customers", order.customerId)
-- MERGE() - Objekte zusammenführen ⚠️ Implementiert, nicht integriert
LET merged = MERGE(doc1, doc2, { extra: "field" })
-- UNSET() - Felder entfernen ⚠️ Implementiert, nicht integriert
LET cleaned = UNSET(doc, ["password", "internal"])
-- KEEP() - Nur bestimmte Felder behalten ⚠️ Implementiert, nicht integriert
LET subset = KEEP(doc, ["name", "email"])
-- HAS() - Feld-Existenz prüfen ⚠️ Implementiert, nicht integriert
FILTER HAS(doc, "optionalField")
-- ATTRIBUTES() - Alle Feldnamen ⚠️ Implementiert, nicht integriert
LET fields = ATTRIBUTES(doc)
-- VALUES() - Alle Feldwerte ⚠️ Implementiert, nicht integriert
LET vals = VALUES(doc)
Status: Vollständig implementiert in /include/query/functions/document_functions.h
Problem: let_evaluator.cpp nutzt FunctionRegistry nicht
Lösung: FunctionRegistry-Integration (Aufwand: ~1 Woche)
-- FLATTEN() - Verschachtelte Arrays flachen ⚠️ Implementiert, nicht integriert
LET flat = FLATTEN([[1,2], [3,4]]) -- [1,2,3,4]
-- UNIQUE() - Duplikate entfernen ⚠️ Implementiert, nicht integriert
LET unique = UNIQUE([1,1,2,2,3]) -- [1,2,3]
-- UNION() / INTERSECTION() / MINUS() ⚠️ Implementiert, nicht integriert
LET combined = UNION(arr1, arr2)
LET common = INTERSECTION(arr1, arr2)
LET diff = MINUS(arr1, arr2)
-- FIRST() / LAST() / NTH() ⚠️ Implementiert, nicht integriert
LET first = FIRST(arr)
LET last = LAST(arr)
LET third = NTH(arr, 2)
-- SLICE() - Teilarray ⚠️ Implementiert, nicht integriert
LET sub = SLICE(arr, 1, 3)
-- REVERSE() - Umkehren ⚠️ Implementiert, nicht integriert
LET rev = REVERSE(arr)
-- SORTED() / SORTED_UNIQUE() ⚠️ Implementiert, nicht integriert
LET sorted = SORTED(arr)
LET sortedUnique = SORTED_UNIQUE(arr)
-- CONTAINS_ARRAY() - Array enthält Element ⚠️ Nicht implementiert
FILTER CONTAINS_ARRAY(doc.tags, "important")
-- ARRAY_AGG() - In Aggregation ⚠️ Nicht implementiert
COLLECT category = doc.category AGGREGATE items = ARRAY_AGG(doc)
Status: 18 Array-Funktionen in /include/query/functions/array_functions.h
Nicht vorhanden: CONTAINS_ARRAY, ARRAY_AGG, SORTED_UNIQUE
Lösung: FunctionRegistry-Integration (Aufwand: ~1 Woche)
-- DATE_NOW() - Aktueller Zeitstempel ⚠️ Implementiert, nicht integriert
LET now = DATE_NOW()
-- DATE_ISO8601(ts) - Timestamp zu ISO-String ⚠️ Implementiert, nicht integriert
LET isoStr = DATE_ISO8601(doc.timestamp)
-- DATE_TIMESTAMP(iso) - ISO-String zu Timestamp ⚠️ Implementiert, nicht integriert
LET ts = DATE_TIMESTAMP("2024-01-15T10:30:00Z")
-- DATE_YEAR/MONTH/DAY/HOUR/MINUTE/SECOND ⚠️ Implementiert, nicht integriert
LET year = DATE_YEAR(doc.created)
LET month = DATE_MONTH(doc.created)
-- DATE_ADD/SUBTRACT ⚠️ Implementiert, nicht integriert
LET nextWeek = DATE_ADD(now, 7, "day")
LET lastMonth = DATE_SUBTRACT(now, 1, "month")
-- DATE_DIFF ⚠️ Implementiert, nicht integriert
LET daysDiff = DATE_DIFF(start, end, "day")
-- DATE_TRUNC - Auf Periode runden ⚠️ Implementiert, nicht integriert
LET monthStart = DATE_TRUNC(doc.created, "month")
-- DATE_FORMAT ⚠️ Implementiert, nicht integriert
LET formatted = DATE_FORMAT(doc.created, "%Y-%m-%d")
-- DATE_COMPARE ⚠️ Implementiert, nicht integriert
FILTER DATE_COMPARE(doc.expires, now) > 0
Status: Vollständige Datum/Zeit-Bibliothek mit 54 Funktionen in /include/query/functions/date_functions.h
Zusätzlich verfügbar: CURRENT_TIMESTAMP, WORKDAYS, MAKE_DATE, AGE, IS_WEEKEND, und 40+ mehr
Lösung: FunctionRegistry-Integration (Aufwand: ~1 Woche)
-- FULLTEXT() - Volltextsuche ❌ NICHT IMPLEMENTIERT
FOR doc IN collection
FILTER FULLTEXT(doc.content, "search term")
RETURN doc
-- TOKENS() - Text tokenisieren ❌ NICHT IMPLEMENTIERT
LET words = TOKENS("Hello World", "text_en")
-- PHRASE() - Phrasensuche ❌ NICHT IMPLEMENTIERT
FILTER PHRASE(doc.content, "exact phrase")
-- LEVENSHTEIN_DISTANCE() - Edit-Distanz ❌ NICHT IMPLEMENTIERT
LET dist = LEVENSHTEIN_DISTANCE("hello", "hallo")
-- SOUNDEX() / METAPHONE() - Phonetische Suche ❌ NICHT IMPLEMENTIERT
FILTER SOUNDEX(doc.name) == SOUNDEX("Meyer")
-- NGRAM_MATCH() - N-Gram Matching ❌ NICHT IMPLEMENTIERT
FILTER NGRAM_MATCH(doc.title, "searc", 0.7)
-- REGEX_TEST() / REGEX_MATCHES() / REGEX_REPLACE() ❌ NICHT IMPLEMENTIERT
FILTER REGEX_TEST(doc.email, "^[a-z]+@")
LET matches = REGEX_MATCHES(doc.text, "\\d+")
LET cleaned = REGEX_REPLACE(doc.phone, "[^0-9]", "")
-- LIKE mit Wildcards ❌ NICHT IMPLEMENTIERT
FILTER doc.name LIKE "John%"
FILTER doc.code LIKE "A__B"
Status: Diese Funktionen sind im Sourcecode nicht vorhanden.
Quelle überprüft: /src/query/let_evaluator.cpp, /src/query/aql_translator.cpp
-- ROW_NUMBER() OVER ✅ IMPLEMENTIERT
FOR doc IN collection
LET rowNum = ROW_NUMBER() OVER (
PARTITION BY doc.category
ORDER BY doc.sales DESC
)
FILTER rowNum <= 3
RETURN doc
-- RANK() / DENSE_RANK() ✅ IMPLEMENTIERT
LET rank = RANK() OVER (ORDER BY doc.score DESC)
-- LAG() / LEAD() - Vorherige/Nächste Zeile ✅ IMPLEMENTIERT
LET prevValue = LAG(doc.value, 1) OVER (ORDER BY doc.date)
LET nextValue = LEAD(doc.value, 1) OVER (ORDER BY doc.date)
-- SUM/AVG/COUNT OVER (Fenster) ❌ NICHT IMPLEMENTIERT
LET runningSum = SUM(doc.amount) OVER (
ORDER BY doc.date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
-- MEDIAN() / PERCENTILE() ❌ NICHT IMPLEMENTIERT
LET median = MEDIAN(values)
LET p95 = PERCENTILE(values, 0.95)
Status: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD sind implementiert.
Quelle bestätigt: /src/query/window_evaluator.cpp, /include/query/window_evaluator.h
Nicht implementiert: Aggregat-Fenster-Funktionen (SUM/AVG OVER), MEDIAN, PERCENTILE
-- ALL_SHORTEST_PATHS ❌ NICHT IMPLEMENTIERT
FOR path IN ALL_SHORTEST_PATHS(start, end, { edgeCollection: "edges" })
RETURN path
-- K_SHORTEST_PATHS ❌ NICHT IMPLEMENTIERT
FOR path IN K_SHORTEST_PATHS(start, end, 5, { edgeCollection: "edges" })
RETURN path
-- WEIGHTED_SHORTEST_PATH ❌ NICHT IMPLEMENTIERT
LET path = WEIGHTED_SHORTEST_PATH(start, end, "distance")
-- PATH_LENGTH() / PATH_VERTICES() / PATH_EDGES() ❌ NICHT IMPLEMENTIERT
LET len = PATH_LENGTH(path)
LET nodes = PATH_VERTICES(path)
LET rels = PATH_EDGES(path)
-- Graph Algorithms als Funktionen ❌ NICHT IMPLEMENTIERT
LET communities = LOUVAIN_COMMUNITIES(graph)
LET centrality = BETWEENNESS_CENTRALITY(graph)
LET closeness = CLOSENESS_CENTRALITY(graph)
Status: Diese erweiterten Graph-Funktionen sind im Sourcecode nicht vorhanden.
Hinweis: Basis-Graph-Traversierung (FOR v IN 1..n OUTBOUND/INBOUND/ANY) und SHORTEST_PATH sind implementiert (siehe Sektion 1.4)
Quelle überprüft: /src/query/, /include/query/
-- VECTOR_DISTANCE() - Verschiedene Metriken ❌ NICHT IMPLEMENTIERT
LET dist = COSINE_SIMILARITY(vec1, vec2)
LET dist = EUCLIDEAN_DISTANCE(vec1, vec2)
-- VECTOR_NORMALIZE() ❌ NICHT IMPLEMENTIERT
LET normalized = L2_NORMALIZE(vec)
-- HYBRID_SEARCH() - Kombination von Vektor + Keyword ❌ NICHT IMPLEMENTIERT
FOR doc IN HYBRID_SEARCH(collection, query, vectorField, textField, {
vectorWeight: 0.7,
textWeight: 0.3
})
RETURN doc
-- RERANK() - Ergebnisse neu ordnen ❌ NICHT IMPLEMENTIERT
LET reranked = RERANK(results, query, "cross-encoder")
-- EMBED() - Text zu Vektor ❌ NICHT IMPLEMENTIERT
LET embedding = EMBED("This is a text", "text-embedding-3-small")
-- CLASSIFY() - Textklassifikation ❌ NICHT IMPLEMENTIERT
LET result = CLASSIFY(text, ["positive", "negative", "neutral"])
-- EXTRACT_ENTITIES() - NER ❌ NICHT IMPLEMENTIERT
LET entities = EXTRACT_ENTITIES(text, ["PERSON", "ORG", "LOCATION"])
Status: Diese Funktionen sind im Sourcecode nicht vorhanden.
Hinweis: Basis-Vektor-Funktionen SIMILARITY() und PROXIMITY() sind implementiert (siehe Sektion 1.3)
Quelle überprüft: /src/query/let_evaluator.cpp, /src/query/aql_translator.cpp
-- GEO_DISTANCE() - Haversine/Vincenty
LET km = GEO_DISTANCE(point1, point2, "km")
-- GEO_AREA() / GEO_LENGTH()
LET area = GEO_AREA(polygon)
LET length = GEO_LENGTH(linestring)
-- GEO_CENTROID()
LET center = GEO_CENTROID(polygon)
-- GEO_SIMPLIFY() - Geometrie vereinfachen
LET simple = GEO_SIMPLIFY(complexPolygon, 0.001)
-- GEO_VORONOI() / GEO_DELAUNAY()
LET voronoi = GEO_VORONOI(points)
-- H3_TO_GEO() / GEO_TO_H3() - H3 Hexagons
LET h3Index = GEO_TO_H3(point, 9)
LET center = H3_TO_GEO(h3Index)
-- ISOCHRONE() - Erreichbarkeitsanalyse
LET reachable = ISOCHRONE(point, 30, "minutes", "driving")
-- JSON_EXTRACT() / JSON_SET() / JSON_REMOVE()
LET value = JSON_EXTRACT(doc, "$.nested.field")
LET modified = JSON_SET(doc, "$.new.path", value)
LET cleaned = JSON_REMOVE(doc, "$.sensitive")
-- JSON_TYPE()
LET type = JSON_TYPE(doc.field) -- "object", "array", "string", etc.
-- JSON_KEYS() / JSON_VALUES()
LET keys = JSON_KEYS(doc.metadata)
-- JSON_ARRAY_LENGTH()
LET len = JSON_ARRAY_LENGTH(doc.items)
-- JSON_CONTAINS() / JSON_OVERLAPS()
FILTER JSON_CONTAINS(doc.tags, ["a", "b"])
-- Tief verschachtelte Pfade
FOR item IN doc.orders[*].items[*]
FILTER item.price > 100
RETURN item
-- Aggregationen
AGGREGATE {
mean: AVG(doc.value),
median: MEDIAN(doc.value),
mode: MODE(doc.category),
stddev: STDDEV(doc.value),
variance: VARIANCE(doc.value),
percentile_90: PERCENTILE(doc.value, 0.9),
iqr: IQR(doc.value)
}
-- Korrelation
LET corr = CORRELATION(xValues, yValues)
-- Regression
LET regression = LINEAR_REGRESSION(xValues, yValues)
-- Histogramm
LET hist = HISTOGRAM(doc.age, { bins: 10 })
-- Sampling
FOR doc IN SAMPLE(collection, 1000)
RETURN doc
-- RANDOM()
LET random = RANDOM()
LET randomInt = RANDOM_INT(1, 100)
-- OPTIONS Block für Funktionen
FOR v IN 1..5 OUTBOUND start edges
OPTIONS {
bfs: true,
uniqueVertices: "global",
maxDepth: 10
}
RETURN v
-- Named Parameters
LET result = SIMILARITY(
doc._embedding,
queryVector,
k: 10,
metric: "cosine",
filter: { category: "electronics" }
)
-- EXISTS Subquery
FOR doc IN orders
FILTER EXISTS (
FOR item IN doc.items
FILTER item.product == "special"
LIMIT 1
RETURN true
)
RETURN doc
-- NOT EXISTS
FOR customer IN customers
FILTER NOT EXISTS (
FOR order IN orders
FILTER order.customerId == customer._key
LIMIT 1
RETURN true
)
RETURN customer
-- Scalar Subquery
FOR doc IN documents
LET itemCount = (
FOR item IN doc.items
COLLECT WITH COUNT INTO c
RETURN c
)[0]
RETURN { doc, itemCount }
-- UPSERT (Insert or Update)
UPSERT { email: "user@example.com" }
INSERT { email: "user@example.com", name: "New User", created: DATE_NOW() }
UPDATE { lastLogin: DATE_NOW(), loginCount: OLD.loginCount + 1 }
IN users
-- MERGE INTO (SQL-Style)
MERGE INTO target
USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET target.value = source.value
WHEN NOT MATCHED THEN INSERT source
-- Explizite Transaktion
BEGIN TRANSACTION
INSERT { ... } INTO collection1
UPDATE { ... } IN collection2 WITH { ... }
REMOVE "key" FROM collection3
COMMIT
-- Savepoints
BEGIN TRANSACTION
INSERT { ... } INTO collection1
SAVEPOINT sp1
INSERT { ... } INTO collection2
ROLLBACK TO sp1 -- Nur zweites INSERT rückgängig
COMMIT
Hinweis: Diese Roadmap wurde aktualisiert, um den tatsächlichen Implementierungsstand zu reflektieren. Viele als "implementiert" markierte Funktionen sind noch nicht vorhanden.
- Basis-String-Funktionen: LENGTH, CONCAT, SUBSTRING, UPPER, LOWER
- Mathematische Funktionen: ABS, CEIL, FLOOR, ROUND, MIN, MAX
- Geo/Spatial-Funktionen: ST_Point, ST_Distance, ST_Within, ST_Contains, ST_Intersects, etc.
- Vektor-Funktionen: SIMILARITY, PROXIMITY
- Graph-Traversierung: FOR v IN 1..n OUTBOUND/INBOUND/ANY, SHORTEST_PATH
- Aggregation: COLLECT, COUNT, SUM, AVG
- Window Functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD
- DOCUMENT(), MERGE(), UNSET(), KEEP()
- HAS(), ATTRIBUTES(), VALUES()
- Array-Funktionen (FLATTEN, UNIQUE, UNION, INTERSECTION, MINUS, FIRST, LAST, NTH, SLICE, REVERSE, SORTED, SORTED_UNIQUE, CONTAINS_ARRAY)
- DATE_* Funktionen (alle): DATE_NOW, DATE_ISO8601, DATE_TIMESTAMP, DATE_YEAR, DATE_MONTH, DATE_DAY, DATE_HOUR, DATE_MINUTE, DATE_SECOND, DATE_ADD, DATE_SUBTRACT, DATE_DIFF, DATE_TRUNC, DATE_FORMAT, DATE_COMPARE
Priorität: HOCH - Diese sind Basis-Funktionalität für Dokument-Datenbanken
Aufwand: MITTEL - Können mit Standard-Bibliotheken implementiert werden
- FULLTEXT(), PHRASE()
- TOKENS(), NGRAM_MATCH()
- REGEX_TEST(), REGEX_MATCHES(), REGEX_REPLACE()
- LEVENSHTEIN_DISTANCE()
- SOUNDEX(), METAPHONE()
- LIKE mit Wildcards
Priorität: HOCH - Wichtig für Text-Suchfunktionalität
Aufwand: HOCH - FULLTEXT benötigt Text-Indexierung
- ROW_NUMBER(), RANK(), DENSE_RANK() - ✅ Implementiert
- LAG(), LEAD() - ✅ Implementiert
- Running Aggregates (SUM/AVG/COUNT OVER)
- NTILE(), PERCENT_RANK()
- MEDIAN(), PERCENTILE()
Priorität: MITTEL - Erweitert vorhandene Window Functions
Aufwand: MITTEL
- Basis-Traversierung (OUTBOUND/INBOUND/ANY) - ✅ Implementiert
- SHORTEST_PATH - ✅ Implementiert
- Pattern Matching (MATCH Syntax)
- ALL_SHORTEST_PATHS, K_SHORTEST_PATHS
- WEIGHTED_SHORTEST_PATH
- PATH_LENGTH(), PATH_VERTICES(), PATH_EDGES()
- Graph-Algorithmen als Funktionen (LOUVAIN_COMMUNITIES, BETWEENNESS_CENTRALITY, etc.)
Priorität: MITTEL - Erweitert vorhandene Graph-Funktionalität
Aufwand: HOCH - Benötigt Graph-Algorithmen-Bibliothek
- Basis-SIMILARITY() - ✅ Implementiert
- VECTOR_DISTANCE() mit verschiedenen Metriken (COSINE_SIMILARITY, EUCLIDEAN_DISTANCE)
- VECTOR_NORMALIZE(), L2_NORMALIZE()
- HYBRID_SEARCH()
- EMBED()
- RERANK()
- CLASSIFY()
- EXTRACT_ENTITIES()
Priorität: NIEDRIG - Enterprise-Features
Aufwand: SEHR HOCH - Benötigt ML-Framework-Integration
- Statistische Funktionen (MODE, STDDEV, VARIANCE, CORRELATION, LINEAR_REGRESSION, HISTOGRAM)
- RANDOM(), RANDOM_INT(), SAMPLE()
- Erweiterte Geo-Funktionen (GEO_DISTANCE, GEO_AREA, H3_*, etc.)
- JSON_* Funktionen (JSON_EXTRACT, JSON_SET, JSON_TYPE, etc.)
- UPSERT/MERGE Syntax
- EXISTS/NOT EXISTS Subqueries
- Transaktionale Kontrolle (BEGIN/COMMIT/ROLLBACK)
Priorität: NIEDRIG - Nice-to-have Features
Aufwand: VARIABEL (JSON: MITTEL, Transaktionen: SEHR HOCH)
| Feature | ArangoDB | Neo4j | PostgreSQL | MongoDB | ThemisDB (alt) | ThemisDB (neu) |
|---|---|---|---|---|---|---|
| FOR/FILTER/RETURN | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
| Graph Traversal (Basis) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Pattern Matching | ❌ | ✅ | ❌ | ❌ | 🔜 | ❌ |
| Window Functions | ❌ | ❌ | ✅ | ✅ | 🔜 | ✅ |
| FULLTEXT | ✅ | ✅ | ✅ | ✅ | 🔜 | ❌ |
| Vector Search | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ (Basis) |
| Geo/Spatial | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Aggregation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Subqueries | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Array Functions | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
| Date/Time Functions | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Document Functions | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
| Graph Algorithms | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ |
| UPSERT | ✅ | ✅ | ✅ | ✅ | 🔜 | ❌ |
Legende:
- ✅ = Vorhanden und funktionsfähig
- ❌ = Nicht vorhanden
- 🔜 = War als "geplant" markiert, aber nicht implementiert
- (Basis) = Nur grundlegende Funktionalität
Änderungen zwischen "ThemisDB (alt)" und "ThemisDB (neu)":
- Array Functions: ✅ → ❌ (dokumentiert aber nicht implementiert)
- Date/Time Functions: ✅ → ❌ (dokumentiert aber nicht implementiert)
- Document Functions: ✅ → ❌ (dokumentiert aber nicht implementiert)
- Graph Algorithms: ✅ → ❌ (dokumentiert aber nicht implementiert)
- Window Functions: 🔜 → ✅ (tatsächlich implementiert!)
- Pattern Matching: 🔜 → ❌ (geplant, nicht implementiert)
- FULLTEXT: 🔜 → ❌ (geplant, nicht implementiert)
- UPSERT: 🔜 → ❌ (geplant, nicht implementiert)
Tatsächliche Stärken von ThemisDB (Stand Dez. 2024):
- ✅ Robuste Basis-Abfragesprache (FOR/FILTER/RETURN)
- ✅ Funktionierende Graph-Traversierung (OUTBOUND/INBOUND/ANY, SHORTEST_PATH)
- ✅ Umfassende Geo/Spatial-Unterstützung (inkl. 3D)
- ✅ Basis-Vektor-Suche (SIMILARITY, PROXIMITY)
- ✅ Window Functions (ROW_NUMBER, RANK, LAG, LEAD)
- ✅ Basis-Aggregation (COLLECT, COUNT, SUM, AVG)
Hauptlücken (im Vergleich zu ArangoDB/MongoDB):
- ❌ Keine Array-Funktionen (FLATTEN, UNIQUE, etc.)
- ❌ Keine Datum/Zeit-Funktionen
- ❌ Keine Dokument-Funktionen (MERGE, UNSET, etc.)
- ❌ Keine Volltext-Suche
- ❌ Keine erweiterten Graph-Algorithmen
- Architecture-ACCESS-MODEL-IMPLEMENTATION-SUMMARY
- Architecture-ADR-003-pg-dump-sql-parser
- Architecture-BASEENTITY-PRINCIPLE
- Architecture-CACHE-STORAGE-INTEGRATION
- Architecture-CMAKE-ARCHITECTURE
- Architecture-CMAKE-FLAGS-REFERENCE
- Architecture-CMAKE-MODULAR-ARCHITECTURE
- Architecture-CONCERNS-ARCHITECTURE-DIAGRAM
- Architecture-CONCERNS-IMPLEMENTATION-SUMMARY
- Architecture-CONTENT-MODEL
- Architecture-COPILOT-THEMISDB-GRAPH-RAG-BACKEND-ARCHITECTURE
- Architecture-CRYPTO-AND-KEYS
- Architecture-FEATURE-FLAGS-REFERENCE
- Architecture-GPU-ARCHITECTURE-REVIEW-TEMPLATE
- Architecture-HTTP-SHUTDOWN-HARDENING
- Architecture-MIGRATION-GUIDE-CONCERNS
- Architecture-MIGRATION-GUIDE-v13-v14
- Architecture-MODULARIZATION-GUIDE
- Architecture-MODULAR-ARCHITECTURE-ROADMAP
- Architecture-MODULE-ARCHITECTURE-INDEX
- Architecture-P1D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D08-MAMBA-GOVERNANCE-CONTRACT
- Architecture-P1-P2-IMPLEMENTATION-COMPLETION-INDEX
- Architecture-PHASE0-COMPLETION-ASSESSMENT
- Architecture-PHASE3-QUERYENGINE-DI-ARCHITECTURE
- Architecture-PHASE4-INDEX-MANAGER-DI
- Architecture-POSTGRESQL-WIRE-PROTOCOL
- Architecture-QUERYENGINE-IMPLEMENTATION-GUIDE
- Architecture-QUERY-SCHEDULING
- Architecture-RAFT-CONSENSUS-DESIGN
- Architecture-README
- Architecture-README-SSM-HYBRID-IMPLEMENTATION
- Architecture-REFACTORING-SUMMARY
- Architecture-RESOURCE-POOLING
- Architecture-SOURCE-DIRECTORY-GUIDE
- Architecture-THEMIS-CORE-GUIDE
- Architecture-UNIFIED-ACCESS-MODEL
- Architecture-WAL-GRPC-MTLS-CONFIGURATION
- Architecture-WIRE-PROTOCOL-RETRY
- Architecture-boltzmann-observability-draft
- Architecture-experimental-logarithmic-vector-storage
- Architecture-llm-wiki-mvp-adr
- Architecture-rewrite-engine-architecture
- Architecture-rope-api-architecture
- Architecture-ssm-gguf-mamba-status
- Architecture-ssm-hybrid-analysis
- Architecture-ssm-hybrid-rollout-plan
- Architecture-ssm-plugin-interface-design-review
- Architecture-transaction-coordinators
- Architecture-wiki-secondary-index
- Architecture-wire-protocol
- Governance-DISABLED-STUB-POLICY
- Governance-DOCS-PR-POLICY
- Governance-GA-PROMOTION-SIGN-OFF
- Governance-GITHUB-MILESTONES-SETUP
- Governance-MATURITY-CLAIM-VERIFICATION-CHECKLIST
- Governance-MATURITY-EVIDENCE-REGISTRY
- Governance-MERGE-GATE-BOT-CONFIG
- Governance-MERGE-GATE-STATUS-LIVE
- Governance-PHASE3-ENFORCEMENT-RUNBOOK
- Governance-PHASE-1-CLOSURE-REPORT
- Governance-PHASE-CLOSURE-POLICY
- Governance-PHASE-DEPENDENCY-GRAPH
- Governance-PLUGIN-SUBMODULE-ROLLBACK
- Governance-PRODUCTION-READY-2026-DELIVERY-PLAN
- Governance-PR-VERSION-TARGETING
- Governance-PR-VERSION-TARGETING-BACKFILL
- Governance-QUERY-MODULE-STATUS
- Governance-README
- Governance-RELEASE-PROMOTION-GATE-POLICY
- Governance-RELEASE-VALIDATION-CHECKLIST
- Governance-SECURITY-MODULE-5671-EVIDENCE-SUMMARY
- Governance-SHARDING-P6-RESIDUAL-RISK-ACCEPTANCE
- Governance-SOURCECODE-COMPLIANCE-GOVERNANCE
- Governance-UPDATES-DEVELOPMENT-STATUS-SIGN-OFF
- Governance-WAVE-C-IMPLEMENTATION-COMPLETE
- Module-acceleration-Roadmap
- Module-access-model-Roadmap
- Module-ai-Roadmap
- Module-analytics-Roadmap
- Module-api-Roadmap
- Module-aql-Roadmap
- Module-auth-Roadmap
- Module-base-Roadmap
- Module-cache-Roadmap
- Module-cdc-Roadmap
- Module-chaos-Roadmap
- Module-chimera-Roadmap
- Module-config-Roadmap
- Module-content-Roadmap
- Module-core-Roadmap
- Module-distributed-knowledge-Roadmap
- Module-distributed-tensor-Roadmap
- Module-document-Roadmap
- Module-ethics-ai-Roadmap
- Module-evaluation-Roadmap
- Module-execution-Roadmap
- Module-exporters-Roadmap
- Module-failover-Roadmap
- Module-geo-Roadmap
- Module-governance-Roadmap
- Module-gpu-Roadmap
- Module-graph-Roadmap
- Module-image-analysis-Roadmap
- Module-importers-Roadmap
- Module-index-Roadmap
- Module-ingestion-Roadmap
- Module-llama-cpp-Roadmap
- Module-llm-Roadmap
- Module-llm-streaming-Roadmap
- Module-llm-wiki-Roadmap
- Module-maintenance-Roadmap
- Module-metadata-Roadmap
- Module-network-Roadmap
- Module-observability-Roadmap
- Module-onnx-clip-Roadmap
- Module-performance-Roadmap
- Module-plugins-Roadmap
- Module-process-Roadmap
- Module-projects-Roadmap
- Module-prompt-engineering-Roadmap
- Module-query-Roadmap
- Module-rag-Roadmap
- Module-replication-Roadmap
- Module-retrieval-Roadmap
- Module-rpc-grpc-Roadmap
- Module-scheduler-Roadmap
- Module-scraper-Roadmap
- Module-search-Roadmap
- Module-security-Roadmap
- Module-server-Roadmap
- Module-sharding-Roadmap
- Module-stable-diffusion-Roadmap
- Module-storage-Roadmap
- Module-temporal-Roadmap
- Module-tensor-Roadmap
- Module-themis-Roadmap
- Module-timeseries-Roadmap
- Module-toolbox-Roadmap
- Module-training-Roadmap
- Module-transaction-Roadmap
- Module-updates-Roadmap
- Module-user-storage-encrypted-Roadmap
- Module-utils-Roadmap
- Module-vector-search-Roadmap
- Module-voice-Roadmap
- Module-whisper-Roadmap