We are all on a journey. Thanks for taking a peek into mine!
Blog
Exploring Text-to-Cypher: Integrating Ollama, MCP, and Spring AI
Photo credit When text-to-query approaches (specifically, text2cypher) first entered the scene, I was a bit uncertain how it was useful, especially when existing models were hit-or-miss on result accuracy. It would be hard to justify the benefits over a human expert in the domain and query language.
However, as technologies have evolved over the last couple of years, I’ve started to see how a text-to-query approach adds flexibility to rigid applications that could previously only answer a set of pre-defined questions with limited parameters.
read moreBlog
Quarkus Neo4j: How to build a Quarkus app with Neo4j
Photo credit I’ve recently been working on expanding my horizons in different Java frameworks, and Quarkus was on my list to try.
Quarkus is a Kubernetes-native Java framework designed to reduce an application’s footprint, ideal for addressing challenges in deploying, running, and maintaining applications in cloud-based environments.
It has become a major player in list of frameworks, so naturally, I wanted to try it out! I started by following the first few steps in this blog post, as it outlines how to get a project up and running and the dependency needed for Neo4j.
read moreBlog
Basic OGM: Object Mapping in the Neo4j Java Driver
Photo credit As of the Neo4j Java Driver 5.28.5, the driver now includes a basic object mapping feature. This allows you to map Java objects to Neo4j nodes and relationships without needing to do so manually or deal with raw results.
Note: The driver’s new object mapping is not a full-fledged Object Graph Mapping (OGM) solution. For a more comprehensive option, check out the Neo4j OGM library.
Code example I put together a brief example of how to use the new object mapping feature in a Maven project.
read moreBlog
Intro to RAG: Foundations of Retrieval Augmented Generation, part 2
Photo credit In the last post, we discussed the basics of Retrieval Augmented Generation (RAG) and how it enhances the capabilities of Large Language Models (LLMs) by integrating them with external knowledge sources. We also introduced the concept of vector embeddings and their role in semantic search.
In this post, we’ll dive deeper into the different layers of RAG, including vector RAG, graph RAG, and agents. We’ll explore how these layers can be combined to create more powerful and effective AI systems.
read moreBlog
Intro to RAG: Foundations of Retrieval Augmented Generation, part 1
Photo credit Retrieval Augmented Generation (RAG) may sound complex, but it accurately represents the process of the system. RAG is a method that enhances the capabilities of Large Language Models (LLMs) by integrating them with external knowledge sources.
Each term represents a piece of the puzzle:
Retrieval - data retrieved from some external source outside the LLM (most often a database, but can include files, webpages, etc)
Augmented - "augmenting" (or adding to) an LLM’s training data.
read moreBlog
GenAI blood, sweat, and tears: Loading data to Pinecone
Photo credit As someone who is pretty familiar with relational and graph databases, I wanted to dig a little deeper into vector databases and understand the strengths and quirks they bring to the database table. I put together a conference abstract on vector RAG versus GraphRAG which got picked up, so I went to work building a demo and learning all I could.
I pivoted a few times along the way, but ended up with a Spring AI application that connects to both Pinecone (vector database) and Neo4j (graph database).
read moreBlog
How-To: Use Cypher DSL for programmatic queries
Photo credit I recently had the opportunity to play with the Cypher DSL (domain-specific language) library, and I found it difficult to figure out syntax for some of the queries I was trying to construct.
This blog post will hopefully help you understand how to construct your own programmatic queries with Cypher DSL by showing you syntax for nodes, relationships, and filtering. Then see how this in action with some examples for assembling those components into full queries translated from common clauses, functions, and result formats in Cypher.
read moreBlog
Adventures in Git: Resetting repositories when you end up in a mess
Photo credit Just when I’m feeling pretty confident about my git skills, I run into a scenario like this one that backpedals my confidence. I keep learning, though, and small improvements are still progress. :)
A few weeks ago, I was working on an update to the Graphacademy Spring Data Neo4j course, and things got out of sync. Before I knew it, I was stuck in merge conflict hell and wondering how I got there and if/how I could ever get out.
read moreBlog
Spring Data Neo4j: How to update an entity, Part 2
Photo credit After working on a new online Spring Data Neo4j course, I learned a couple more things about updating an entity. The course required a different set of scenarios than outlined in my previous SDN update blog post, so I wanted to cover those scenarios, as well.
Spring save() method First up is the out-of-the-box save() method that is provided by Spring as a default. This method takes an input of the entity object you want to save to the database.
read more