Neo4j + triplet
package main
import (
"context"
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
"log"
"os"
"fmt"
)
type Triplet struct {
Object string
Predicate string
Subject string
}
func main() {
ctx := context.TODO()
uri := "bolt://localhost:7687"
username := "neo4j"
password := "neo4jneo4j"
var driver neo4j.DriverWithContext
var session neo4j.SessionWithContext
var triplet Triplet
triplet.Object = os.Args[1]
triplet.Predicate = os.Args[2]
triplet.Subject = os.Args[3]
driver, err := createDriver(uri, username, password)
if err != nil {
log.Fatal(err)
}
session, err = createSession(ctx, driver)
if err != nil {
log.Fatal(err)
}
message, err := createTriplet(ctx, triplet, session)
if err != nil {
log.Fatal(err)
}
log.Println("message: ", message)
defer driver.Close(ctx)
defer session.Close(ctx)
}
func createDriver(uri, username, password string) (neo4j.DriverWithContext, error) {
driver, err := neo4j.NewDriverWithContext(uri, neo4j.BasicAuth(username, password, ""))
if err != nil {
return nil, err
}
return driver, nil
}
func createSession(ctx context.Context, driver neo4j.DriverWithContext) (neo4j.SessionWithContext, error) {
session := driver.NewSession(ctx, neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
return session, nil
}
func createTriplet(ctx context.Context, t Triplet, session neo4j.SessionWithContext) (string, error) {
var template = "MERGE (o:Node {name: \"%s\"}) " +
"MERGE (s:Node {name: \"%s\"}) " +
"MERGE (o)-[:%s]-(s)"
request := fmt.Sprintf(template, t.Object, t.Subject, t.Predicate)
_, err := session.ExecuteWrite(
ctx,
func(transaction neo4j.ManagedTransaction) (any, error) {
result, err := transaction.Run(ctx, request, map[string]any{})
if err != nil {
return nil, err
}
if result.Next(ctx) {
return result.Record().Values[0], nil
}
return nil, result.Err()
})
if err != nil {
return "", err
}
return "", nil
}