I tend to reach for Elixir followed by Rust. Next, I enjoy building servers using gRPC.
Hey Neo4j team!
I'm using Python with FastAPI on the backend to build a GraphRAG system, integrating Neo4j for graph-based retrieval and Redis for semantic caching.
One thing I'd love to see more of is caching support directly in the Neo4j layer maybe some native or plugin-based support for semantic or query result caching to reduce redundant traversals and improve response times.
Keep up the awesome work, excited to see where Neo4j goes next!
Thank you @cnc. Appreciate your comment and social last week. Iβll share you feature request.
Thanks so much @Ari_Neo4j, really appreciate you sharing that with the team!
Excited to see how things evolve and happy to help test or share more context. Cheers!
I use Typescript because its a common language as the front end. Keeps it simple for a small team.
@Ari_Neo4j My partner wrote this lib: GitHub - full-spectrum/neo4clj: Clojure Neo4J driver
to have a Clojure feel interacting with Neo4J.
We tried using Clojure data structures as input (representing Cypher), but to be honest it was much easier to just work with Cypher directly as strings. Also, it is easier to debug with "the strings" when trying to run the same stuff in the browser.
So we ended up with code looking like:
(defn fetch
[campaign-slug]
{:pre [(spec/valid? ::spec-rule/slug campaign-slug)]}
(some-> (db/read "MATCH (c:Campaign {slug: $campaignSlug}) WHERE NOT (:Partner)-[:STOPPED]->(c) RETURN c"
{:campaignSlug campaign-slug})
first
(get-in ["c" :props])))
and:
(defn stop
[audit-info slug]
{:pre [(spec/valid? ::audit/info audit-info)
(spec/valid? ::spec-rule/slug slug)]}
(some->
(db/write
"MATCH (ap:Partner {slug: $auditPartner}) WHERE NOT exists((:Partner)-[:ARCHIVED]->(ap))
MATCH (c:Campaign {slug: $slug}) WHERE NOT (:Partner)-[:STOPPED]->(c)
CREATE (ap)-[:STOPPED $whoAndWhen]->(c)
RETURN c.slug AS replaced"
(assoc audit-info :slug slug})) ; audit-info is a map with :auditPartner and :whoAndWhen
first
(get "replaced")))
The db/read
and db/write
functions make sure that Clojure data structures are returned instead of Java Objects. We use the first
function because we know that we either get a single result or an empty list.
A few of the Cyphers we are working with are quite long (40+ lines with a couple of comments). But we try to leverage the indexes of the database as much as possible to avoid post-processing data in code.
We are still looking for a good way to intercept data in the middle of the Cypher for live debugging in Clojure.
It is not always clear which filter has been implemented wrongly and are excluding more than it should.
I don't have any actual usage that is Open Source.
Clojure, building a LLM/data integration/everything framework.
Medium level Soydev & recovering mechanical engineer turned everything.
Multi domain network fusion project with user and worker inputs. One domain of this is more classic KG but the project takes a wider systems view. Using polyglot storage (graph in neo, metadata in relational, and blobs etc in other).
Python because of data orchestration tools like Dagster. ML workflows. FastAPI performance. Ease and my familiarity etc.
Was initially focused on data collection with plans to use off-the-shelf graph vis/analytics incl Bloom etc. But now equally concerned with frontend UI (Typescript), data entry & communication.
Forced to reflect on my sins for division of codebases & tooling.
We use F# on .NET to connect to Neo4j.
I am surprised that so many people use Python. We had a lot of issues with the Python driver especially when used from a container hosted on Azure. Basically, it kept losing its connection to the Neo4j DB.
Thanks for sharing Python is a programming language that lets you work quickly and integrate systems more effectively
Working with Java under the assumption that the Java driver is the reference implementation and therefore promises the least number of problems of all implementations.
I know for me, and I believe for others here, learning about the business case behind using less common developer languages is always super interesting. If you're open to sharing more, I'd love to hear what you're building and what led you to choose F# in particular. It's always cool to see how and why teams lean into something like F#βespecially when connecting to Neo4j!
My application is a standard web app, featuring a React/TypeScript frontend that communicates with a Java/Spring backend via REST APIs. The frontend is intentionally decoupled and has no knowledge of the underlying graph data model.
The backend employs a microservice architecture, fronted by a single Spring Cloud Gateway that handles request routing and integrates with our enterprise authentication services.
Behind the gateway, specific microservices orchestrate business logic. These coordinating services delegate tasks to specialized data-access microservices. One such microservice interacts exclusively with our Neo4j graph database; it receives API requests (forwarded from the gateway), performs validation checks, and uses CypherDSL to translate these requests into Cypher queries for Neo4j which are then executed via java neo4j driver. Other data-access microservices manage data persistence using PostgreSQL databases.
This multi-layered microservice approach, while complex, is necessary to integrate with mandatory enterprise services (like shared authentication) and allows our different data stores (Neo4j and PostgreSQL) to operate cohesively within our broader infrastructure.
Long time .Net Dev, so C# is my GOTO language Of course, if there was a driver for QBASIC, I'd probably look around for an Apple IIc emulator so I could play around with it LOL.
What are we building? - A Visual Metadata management tool called Anansi. Here is the website: https://www.anansihub.com
Why F# in particular?
- It runs on .NET Core. I can use any library that was built in C# in my application.
- It's functional language - No nasty OOPS. I can have a reasonable simple code. Easy to read.
- It's highly type safe. There are some powerful data structures that are available here that are not available in other languages. This allows you to do some powerful type checking at compile time itself. A lot of the domain logic is covered in the design of the data structures itself.
- If I had to go with some other language, I think we would need to hire a dedicated QA for ironing out bugs in the application. But with F#, a lot of the issues are caught in compile time itself.
Wow - really cool! Thanks for sharing with us.
The good ole Apple IIc - I remember it well.
It was the computer I wrote my first lines of code. I was in the 7th grade and at that moment I knew I wanted to write code for the rest of my life :)