From 9276f2a57f7ffc3ac66e8e60777edfc2925c1e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandbox=20=F0=9F=A4=96?= Date: Mon, 24 Jun 2024 12:16:05 +0000 Subject: [PATCH] Triggered by direct commit. Origin: https://github.com/neo4j-contrib/sandbox-code-updater/commit/6953d1a1fcb08530eac459386fff16b6c4417cd5 --- code/go/example.go | 57 ++++++++++++++++---------------------- code/graphql/example.js | 24 ++++++++-------- code/javascript/example.js | 2 +- code/python/example.py | 24 ++++++++-------- 4 files changed, 48 insertions(+), 59 deletions(-) diff --git a/code/go/example.go b/code/go/example.go index 3366226..36f518b 100644 --- a/code/go/example.go +++ b/code/go/example.go @@ -3,9 +3,9 @@ package main import ( + "context" "fmt" - "github.com/neo4j/neo4j-go-driver/v4/neo4j" - "io" + "github.com/neo4j/neo4j-go-driver/v5/neo4j" "reflect" ) @@ -19,46 +19,37 @@ func main() { } } -func runQuery(uri, database, username, password string) (result []string, err error) { - driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, "")) +func runQuery(uri, database, username, password string) (_ []string, err error) { + ctx := context.Background() + driver, err := neo4j.NewDriverWithContext(uri, neo4j.BasicAuth(username, password, "")) if err != nil { return nil, err } - defer func() {err = handleClose(driver, err)}() - session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead, DatabaseName: database}) - defer func() {err = handleClose(session, err)}() - results, err := session.ReadTransaction(func(transaction neo4j.Transaction) (interface{}, error) { - result, err := transaction.Run( - ` - MATCH (m:Movie {title:$movie})<-[:RATED]-(u:User)-[:RATED]->(rec:Movie) - RETURN distinct rec.title AS recommendation LIMIT 20 - `, map[string]interface{}{ - "movie": "Crimson Tide", - }) + defer func() { err = handleClose(ctx, driver, err) }() + query := " MATCH (m:Movie {title:$movie})<-[:RATED]-(u:User)-[:RATED]->(rec:Movie) + RETURN distinct rec.title AS recommendation LIMIT 20 + params := map[string]any{"movie": "Crimson Tide"} + result, err := neo4j.ExecuteQuery(ctx, driver, query, params, + neo4j.EagerResultTransformer, + neo4j.ExecuteQueryWithDatabase(database), + neo4j.ExecuteQueryWithReadersRouting()) + if err != nil { + return nil, err + } + recommendations := make([]string, len(result.Records)) + for i, record := range result.Records { + // this assumes all actors have names, hence ignoring the 2nd returned value + name, _, err := neo4j.GetRecordValue[string](record, "recommendation") if err != nil { return nil, err } - var arr []string - for result.Next() { - value, found := result.Record().Get("recommendation") - if found { - arr = append(arr, value.(string)) - } - } - if err = result.Err(); err != nil { - return nil, err - } - return arr, nil - }) - if err != nil { - return nil, err + recommendations[i] = name } - result = results.([]string) - return result, err + return recommendations, nil } -func handleClose(closer io.Closer, previousError error) error { - err := closer.Close() +func handleClose(ctx context.Context, closer interface{ Close(context.Context) error }, previousError error) error { + err := closer.Close(ctx) if err == nil { return previousError } diff --git a/code/graphql/example.js b/code/graphql/example.js index e633a79..421b2b0 100644 --- a/code/graphql/example.js +++ b/code/graphql/example.js @@ -8,7 +8,7 @@ const driver = neo4j.driver( ); const typeDefs = /* GraphQL */ ` -type Movie { +type Movie @exclude(operations: [CREATE, UPDATE, DELETE]) { budget: Int countries: [String] imdbId: ID @@ -25,9 +25,9 @@ type Movie { tmdbId: String url: String year: Int - genres: [Genre] @relationship(type: "IN_GENRE", direction: OUT) - actors: [Actor] @relationship(type: "ACTED_IN", direction: IN) - directors: [Director] @relationship(type: "DIRECTED", direction: IN) + genres: [Genre!]! @relationship(type: "IN_GENRE", direction: OUT) + actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) + directors: [Director!]! @relationship(type: "DIRECTED", direction: IN) similar(first: Int = 3): [Movie] @cypher( statement: """ @@ -38,18 +38,18 @@ type Movie { ) } -type Genre { +type Genre @exclude(operations: [CREATE, UPDATE, DELETE]) { name: String - movies: [Movie] @relationship(type: "IN_GENRE", direction: IN) + movies: [Movie!]! @relationship(type: "IN_GENRE", direction: IN) } -type User { +type User @exclude(operations: [CREATE, UPDATE, DELETE]) { userId: ID! name: String - rated: [Movie] @relationship(type: "RATED", direction: OUT) + rated: [Movie!]! @relationship(type: "RATED", direction: OUT) } -type Actor { +type Actor @exclude(operations: [CREATE, UPDATE, DELETE]) { bio: String born: Date bornIn: String @@ -58,10 +58,10 @@ type Actor { poster: String tmdbId: String url: String - acted_in: [Movie] @relationship(type: "ACTED_IN", direction: OUT) + acted_in: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT) } -type Director { +type Director @exclude(operations: [CREATE, UPDATE, DELETE]) { bio: String bornIn: String imdbIb: String @@ -69,7 +69,7 @@ type Director { poster: String tmdbId: String url: String - directed: [Movie] @relationship(type: "DIRECTED", direction: OUT) + directed: [Movie!]! @relationship(type: "DIRECTED", direction: OUT) } `; diff --git a/code/javascript/example.js b/code/javascript/example.js index 7617cdc..212e226 100644 --- a/code/javascript/example.js +++ b/code/javascript/example.js @@ -3,7 +3,7 @@ const neo4j = require('neo4j-driver'); const driver = neo4j.driver('neo4j://:', neo4j.auth.basic('', ''), - {/* encrypted: 'ENCRYPTION_OFF' */}); + {}); const query = ` diff --git a/code/python/example.py b/code/python/example.py index fa6a896..235717f 100644 --- a/code/python/example.py +++ b/code/python/example.py @@ -1,22 +1,20 @@ -# pip3 install neo4j-driver +# pip3 install neo4j # python3 example.py from neo4j import GraphDatabase, basic_auth -driver = GraphDatabase.driver( - "neo4j://:", - auth=basic_auth("", "")) - cypher_query = ''' MATCH (m:Movie {title:$movie})<-[:RATED]-(u:User)-[:RATED]->(rec:Movie) RETURN distinct rec.title AS recommendation LIMIT 20 ''' -with driver.session(database="neo4j") as session: - results = session.read_transaction( - lambda tx: tx.run(cypher_query, - movie="Crimson Tide").data()) - for record in results: - print(record['recommendation']) - -driver.close() +with GraphDatabase.driver( + "neo4j://:", + auth=("", "") +) as driver: + result = driver.execute_query( + cypher_query, + movie="Crimson Tide", + database_="neo4j") + for record in result.records: + print(record['recommendation'])