Neo4j Example
This project demonstrates how to connect to a Neo4j database in a Go application using the Fiber framework.
Prerequisites
Ensure you have the following installed:
- Golang
- Fiber package
- Neo4j
- Neo4j Go Driver
Setup
-
Clone the repository:
git clone https://github.com/gofiber/recipes.gitcd recipes/neo4j -
Install dependencies:
go get -
Set up your Neo4j database and export connection settings:
export NEO4J_URI=neo4j://localhost:7687export NEO4J_USER=neo4jexport NEO4J_PASSWORD=passwordexport NEO4J_DATABASE=moviesOr start Neo4j via Docker Compose:
docker compose up -d
Running the Application
- Start the application:
go run main.go
Example
Here is an example of how to connect to a Neo4j database in a Fiber application:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/gofiber/fiber/v3"
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
)
type Movie struct {
Title string `json:"title"`
Tagline string `json:"tagline"`
Released int64 `json:"released"`
Director string `json:"director"`
}
func envOrDefault(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func main() {
uri := envOrDefault("NEO4J_URI", "neo4j://localhost:7687")
user := envOrDefault("NEO4J_USER", "neo4j")
password := envOrDefault("NEO4J_PASSWORD", "password")
database := envOrDefault("NEO4J_DATABASE", "movies")
driver, err := neo4j.NewDriverWithContext(uri, neo4j.BasicAuth(user, password, ""))
if err != nil {
log.Fatal(err)
}
defer func() {
if closeErr := driver.Close(context.Background()); closeErr != nil {
log.Printf("failed to close neo4j driver: %v", closeErr)
}
}()
if err := driver.VerifyConnectivity(context.Background()); err != nil {
log.Fatal(err)
}
app := fiber.New()
app.Post("/movie", func(c fiber.Ctx) error {
movie := new(Movie)
if err := c.Bind().Body(movie); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
}
ctx := c.Context()
session := driver.NewSession(ctx, neo4j.SessionConfig{
DatabaseName: database,
AccessMode: neo4j.AccessModeWrite,
})
defer func() { _ = session.Close(ctx) }()
query := `CREATE (n:Movie {title: $title, tagline: $tagline, released: $released, director: $director})`
_, err := session.ExecuteWrite(ctx, func(tx neo4j.ManagedTransaction) (any, error) {
_, runErr := tx.Run(ctx, query, map[string]any{
"title": movie.Title, "tagline": movie.Tagline,
"released": movie.Released, "director": movie.Director,
})
return nil, runErr
})
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.Status(fiber.StatusCreated).JSON(movie)
})
app.Get("/movie/:title", func(c fiber.Ctx) error {
title := c.Params("title")
ctx := c.Context()
session := driver.NewSession(ctx, neo4j.SessionConfig{
DatabaseName: database,
AccessMode: neo4j.AccessModeRead,
})
defer func() { _ = session.Close(ctx) }()
query := `MATCH (n:Movie {title: $title})
RETURN n.title AS title, n.tagline AS tagline, n.released AS released, n.director AS director`
result, err := session.ExecuteRead(ctx, func(tx neo4j.ManagedTransaction) (any, error) {
res, runErr := tx.Run(ctx, query, map[string]any{"title": title})
if runErr != nil {
return nil, runErr
}
if !res.Next(ctx) {
if res.Err() != nil {
return nil, res.Err()
}
return nil, nil
}
row := res.Record().AsMap()
return Movie{
Title: row["title"].(string),
Tagline: row["tagline"].(string),
Released: row["released"].(int64),
Director: row["director"].(string),
}, nil
})
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
if result == nil {
return c.SendStatus(fiber.StatusNotFound)
}
return c.Status(fiber.StatusOK).JSON(result)
})
log.Fatal(app.Listen(":3000"))
}
curl Examples
Create a movie:
curl -X POST http://localhost:3000/movie \
-H "Content-Type: application/json" \
-d '{"title":"The Matrix","tagline":"Welcome to the Real World","released":1999,"director":"Lana Wachowski"}'
Get a movie by title:
curl http://localhost:3000/movie/The%20Matrix