Upgrade to Pro — share decks privately, control downloads, hide ads and more …

W-JAX 2024: SQL walks into a bar, "Hey Cypher, ...

W-JAX 2024: SQL walks into a bar, "Hey Cypher, can I join you?"

Eine Graph-Datenbank, eine 27 Jahre alte Spezifikation und eine generative KI gehen in eine Bar... Was wie ein Dad-Joke klingt, ist das neueste Projekt von Neo4j's Treiber-Team: Ein JDBC-Treiber für Neo4j, der Cypher (Neo4j's lingua franca), SQL und sogar natürliche Sprache versteht. In dieser Session zeigen wir, warum das JDBC API eine der erfolgreichsten Spezifikationen im Java-Umfeld ist und warum sie auch 2024 noch wertvoll ist, besonders für Hersteller von nicht-relationalen Datenbanken. Wir beleuchten die Architektur unseres JDBC-Treibers und erklären, wie wir verschiedene Eingaben in Cypher übersetzen. Unser Ziel ist es, viele ETL-Werkzeuge und Cloud-Plattformen zu unterstützen, die überwiegend nur SQL sprechen. Was also benötigt eine nahezu Schema-lose Datenbank, um SQL zu verstehen? Trägt unsere Architektur, um eines der großen Themen in 2024 - Retrieval Augmented GenAI (RAG) - selber zu nutzen? Wir schließen mit einer persönlichen Einschätzung der Risiken, die beim Einsatz von KI in einem solchen Thema entstehen.

Michael Simons

November 06, 2024
Tweet

More Decks by Michael Simons

Other Decks in Programming

Transcript

  1. 🚨 Safe harbour statement 🚨 • Dieser Vortrag enthält möglicherweise

    persönliche Meinungen. • Dieser Vortrag ist primär über JDBC, SQL und Cypher, und ein bisschen über GraphRAG und AI. Neo4j Inc. All rights reserved 2024 1 Michael Simons Java & Testcontainers Champion, Senior Staff Engineer bei Neo4j
  2. Eine Graph-Datenbank, eine 27 Jahre alte Spezifikation und generative AI

    gehen in eine Bar… Bisschen sperrig. Neo4j Inc. All rights reserved 2024 4
  3. SQL walks into a bar: Hey Cypher, can I join

    you? Neo4j Inc. All rights reserved 2024 5 Der neue Neo4j-JDBC-Treiber mit SQL-zu-Cypher-Übersetzung
  4. Agenda (Falls ihr noch nicht weggelaufen seit…) 1. Was war

    nochmal JDBC und warum braucht es einen weiteren Treiber für Neo4j? 2. Es geht nicht ohne Architektur 3. SQL zu Cypher Translator 4. Datenbankhersteller und Vektoren 5. Knowledge Graph und RAG 6. text2cypher 7. Demo Neo4j Inc. All rights reserved 2024 6
  5. Was war nochmal JDBC? Neo4j Inc. All rights reserved 2024

    7 Und warum noch einen weiteren Treiber / Connector für Neo4j…
  6. Wie kann ich aktuell Neo4j aus Tools und Programmen nutzen?

    Neo4j Inc. All rights reserved 2024 8
  7. Neo4j Inc. All rights reserved 2024 9 • Standard Bolt-Driver

    für Java • Darauf aufbauende Bibliotheken (Neo4j-OGM, Spring Data Neo4j, Quarkus-Integration u.v.m.) Siehe auch “Neo4j für Java-Developer” von Gerrit Meier: https://speakerdeck.com/meistermeier/neo4j-for-java-developers • Diverse Varianten älterer JDBC-Treiber ◦ Mein persönlicher “Jon-Snow-Moment” 2024: Eine Variante davon wurde von Simba entwickelt, einer der Firmen, die hinter dem ODBC Standard stehen Neo4j für Java-Entwickler:innen
  8. Neo4j Inc. All rights reserved 2024 10 Warum also noch

    einen Treiber? • JDBC ist allgegenwärtig und nach über 27 Jahren einer der stabilsten Standards, um von Java aus mit Datenbanken zu sprechen • Basis unzähliger anderer Bibliotheken mit höheren Abstraktionsgrad ◦ JPA / Hibernate ◦ Spring Data JDBC ◦ MyBatis ◦ Flyway ◦ Liquibase • Nicht-funktionale Erweiterungen wie Pooling, Retries u.ä. • De-facto Standard für Reporting Tools und vorherrschende Schnittstelle für clientseitiges Tooling • Ebenso in vielen Cloud-Datenbanken
  9. Worauf zielen wir ab? - Datenintegrationsdienste wie - AWS Glue

    - Informatica - Streamsets - JDBC basierte ETL-Werkzeuge Neo4j Inc. All rights reserved 2024 - Bessere Developer-Experience - Flache Lernkurve (JDBC ist bekannt, nur die Abfragesprache muss erlernt werden) 11 - in beiden Fällen: Software (und Menschen), die “nur” SQL sprechen
  10. Neo4j Inc. All rights reserved 2024 12 Was war nochmal

    JDBC? (1) • Java Database Connectivity, ursprünglich 1997(!) mit dem JDK 1.1 veröffentlicht: “…an API for Java which defines how a client may access a database.” • JDBC ist nicht Teil des SQL Standards • SQL/CLI (Call-Level Interface https://en.wikipedia.org/wiki/Call_Level_Interface) ist eine Erweiterung zu SQL:1999 • Maßgeblicher Ideengeber und Einfluss auf JDBC
  11. Neo4j Inc. All rights reserved 2024 13 Was war nochmal

    JDBC? (2) • 4 verschiedene Typen von JDBC Treibern: ◦ Typ 1: JDBC-ODBC bridge (Open Database Connectivity) ◦ Typ 2: Direkte, native Datenbank API (z.B. DuckDB JDBC Treiber nutzt die eingebettete Datenbank über JNI) ◦ Typ 3: Middleware basiert (JDBC-Aufrufe werden an eine Middleware geschickt und dort in native Aufrufe übersetzt) ◦ Typ 4: Netzwerk- und Datenbankprotokolle direkt in Java implementiert
  12. Neo4j Inc. All rights reserved 2024 14 Was war nochmal

    JDBC? (3) • ⚠ Basis-Package ist zwar java.sql.* mit unzähligen Bezügen zu SQL-Konzepten, ist aber am Ende nicht strikt an relationale Datenbanken gebunden • Verschiedene Statement stellen Möglichkeiten bereit, Abfragen auszuführen ◦ Ergebnisse sind zeilenorientiert (Genau wie Standard-Neo4j-Treiber) ◦ Zeilen sind spaltenorientiert (Neo4j denkt in “Properties”) ◦ Typen sind überwiegend Standard SQL Type, können aber auch komplexe Objekte sein • Abfragen werden üblicherweise als “SQL” bezeichnet, sind aber reine String Objekte: Go wild… 🤪
  13. Neo4j-JDBC Features • JDBC 4.3 • Typ 4: Netzwerk- und

    Datenbankprotokolle direkt in Java implementiert • Implementiert DatabaseMetaData und ResultSetMetaData ◦ So fern es möglich ist für eine schemalose Datenbank ◦ Hinreichend für viele ETL Tools Neo4j Inc. All rights reserved 2024 16 • “Pluggable”, d.h. es wurden keine Dinge implementiert, die es als Aufsatz gibt (Pools etc.) • SQL zu Cypher Übersetzung ◦ Für equivalente Cypher-Konzepte ◦ Konfigurierbar für Mappings (Label zu Tabellen etc.) ◦ Unterstützung unterschiedlicher SQL-Dialekte • SPI für eigene Übersetzungs-Module • Natürlich auch “plain” Cypher
  14. Neo4j Inc. All rights reserved 2024 18 Drei Säulen Erweiterbarkeit

    • Translator SPI ◦ Plugin-System auf Basis von ServiceLoader • Implementierungen: ◦ SQL To Cypher ◦ Natürliche Sprache als Eingabe (text2cypher) Netzwerkstack und Typsystem • Internal package im Core-Modul, nicht exportiert • Neo4j-Typ-System als öffentliche API Metadaten • Nutzung von Neo4j Metadata (db.info, db.schema, SHOW INDEXES, SHOW CONSTRAINTS) über DatabaseMetaData und ResultSetMetaData • Pluggable Cypher-Queries
  15. Java module system, warum? Neo4j Inc. All rights reserved 2024

    20 • Großartige Lösung für API Grenzen (exports und co.) • Auf dem Klassenpfad nur eine Warnung, aber diese erlaubt uns zu sagen: “Wir haben euch gewarnt!” 🤷 • Besser für ◦ Uns, da unsere Tests als Integrationstests auf dem Modulpfad laufen und wir ohne weiteres Tooling in API Grenzen gezwungen werden ◦ Uns, da Javas default Sichtbarkeit ausreicht, APIs klar abzugrenzen, ohne zusätzliche Module und Buildtools zu benötigen ◦ Benutzer, da diese eine klare API Beschreibung bekommen
  16. Wie funktioniert der Translator? Neo4j Inc. All rights reserved 2024

    23 SELECT title FROM movie WHERE name = ? Parsed Eingabe in einen SQL expression tree Select<?> statement Standard Tree-Traversal Neo4j Cypher-DSL A Cypher-Builder heavily inspired by jOOQ + (Augmented) Datenbankschema var m1 = Cypher.match(statement .$from() .stream().map( this::resolveTableOrJoin).toList()); var m2 = m1.where(condition( x.$where())); Neo4j Cypher-DSL Renderer MATCH (movie:movie) WHERE movie.name = $1 RETURN movie.title
  17. Neo4j Inc. All rights reserved 2024 24 Features • “On-Demand”

    Übersetzung via Connection#nativeSQL oder für alle Statements • Übersetzung des unqualifzierten Asterisks * in Attribute von Entitäten • Konfigurierbare SQL Dialekte • Opinionated Mapping von Joins • Konfigurierbare “Label to table” Mappings • Push down predicates • Parameter • -> Hilft uns, ihn besser zu machen! ETL und Desktop Analytics haben viel Spaß mit nested Queries etc, wir können nicht alle kennen!
  18. Large Language Models (LLMs) • Wahrscheinlichkeitsmodell aus dem Bereich der

    linguistischen Datenverarbeitung • Vorhersage von Ähnlichkeiten • Grundlage von Natural Language Processing (NLP) und Generierung von Texten und anderen Darstellungen (Bilder, Video, Audio) • LLMs ◦ Spalten Eingabetexte in Text.Tokens ◦ Transformieren diese Tokens in embeddings Neo4j Inc. All rights reserved 2024 26
  19. Embeddings aka Vektoren • Embeddings sind homogene, mathematische Repräsentationen von

    heterogenen Werten (Texte, Bilder, Audio) • Können von Machine Learning Models (ML) und semantischen Suchmechanismen gleichermaßene verwendet werden • Embeddings werden idR als Vektoren von float Werten dargestellt • Embeddings sind keine willkürlichen Collections ◦ Uniformer Datentyp ◦ Uniforme Dimensionen (Neo4j unterstützt 1 bis 4096) Neo4j Inc. All rights reserved 2024 27
  20. Funktionalität von LLMs basiert auf Vektoren • Kombinationen ◦ Vektoraddition

    und Subtraktion (“König-Mann+Frau=Königin”) • Euklidischer Abstand, Kosinus-Ähnlichkeit • Generierung neuer Embeddings über Word2Vec, seq2seq oder moderne Ansätze die Kontext bezogen arbeiten (BERT, GPT) • Datenbank-Unterstützung für ◦ Storage ◦ Indizierung ◦ Vektormathematik ◦ Suche und Abfragen Neo4j Inc. All rights reserved 2024 28 Euklidischer Abstand Skalarprodukt
  21. Neo4j und Embeddings • Vektor Indizes ◦ CREATE VECTOR INDEX

    film_index ◦ db.index.vector.queryNodes • GenAI Integration ◦ genai.vector.encode (Support für OpenAI, Azure, Bedrock u.a.) • Zukünftig direkte Integration externer Vektordatenbanken (Weaviate, Pinecone u.a.) Neo4j Inc. All rights reserved 2024 29
  22. Weitergehende Texte und Vorträge • https://www.golem.de/news/kuenstliche-intelligenz-so-funktioniert-chatgpt-230 2-171644.html • https://de.wikipedia.org/wiki/Large_Language_Model •

    https://jalammar.github.io/illustrated-word2vec • https://www.algolia.com/blog/ai/an-introduction-to-transformer-models-in-neura l-networks-and-machine-learning/ • https://en.wikipedia.org/wiki/Seq2seq • https://link.springer.com/article/10.1007/s10676-024-09775-5 • https://www.youtube.com/watch?v=Pv0cfsastFs (Beyond the Hype: A Realistic Look at Large Language Models von Jodie Burchell) Neo4j Inc. All rights reserved 2024 30
  23. Probleme mit LLMs • Energieaufwand für die Erstellung und für

    Training ist gigantisch ◦ Microsoft möchte z.B. gerne Three Mile Island wieder in Betrieb nehmen • Sozialer Art ◦ Training bias, kodifizierung sozialer und rassistischer Vorurteile ◦ Training im globalen Süden ◦ GTA (Grand Theft Autocomplete… Scraping all the things) • Inhaltlicher Art ◦ “Cut off dates”: Keine aktuellen Daten ◦ Mangelnde Verifizierbarkeit / Erklärbarkeit ◦ “Halluzinationen” (Ergebnis klingt realistisch, ist aber falsch / unwahr) ◦ Bias Neo4j Inc. All rights reserved 2024 31
  24. Retrieval Augmented Generation: RAG Neo4j Inc. All rights reserved 2024

    33 Quelle: https://neo4j.com/developer-blog/fine-tuning-vs-rag/
  25. Wissensdatenbank als Grundlage für RAG • Graphendatenbanken eignen sich hervorragend

    für stark vernetzte Themen • Neo4j ist eine sehr gute Wahl, um einen “Knowledge Graph” zu speichern • Knowledge Graphs existieren in unterschiedlicher Form ◦ Lexical Graph (Repräsentation von großen Objekten in kleinen Häppchen (“Chunks”), als Container für Embeddings ◦ Domain spezifischer Graph (Beinhaltet Domänenspezifisches Wissen, i.e. Entitäten und ihrer Beziehungen zueinander) ◦ Kombination aus beiden: Lexical Graph mit Beziehungen zu Domain Entitäten Neo4j Inc. All rights reserved 2024 34
  26. Knowledge graphs als Grundlage für RAG Neo4j Inc. All rights

    reserved 2024 35 Lexical Graph Lexical Graph mit Entitäten https://graphr.ag/reference/knowledge-graph/lexical-graph/
  27. Neo4j und RAG • Smarte Anfragen über db.index.vector.queryNodes • Zusammenstellen

    von “Dokumenten” • Übergabe an System- und Benutzerprompt Neo4j Inc. All rights reserved 2024 36
  28. Weiterführendes Neo4j Inc. All rights reserved 2024 37 Beleuchtet viele

    Stellen, an denen AI wenig fördlicher für eine offene Gesellschaft ist. Graph-Algorithmen ohne “AI” mit plausiblen Ergebnissen GraphRAG im Detail https://graphr.ag
  29. text2cypher • Nutzt einen Domain-Graphen (das Datenbank Schema) ◦ JDBC

    Metadata oder erweiterte Datenbankfunktionen • Nachbearbeitung der generierten Statements mit Cypher-DSL ◦ Preparsing des Statements ◦ Überprüfung, ob kein keine Labels oder Relations erfunden wurden ◦ Überprüfung der Richtung • Implementiert mit langchain4j Neo4j Inc. All rights reserved 2024 39
  30. text2cypher: Erstellung des Models Neo4j Inc. All rights reserved 2024

    40 String baseUrl = (String) config.get(CONFIG_KEY_OPEN_AI_BASE_URL); var model = OpenAiChatModel.builder() .baseUrl(baseUrl) .modelName(modelName) .temperature(temperature) .apiKey(openAIApiKey) .build(); this.cypherExpert = AiServices. builder(CypherExpert. class) .chatLanguageModel (model).build(); Default: gpt-4-turbo Wir arbeiten gerade an einem optimierten text2cypher Model!
  31. text2cypher: CypherExpert Neo4j Inc. All rights reserved 2024 41 interface

    CypherExpert { @SystemMessage (""" Given an input question, translate it to a Cypher query. Respond without formatting and pre-amble." "") @UserMessage(""" Based on the Neo4j graph schema below, write a Cypher query that would answer the user's question: {{schema}} Question: {{question}} """ ) String translate(@V("schema") Schema schema, @V("question") String question); }
  32. RAG in text2cypher Neo4j Inc. All rights reserved 2024 42

    var schema = Schema.from(optionalDatabaseMetaData.getConnection()); var cypher = this.cypherExpert.translate( schema, question); LOGGER.log(Level.INFO, "Intermediate query ''{0}''" , new Object[] { cypher }); cypher = schema.enforceRelationships (cypher); LOGGER.log(Level.INFO, "Final query ''{0}''" , new Object[] { cypher }); “Retrieve” Schema Augment and Generate Postprocessing
  33. Dankeschön! Neo4j Inc. All rights reserved 2024 44 Kontakt [email protected]

    (Un)soziale Medien @rotnroll666(@mastodon.social) Profil https://github.com/michael-simons Neo4j-JDBC https://github.com/neo4j/neo4j-jdbc Ich schreibe Bücher: