diff --git a/examples/src/main/java/org/neo4j/docs/driver/AsyncAutocommitTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/AsyncAutocommitTransactionExample.java index a77113430a..b15383386e 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/AsyncAutocommitTransactionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/AsyncAutocommitTransactionExample.java @@ -18,15 +18,10 @@ */ package org.neo4j.docs.driver; -// tag::async-autocommit-transaction-import[] - -import org.neo4j.driver.async.AsyncSession; - import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CompletionStage; -// end::async-autocommit-transaction-import[] public class AsyncAutocommitTransactionExample extends BaseApplication { public AsyncAutocommitTransactionExample(String uri, String user, String password) { @@ -35,10 +30,10 @@ public AsyncAutocommitTransactionExample(String uri, String user, String passwor // tag::async-autocommit-transaction[] public CompletionStage> readProductTitles() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); + var query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; + var parameters = Map.of("id", 0); - AsyncSession session = driver.asyncSession(); + var session = driver.asyncSession(); return session.runAsync(query, parameters) .thenCompose(cursor -> cursor.listAsync(record -> record.get(0).asString())) diff --git a/examples/src/main/java/org/neo4j/docs/driver/AsyncResultConsumeExample.java b/examples/src/main/java/org/neo4j/docs/driver/AsyncResultConsumeExample.java index d3fa0f54db..9bf051fc31 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/AsyncResultConsumeExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/AsyncResultConsumeExample.java @@ -18,26 +18,21 @@ */ package org.neo4j.docs.driver; -// tag::async-result-consume-import[] - -import org.neo4j.driver.async.AsyncSession; +import org.neo4j.driver.Query; import java.util.List; import java.util.concurrent.CompletionStage; -// end::async-result-consume-import[] public class AsyncResultConsumeExample extends BaseApplication { public AsyncResultConsumeExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::async-result-consume[] public CompletionStage> getPeople() { - - String query = "MATCH (a:Person) RETURN a.name ORDER BY a.name"; - AsyncSession session = driver.asyncSession(); - return session.readTransactionAsync(tx -> tx.runAsync(query) + var query = new Query("MATCH (a:Person) RETURN a.name ORDER BY a.name"); + var session = driver.asyncSession(); + return session.executeReadAsync(tx -> tx.runAsync(query) .thenCompose(cursor -> cursor.listAsync(record -> record.get(0).asString()))); } // end::async-result-consume[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/AsyncRunMultipleTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/AsyncRunMultipleTransactionExample.java index 7b108d1fe4..b29e372fd0 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/AsyncRunMultipleTransactionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/AsyncRunMultipleTransactionExample.java @@ -18,10 +18,7 @@ */ package org.neo4j.docs.driver; -// tag::async-result-consume-import[] - -import org.neo4j.driver.async.AsyncSession; -import org.neo4j.driver.async.AsyncTransaction; +import org.neo4j.driver.async.AsyncTransactionContext; import org.neo4j.driver.async.ResultCursor; import org.neo4j.driver.summary.ResultSummary; import org.neo4j.driver.summary.SummaryCounters; @@ -31,42 +28,32 @@ import java.util.concurrent.CompletionStage; import static org.neo4j.driver.Values.parameters; -// end::async-result-consume-import[] public class AsyncRunMultipleTransactionExample extends BaseApplication { public AsyncRunMultipleTransactionExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::async-multiple-tx[] public CompletionStage addEmployees(final String companyName) { - AsyncSession session = driver.asyncSession(); - - return session.readTransactionAsync(AsyncRunMultipleTransactionExample::matchPersonNodes) - .thenCompose( - personNames -> session.writeTransactionAsync(tx -> createNodes(tx, companyName, personNames))); + var session = driver.asyncSession(); + return session.executeReadAsync(AsyncRunMultipleTransactionExample::matchPersonNodes) + .thenCompose(personNames -> session.executeWriteAsync(tx -> createNodes(tx, companyName, personNames))); } - private static CompletionStage> matchPersonNodes(AsyncTransaction tx) { + private static CompletionStage> matchPersonNodes(AsyncTransactionContext tx) { return tx.runAsync("MATCH (a:Person) RETURN a.name AS name") - .thenCompose( - cursor -> cursor.listAsync(record -> record.get("name").asString())); + .thenCompose(cursor -> cursor.listAsync(record -> record.get("name").asString())); } - private static CompletionStage createNodes( - AsyncTransaction tx, String companyName, List personNames) { + private static CompletionStage createNodes(AsyncTransactionContext tx, String companyName, List personNames) { return personNames.stream() .map(personName -> createNode(tx, companyName, personName)) - .reduce( - CompletableFuture.completedFuture(0), - (stage1, stage2) -> stage1.thenCombine(stage2, Integer::sum)); + .reduce(CompletableFuture.completedFuture(0), (stage1, stage2) -> stage1.thenCombine(stage2, Integer::sum)); } - private static CompletionStage createNode(AsyncTransaction tx, String companyName, String personName) { - return tx.runAsync( - "MATCH (emp:Person {name: $person_name}) " + "MERGE (com:Company {name: $company_name}) " - + "MERGE (emp)-[:WORKS_FOR]->(com)", + private static CompletionStage createNode(AsyncTransactionContext tx, String companyName, String personName) { + return tx.runAsync("MATCH (emp:Person {name: $person_name}) MERGE (com:Company {name: $company_name}) MERGE (emp)-[:WORKS_FOR]->(com)", parameters("person_name", personName, "company_name", companyName)) .thenCompose(ResultCursor::consumeAsync) .thenApply(ResultSummary::counters) diff --git a/examples/src/main/java/org/neo4j/docs/driver/AsyncTransactionFunctionExample.java b/examples/src/main/java/org/neo4j/docs/driver/AsyncTransactionFunctionExample.java index 6efac6db3d..0f32b9841c 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/AsyncTransactionFunctionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/AsyncTransactionFunctionExample.java @@ -18,22 +18,18 @@ */ package org.neo4j.docs.driver; -// tag::async-transaction-function-import[] - import org.neo4j.driver.async.AsyncSession; import org.neo4j.driver.summary.ResultSummary; import java.util.Collections; import java.util.Map; import java.util.concurrent.CompletionStage; -// end::async-transaction-function-import[] public class AsyncTransactionFunctionExample extends BaseApplication { public AsyncTransactionFunctionExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::async-transaction-function[] public CompletionStage printAllProducts() { String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; @@ -41,7 +37,7 @@ public CompletionStage printAllProducts() { AsyncSession session = driver.asyncSession(); - return session.readTransactionAsync(tx -> tx.runAsync(query, parameters) + return session.executeReadAsync(tx -> tx.runAsync(query, parameters) .thenCompose(cursor -> cursor.forEachAsync(record -> // asynchronously print every record System.out.println(record.get(0).asString())))); diff --git a/examples/src/main/java/org/neo4j/docs/driver/AsyncUnmanagedTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/AsyncUnmanagedTransactionExample.java deleted file mode 100644 index 5d85672721..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/AsyncUnmanagedTransactionExample.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::async-unmanaged-transaction-import[] - -import org.neo4j.driver.async.AsyncSession; -import org.neo4j.driver.async.AsyncTransaction; -import org.neo4j.driver.async.ResultCursor; - -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.CompletionStage; -import java.util.function.Function; -// end::async-unmanaged-transaction-import[] - -public class AsyncUnmanagedTransactionExample extends BaseApplication { - public AsyncUnmanagedTransactionExample(String uri, String user, String password) { - super(uri, user, password); - } - - // tag::async-unmanaged-transaction[] - public CompletionStage printSingleProduct() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - - AsyncSession session = driver.asyncSession(); - - Function> printSingleTitle = tx -> tx.runAsync(query, parameters) - .thenCompose(ResultCursor::singleAsync) - .thenApply(record -> record.get(0).asString()) - .thenApply(title -> { - // single title fetched successfully - System.out.println(title); - return true; // signal to commit the transaction - }) - .exceptionally(error -> { - // query execution failed - error.printStackTrace(); - return false; // signal to rollback the transaction - }) - .thenCompose(commit -> commit ? tx.commitAsync() : tx.rollbackAsync()); - - return session.beginTransactionAsync() - .thenCompose(printSingleTitle) - .exceptionally(error -> { - // either commit or rollback failed - error.printStackTrace(); - return null; - }) - .thenCompose(ignore -> session.closeAsync()); - } - // end::async-unmanaged-transaction[] -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/AutocommitTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/AutocommitTransactionExample.java index 16e10b516d..0ac610d06e 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/AutocommitTransactionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/AutocommitTransactionExample.java @@ -18,12 +18,7 @@ */ package org.neo4j.docs.driver; -// tag::autocommit-transaction-import[] - -import org.neo4j.driver.Session; - import static org.neo4j.driver.Values.parameters; -// end::autocommit-transaction-import[] public class AutocommitTransactionExample extends BaseApplication { public AutocommitTransactionExample(String uri, String user, String password) { @@ -32,7 +27,7 @@ public AutocommitTransactionExample(String uri, String user, String password) { // tag::autocommit-transaction[] public void addPerson(String name) { - try (Session session = driver.session()) { + try (var session = driver.session()) { session.run("CREATE (a:Person {name: $name})", parameters("name", name)); } } diff --git a/examples/src/main/java/org/neo4j/docs/driver/BasicAuthExample.java b/examples/src/main/java/org/neo4j/docs/driver/BasicAuthExample.java index ffcf809ae5..448dbec7e2 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/BasicAuthExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/BasicAuthExample.java @@ -19,10 +19,10 @@ package org.neo4j.docs.driver; // tag::basic-auth-import[] + import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Result; // end::basic-auth-import[] public class BasicAuthExample implements AutoCloseable { @@ -40,7 +40,7 @@ public void close() throws RuntimeException { } public boolean canConnect() { - Result result = driver.session().run("RETURN 1"); + var result = driver.session().run("RETURN 1"); return result.single().get(0).asInt() == 1; } } diff --git a/examples/src/main/java/org/neo4j/docs/driver/BearerAuthExample.java b/examples/src/main/java/org/neo4j/docs/driver/BearerAuthExample.java deleted file mode 100644 index 51851ae37b..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/BearerAuthExample.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::bearer-auth-import[] -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -// end::bearer-auth-import[] - -public class BearerAuthExample implements AutoCloseable { - private final Driver driver; - - // tag::bearer-auth[] - public BearerAuthExample(String uri, String bearerToken) { - driver = GraphDatabase.driver(uri, AuthTokens.bearer(bearerToken)); - } - // end::bearer-auth[] - - @Override - public void close() throws RuntimeException { - driver.close(); - } -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionPoolExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionPoolExample.java index 89652e93bf..dc25e548dc 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionPoolExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionPoolExample.java @@ -18,23 +18,19 @@ */ package org.neo4j.docs.driver; -// tag::config-connection-pool-import[] - import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Config; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Result; import java.util.concurrent.TimeUnit; -// end::config-connection-pool-import[] public class ConfigConnectionPoolExample implements AutoCloseable { private final Driver driver; // tag::config-connection-pool[] public ConfigConnectionPoolExample(String uri, String user, String password) { - Config config = Config.builder() + var config = Config.builder() .withMaxConnectionLifetime(30, TimeUnit.MINUTES) .withMaxConnectionPoolSize(50) .withConnectionAcquisitionTimeout(2, TimeUnit.MINUTES) @@ -50,7 +46,7 @@ public void close() throws RuntimeException { } public boolean canConnect() { - Result result = driver.session().run("RETURN 1"); + var result = driver.session().run("RETURN 1"); return result.single().get(0).asInt() == 1; } } diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionTimeoutExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionTimeoutExample.java index 53ab8d5bd0..af44f85cee 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionTimeoutExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigConnectionTimeoutExample.java @@ -19,7 +19,6 @@ package org.neo4j.docs.driver; // tag::config-connection-timeout-import[] - import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Config; import org.neo4j.driver.Driver; @@ -33,7 +32,9 @@ public class ConfigConnectionTimeoutExample implements AutoCloseable { // tag::config-connection-timeout[] public ConfigConnectionTimeoutExample(String uri, String user, String password) { - Config config = Config.builder().withConnectionTimeout(15, SECONDS).build(); + var config = Config.builder() + .withConnectionTimeout(15, SECONDS) + .build(); driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); } diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigCustomResolverExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigCustomResolverExample.java index 9a2682e8da..9763753aad 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigCustomResolverExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigCustomResolverExample.java @@ -18,16 +18,12 @@ */ package org.neo4j.docs.driver; -// tag::config-custom-resolver-import[] - import org.neo4j.driver.AccessMode; import org.neo4j.driver.AuthToken; import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Config; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; import org.neo4j.driver.net.ServerAddress; import java.util.Arrays; @@ -35,13 +31,12 @@ import static org.neo4j.driver.SessionConfig.builder; import static org.neo4j.driver.Values.parameters; -// end::config-custom-resolver-import[] public class ConfigCustomResolverExample implements AutoCloseable { private final Driver driver; public ConfigCustomResolverExample(String virtualUri, AuthToken authToken, ServerAddress... addresses) { - Config config = Config.builder() + var config = Config.builder() .withResolver(address -> new HashSet<>(Arrays.asList(addresses))) .build(); @@ -50,7 +45,7 @@ public ConfigCustomResolverExample(String virtualUri, AuthToken authToken, Serve // tag::config-custom-resolver[] private Driver createDriver(String virtualUri, String user, String password, ServerAddress... addresses) { - Config config = Config.builder() + var config = Config.builder() .withResolver(address -> new HashSet<>(Arrays.asList(addresses))) .build(); @@ -58,18 +53,17 @@ private Driver createDriver(String virtualUri, String user, String password, Ser } private void addPerson(String name) { - String username = "neo4j"; - String password = "some password"; + var username = "neo4j"; + var password = "some password"; - try (Driver driver = createDriver( + try (var driver = createDriver( "neo4j://x.example.com", username, password, ServerAddress.of("a.example.com", 7676), ServerAddress.of("b.example.com", 8787), ServerAddress.of("c.example.com", 9898))) { - try (Session session = driver.session( - builder().withDefaultAccessMode(AccessMode.WRITE).build())) { + try (var session = driver.session(builder().withDefaultAccessMode(AccessMode.WRITE).build())) { session.run("CREATE (a:Person {name: $name})", parameters("name", name)); } } @@ -82,9 +76,7 @@ public void close() throws RuntimeException { } public boolean canConnect() { - Result result = driver.session( - builder().withDefaultAccessMode(AccessMode.READ).build()) - .run("RETURN 1"); + var result = driver.session(builder().withDefaultAccessMode(AccessMode.READ).build()).run("RETURN 1"); return result.single().get(0).asInt() == 1; } } diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigMaxRetryTimeExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigMaxRetryTimeExample.java index 4ab5eaba99..582f08d1a2 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigMaxRetryTimeExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigMaxRetryTimeExample.java @@ -19,7 +19,6 @@ package org.neo4j.docs.driver; // tag::config-max-retry-time-import[] - import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Config; import org.neo4j.driver.Driver; @@ -33,8 +32,9 @@ public class ConfigMaxRetryTimeExample implements AutoCloseable { // tag::config-max-retry-time[] public ConfigMaxRetryTimeExample(String uri, String user, String password) { - Config config = - Config.builder().withMaxTransactionRetryTime(15, SECONDS).build(); + var config = Config.builder() + .withMaxTransactionRetryTime(15, SECONDS) + .build(); driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); } diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigTrustExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigTrustExample.java index 7bcf79a2fa..96468b4921 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigTrustExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigTrustExample.java @@ -30,7 +30,7 @@ public class ConfigTrustExample implements AutoCloseable { // tag::config-trust[] public ConfigTrustExample(String uri, String user, String password) { - Config config = Config.builder() + var config = Config.builder() .withTrustStrategy(Config.TrustStrategy.trustSystemCertificates()) .build(); diff --git a/examples/src/main/java/org/neo4j/docs/driver/ConfigUnencryptedExample.java b/examples/src/main/java/org/neo4j/docs/driver/ConfigUnencryptedExample.java index dbc3831f5f..4e8bfcecc9 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ConfigUnencryptedExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ConfigUnencryptedExample.java @@ -30,7 +30,7 @@ public class ConfigUnencryptedExample implements AutoCloseable { // tag::config-unencrypted[] public ConfigUnencryptedExample(String uri, String user, String password) { - Config config = Config.builder().withoutEncryption().build(); + var config = Config.builder().withoutEncryption().build(); driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); } diff --git a/examples/src/main/java/org/neo4j/docs/driver/CustomAuthExample.java b/examples/src/main/java/org/neo4j/docs/driver/CustomAuthExample.java index 4a2d214a33..83cfc5d6f4 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/CustomAuthExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/CustomAuthExample.java @@ -19,7 +19,6 @@ package org.neo4j.docs.driver; // tag::custom-auth-import[] - import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; diff --git a/examples/src/main/java/org/neo4j/docs/driver/CypherErrorExample.java b/examples/src/main/java/org/neo4j/docs/driver/CypherErrorExample.java deleted file mode 100644 index 8dcb5db3ae..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/CypherErrorExample.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::cypher-error-import[] - -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.Transaction; -import org.neo4j.driver.TransactionWork; -import org.neo4j.driver.exceptions.ClientException; - -import static org.neo4j.driver.Values.parameters; -// end::cypher-error-import[] - -public class CypherErrorExample extends BaseApplication { - public CypherErrorExample(String uri, String user, String password) { - super(uri, user, password); - } - - @SuppressWarnings("deprecation") - // tag::cypher-error[] - public int getEmployeeNumber(final String name) { - try (Session session = driver.session()) { - return session.readTransaction(new TransactionWork() { - @Override - public Integer execute(Transaction tx) { - return selectEmployee(tx, name); - } - }); - } - } - - private static int selectEmployee(Transaction tx, String name) { - try { - Result result = tx.run("SELECT * FROM Employees WHERE name = $name", parameters("name", name)); - return result.single().get("employee_number").asInt(); - } catch (ClientException ex) { - tx.rollback(); - System.err.println(ex.getMessage()); - return -1; - } - } - // end::cypher-error[] - -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/DatabaseSelectionExample.java b/examples/src/main/java/org/neo4j/docs/driver/DatabaseSelectionExample.java index 5fc05f4ee1..b500b3d155 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/DatabaseSelectionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/DatabaseSelectionExample.java @@ -19,8 +19,8 @@ package org.neo4j.docs.driver; // tag::database-selection-import[] + import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Session; import org.neo4j.driver.SessionConfig; // end::database-selection-import[] @@ -31,17 +31,16 @@ public DatabaseSelectionExample(String uri, String user, String password) { public void useAnotherDatabaseExample() { // tag::database-selection[] - try (Session session = driver.session(SessionConfig.forDatabase("examples"))) { - session.run("CREATE (a:Greeting {message: 'Hello, Example-Database'}) RETURN a") - .consume(); + try (var session = driver.session(SessionConfig.forDatabase("examples"))) { + session.run("CREATE (a:Greeting {message: 'Hello, Example-Database'}) RETURN a").consume(); } - SessionConfig sessionConfig = SessionConfig.builder() + var sessionConfig = SessionConfig.builder() .withDatabase("examples") .withDefaultAccessMode(AccessMode.READ) .build(); - try (Session session = driver.session(sessionConfig)) { - String msg = session.run("MATCH (a:Greeting) RETURN a.message as msg") + try (var session = driver.session(sessionConfig)) { + var msg = session.run("MATCH (a:Greeting) RETURN a.message as msg") .single() .get("msg") .asString(); diff --git a/examples/src/main/java/org/neo4j/docs/driver/DriverIntroductionExample.java b/examples/src/main/java/org/neo4j/docs/driver/DriverIntroductionExample.java deleted file mode 100644 index 7f0de86846..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/DriverIntroductionExample.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::driver-introduction-example-import[] - -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Config; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Logging; -import org.neo4j.driver.Record; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.exceptions.Neo4jException; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -// end::driver-introduction-example-import[] - -// tag::driver-introduction-example[] -public class DriverIntroductionExample implements AutoCloseable { - private static final Logger LOGGER = Logger.getLogger(DriverIntroductionExample.class.getName()); - private final Driver driver; - - public DriverIntroductionExample(String uri, String user, String password, Config config) { - // The driver is a long living object and should be opened during the start of your application - driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); - } - - @Override - public void close() throws RuntimeException { - // The driver object should be closed before the application ends. - driver.close(); - } - - @SuppressWarnings("deprecation") - public void createFriendship(final String person1Name, final String person2Name, final String knowsFrom) { - // To learn more about the Cypher syntax, see https://neo4j.com/docs/cypher-manual/current/ - // The Reference Card is also a good resource for keywords https://neo4j.com/docs/cypher-refcard/current/ - String createFriendshipQuery = - "CREATE (p1:Person { name: $person1_name })\n" + "CREATE (p2:Person { name: $person2_name })\n" - + "CREATE (p1)-[k:KNOWS { from: $knows_from }]->(p2)\n" - + "RETURN p1, p2, k"; - - Map params = new HashMap<>(); - params.put("person1_name", person1Name); - params.put("person2_name", person2Name); - params.put("knows_from", knowsFrom); - - try (Session session = driver.session()) { - // Write transactions allow the driver to handle retries and transient errors - Record record = session.writeTransaction(tx -> { - Result result = tx.run(createFriendshipQuery, params); - return result.single(); - }); - System.out.println(String.format( - "Created friendship between: %s, %s from %s", - record.get("p1").get("name").asString(), - record.get("p2").get("name").asString(), - record.get("k").get("from").asString())); - // You should capture any errors along with the query and data for traceability - } catch (Neo4jException ex) { - LOGGER.log(Level.SEVERE, createFriendshipQuery + " raised an exception", ex); - throw ex; - } - } - - @SuppressWarnings("deprecation") - public void findPerson(final String personName) { - String readPersonByNameQuery = "MATCH (p:Person)\n" + "WHERE p.name = $person_name\n" + "RETURN p.name AS name"; - - Map params = Collections.singletonMap("person_name", personName); - - try (Session session = driver.session()) { - Record record = session.readTransaction(tx -> { - Result result = tx.run(readPersonByNameQuery, params); - return result.single(); - }); - System.out.println( - String.format("Found person: %s", record.get("name").asString())); - // You should capture any errors along with the query and data for traceability - } catch (Neo4jException ex) { - LOGGER.log(Level.SEVERE, readPersonByNameQuery + " raised an exception", ex); - throw ex; - } - } - - public static void main(String... args) throws Exception { - // Aura queries use an encrypted connection using the "neo4j+s" protocol - String boltUrl = "%%BOLT_URL_PLACEHOLDER%%"; - - String user = ""; - String password = ""; - Config config = Config.builder() - // Configuring slf4j logging - .withLogging(Logging.slf4j()) - .build(); - try (DriverIntroductionExample app = new DriverIntroductionExample(boltUrl, user, password, config)) { - app.createFriendship("Alice", "David", "School"); - app.findPerson("Alice"); - } - } -} -// end::driver-introduction-example[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/HelloWorldExample.java b/examples/src/main/java/org/neo4j/docs/driver/HelloWorldExample.java index 50d5c8e62b..80e0c99076 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/HelloWorldExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/HelloWorldExample.java @@ -23,8 +23,7 @@ import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; +import org.neo4j.driver.Query; import static org.neo4j.driver.Values.parameters; // end::hello-world-import[] @@ -42,22 +41,19 @@ public void close() throws RuntimeException { driver.close(); } - @SuppressWarnings("deprecation") public void printGreeting(final String message) { - try (Session session = driver.session()) { - String greeting = session.writeTransaction(tx -> { - Result result = tx.run( - "CREATE (a:Greeting) " + "SET a.message = $message " - + "RETURN a.message + ', from node ' + id(a)", - parameters("message", message)); + try (var session = driver.session()) { + var greeting = session.executeWrite(tx -> { + var query = new Query("CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)", parameters("message", message)); + var result = tx.run(query); return result.single().get(0).asString(); }); System.out.println(greeting); } } - public static void main(String... args) throws Exception { - try (HelloWorldExample greeter = new HelloWorldExample("bolt://localhost:7687", "neo4j", "password")) { + public static void main(String... args) { + try (var greeter = new HelloWorldExample("bolt://localhost:7687", "neo4j", "password")) { greeter.printGreeting("hello, world"); } } diff --git a/examples/src/main/java/org/neo4j/docs/driver/HostnameVerificationExample.java b/examples/src/main/java/org/neo4j/docs/driver/HostnameVerificationExample.java deleted file mode 100644 index 01bbf5e8c9..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/HostnameVerificationExample.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -import static org.neo4j.driver.Config.TrustStrategy.trustCustomCertificateSignedBy; - -import java.io.File; -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Config; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Session; - -public class HostnameVerificationExample implements AutoCloseable { - private final Driver driver; - - HostnameVerificationExample(String uri, String user, String password, File certFile) { - Config config = Config.builder() - .withEncryption() - .withTrustStrategy(trustCustomCertificateSignedBy(certFile).withHostnameVerification()) - .build(); - - driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); - } - - public boolean canConnect() { - try (Session session = driver.session()) { - return session.run("RETURN 42").single().get(0).asInt() == 42; - } - } - - @Override - public void close() { - driver.close(); - } -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/PassBookmarkExample.java b/examples/src/main/java/org/neo4j/docs/driver/PassBookmarkExample.java index 6ff7c23e6f..04855bce82 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/PassBookmarkExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/PassBookmarkExample.java @@ -22,10 +22,8 @@ import org.neo4j.driver.AccessMode; import org.neo4j.driver.Bookmark; -import org.neo4j.driver.Record; import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.Transaction; +import org.neo4j.driver.TransactionContext; import java.util.ArrayList; import java.util.List; @@ -42,78 +40,71 @@ public PassBookmarkExample(String uri, String user, String password) { // tag::pass-bookmarks[] // Create a company node - private Result addCompany(final Transaction tx, final String name) { + private Result addCompany(TransactionContext tx, String name) { return tx.run("CREATE (:Company {name: $name})", parameters("name", name)); } // Create a person node - private Result addPerson(final Transaction tx, final String name) { + private Result addPerson(TransactionContext tx, String name) { return tx.run("CREATE (:Person {name: $name})", parameters("name", name)); } // Create an employment relationship to a pre-existing company node. // This relies on the person first having been created. - private Result employ(final Transaction tx, final String person, final String company) { - return tx.run( - "MATCH (person:Person {name: $person_name}) " + "MATCH (company:Company {name: $company_name}) " - + "CREATE (person)-[:WORKS_FOR]->(company)", + private Result employ(TransactionContext tx, String person, String company) { + return tx.run("MATCH (person:Person {name: $person_name}) MATCH (company:Company {name: $company_name}) CREATE (person)-[:WORKS_FOR]->(company)", parameters("person_name", person, "company_name", company)); } // Create a friendship between two people. - private Result makeFriends(final Transaction tx, final String person1, final String person2) { - return tx.run( - "MATCH (a:Person {name: $person_1}) " + "MATCH (b:Person {name: $person_2}) " - + "MERGE (a)-[:KNOWS]->(b)", + private Result makeFriends(TransactionContext tx, String person1, String person2) { + return tx.run("MATCH (a:Person {name: $person_1}) MATCH (b:Person {name: $person_2}) MERGE (a)-[:KNOWS]->(b)", parameters("person_1", person1, "person_2", person2)); } // Match and display all friendships. - private Result printFriends(final Transaction tx) { - Result result = tx.run("MATCH (a)-[:KNOWS]->(b) RETURN a.name, b.name"); + private Result printFriends(TransactionContext tx) { + var result = tx.run("MATCH (a)-[:KNOWS]->(b) RETURN a.name, b.name"); while (result.hasNext()) { - Record record = result.next(); - System.out.println(String.format( - "%s knows %s", - record.get("a.name").asString(), record.get("b.name").toString())); + var record = result.next(); + System.out.printf("%s knows %s%n", record.get("a.name").asString(), record.get("b.name").toString()); } return result; } - @SuppressWarnings("deprecation") public void addEmployAndMakeFriends() { // To collect the session bookmarks - List savedBookmarks = new ArrayList<>(); + List savedBookmarks; // Create the first person and employment relationship. - try (Session session1 = + try (var session1 = driver.session(builder().withDefaultAccessMode(AccessMode.WRITE).build())) { - session1.writeTransaction(tx -> addCompany(tx, "Wayne Enterprises").consume()); - session1.writeTransaction(tx -> addPerson(tx, "Alice").consume()); - session1.writeTransaction( + session1.executeWrite(tx -> addCompany(tx, "Wayne Enterprises").consume()); + session1.executeWrite(tx -> addPerson(tx, "Alice").consume()); + session1.executeWrite( tx -> employ(tx, "Alice", "Wayne Enterprises").consume()); - savedBookmarks.add(session1.lastBookmark()); + savedBookmarks = new ArrayList<>(session1.lastBookmarks()); } // Create the second person and employment relationship. - try (Session session2 = + try (var session2 = driver.session(builder().withDefaultAccessMode(AccessMode.WRITE).build())) { - session2.writeTransaction(tx -> addCompany(tx, "LexCorp").consume()); - session2.writeTransaction(tx -> addPerson(tx, "Bob").consume()); - session2.writeTransaction(tx -> employ(tx, "Bob", "LexCorp").consume()); + session2.executeWrite(tx -> addCompany(tx, "LexCorp").consume()); + session2.executeWrite(tx -> addPerson(tx, "Bob").consume()); + session2.executeWrite(tx -> employ(tx, "Bob", "LexCorp").consume()); - savedBookmarks.add(session2.lastBookmark()); + savedBookmarks.addAll(session2.lastBookmarks()); } // Create a friendship between the two people created above. - try (Session session3 = driver.session(builder() + try (var session3 = driver.session(builder() .withDefaultAccessMode(AccessMode.WRITE) .withBookmarks(savedBookmarks) .build())) { - session3.writeTransaction(tx -> makeFriends(tx, "Alice", "Bob").consume()); + session3.executeWrite(tx -> makeFriends(tx, "Alice", "Bob").consume()); - session3.readTransaction(this::printFriends); + session3.executeWrite(this::printFriends); } } // end::pass-bookmarks[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/ReadWriteTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/ReadWriteTransactionExample.java index 4addc14ae6..545cee0eb3 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ReadWriteTransactionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ReadWriteTransactionExample.java @@ -20,9 +20,7 @@ // tag::read-write-transaction-import[] -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.Transaction; +import org.neo4j.driver.TransactionContext; import static org.neo4j.driver.Values.parameters; // end::read-write-transaction-import[] @@ -32,22 +30,16 @@ public ReadWriteTransactionExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::read-write-transaction[] public long addPerson(final String name) { - try (Session session = driver.session()) { - session.writeTransaction(tx -> createPersonNode(tx, name)); - return session.readTransaction(tx -> matchPersonNode(tx, name)); + try (var session = driver.session()) { + session.executeWriteWithoutResult(tx -> tx.run("CREATE (a:Person {name: $name})", parameters("name", name)).consume()); + return session.executeRead(tx -> matchPersonNode(tx, name)); } } - private static Void createPersonNode(Transaction tx, String name) { - tx.run("CREATE (a:Person {name: $name})", parameters("name", name)).consume(); - return null; - } - - private static long matchPersonNode(Transaction tx, String name) { - Result result = tx.run("MATCH (a:Person {name: $name}) RETURN id(a)", parameters("name", name)); + private static long matchPersonNode(TransactionContext tx, String name) { + var result = tx.run("MATCH (a:Person {name: $name}) RETURN id(a)", parameters("name", name)); return result.single().get(0).asLong(); } // end::read-write-transaction[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/ReadingValuesExample.java b/examples/src/main/java/org/neo4j/docs/driver/ReadingValuesExample.java deleted file mode 100644 index a1c3376039..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/ReadingValuesExample.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -import static org.neo4j.driver.Values.parameters; - -import java.util.function.Function; -import org.neo4j.driver.Record; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.Value; - -public class ReadingValuesExample extends BaseApplication { - private static final String nullFieldName = "fieldName"; - private static final String intFieldName = "fieldName"; - - public ReadingValuesExample(String uri, String user, String password) { - super(uri, user, password); - } - - public Boolean nullIsNull() { - return echo(null, record -> { - // tag::java-driver-reading-values-null[] - Value possibleNullValue = record.get(nullFieldName); - - // Checking if its null - boolean wasNull = possibleNullValue.isNull(); // true - - // end::java-driver-reading-values-null[] - return wasNull; - }); - } - - public String nullAsString() { - return echo(null, record -> { - Value possibleNullValue = record.get(nullFieldName); - // tag::java-driver-reading-values-null[] - // Getting the null value as string - String stringWithNullContent = possibleNullValue.asString(); // "null" - - // end::java-driver-reading-values-null[] - return stringWithNullContent; - }); - } - - public Object nullAsObject() { - return echo(null, record -> { - Value possibleNullValue = record.get(nullFieldName); - // tag::java-driver-reading-values-null[] - // Getting `null` as object - Object nullObject = possibleNullValue.asObject(); // null - - // end::java-driver-reading-values-null[] - return nullObject; - }); - } - - public float nullAsObjectFloatDefaultValue() { - return echo(null, record -> { - Value possibleNullValue = record.get(nullFieldName); - // tag::java-driver-reading-values-null[] - // Coercing value with a default value set - float floatValue = possibleNullValue.asFloat(1.0f); // 1.0f - - // end::java-driver-reading-values-null[] - return floatValue; - }); - } - - public void nullAsObjectFloat() { - echo(null, record -> { - Value possibleNullValue = record.get(nullFieldName); - // tag::java-driver-reading-values-null[] - // Could not cast null to float - float floatValue = possibleNullValue.asFloat(); // throws org.neo4j.driver.exceptions.value.Uncoercible - // end::java-driver-reading-values-null[] - return floatValue; - }); - } - - public Boolean integerFieldIsNull() { - return echo(4, record -> { - // tag::java-driver-reading-values-non-null[] - Value value = record.get(intFieldName); - // Checking if the value is null - Boolean falseBoolean = value.isNull(); // false - - // end::java-driver-reading-values-non-null[] - return falseBoolean; - }); - } - - public int integerAsInteger() { - return echo(4, record -> { - Value value = record.get(intFieldName); - - // tag::java-driver-reading-values-non-null[] - // Getting as int - int intValue = value.asInt(); // the int - - // end::java-driver-reading-values-non-null[] - return intValue; - }); - } - - public long integerAsLong() { - return echo(4, record -> { - Value value = record.get(intFieldName); - - // tag::java-driver-reading-values-non-null[] - // Getting value asLong is also possible for int values - long longValue = value.asLong(); // the int casted to long - - // end::java-driver-reading-values-non-null[] - return longValue; - }); - } - - public void integerAsString() { - echo(4, record -> { - Value value = record.get(intFieldName); - - // tag::java-driver-reading-values-non-null[] - // But it's not possible to get the int value as string - String stringValue = value.asString(); // throws org.neo4j.driver.exceptions.value.Uncoercible - // end::java-driver-reading-values-non-null[] - return stringValue; - }); - } - - @SuppressWarnings("deprecation") - private O echo(T value, Function transformation) { - try (Session session = driver.session()) { - return session.readTransaction(tx -> { - Result result = tx.run("RETURN $in AS fieldName", parameters("in", value)); - Record record = result.next(); - return transformation.apply(record); - }); - } - } -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/ResultConsumeExample.java b/examples/src/main/java/org/neo4j/docs/driver/ResultConsumeExample.java index b654212f78..ecd881a7fd 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ResultConsumeExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ResultConsumeExample.java @@ -18,14 +18,8 @@ */ package org.neo4j.docs.driver; -// tag::result-consume-import[] - -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; - import java.util.ArrayList; import java.util.List; -// end::result-consume-import[] public class ResultConsumeExample extends BaseApplication { public ResultConsumeExample(String uri, String user, String password) { @@ -33,12 +27,11 @@ public ResultConsumeExample(String uri, String user, String password) { } // tag::result-consume[] - @SuppressWarnings("deprecation") public List getPeople() { - try (Session session = driver.session()) { - return session.readTransaction(tx -> { + try (var session = driver.session()) { + return session.executeRead(tx -> { List names = new ArrayList<>(); - Result result = tx.run("MATCH (a:Person) RETURN a.name ORDER BY a.name"); + var result = tx.run("MATCH (a:Person) RETURN a.name ORDER BY a.name"); while (result.hasNext()) { names.add(result.next().get(0).asString()); } diff --git a/examples/src/main/java/org/neo4j/docs/driver/ResultRetainExample.java b/examples/src/main/java/org/neo4j/docs/driver/ResultRetainExample.java index 45a7cc1e71..70b191c4b2 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/ResultRetainExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/ResultRetainExample.java @@ -18,38 +18,21 @@ */ package org.neo4j.docs.driver; -// tag::result-retain-import[] - -import org.neo4j.driver.Record; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; -import org.neo4j.driver.Transaction; -import org.neo4j.driver.TransactionWork; - -import java.util.List; - import static org.neo4j.driver.Values.parameters; -// end::result-retain-import[] public class ResultRetainExample extends BaseApplication { public ResultRetainExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::result-retain[] public int addEmployees(final String companyName) { - try (Session session = driver.session()) { - int employees = 0; - List persons = session.readTransaction(new TransactionWork>() { - @Override - public List execute(Transaction tx) { - return matchPersonNodes(tx); - } - }); - for (final Record person : persons) { - employees += session.writeTransaction(tx -> { - Result result = tx.run( + try (var session = driver.session()) { + var employees = 0; + var persons = session.executeRead(tx -> tx.run("MATCH (a:Person) RETURN a.name AS name").list()); + for (var person : persons) { + employees += session.executeWrite(tx -> { + var result = tx.run( "MATCH (emp:Person {name: $person_name}) " + "MERGE (com:Company {name: $company_name}) " + "MERGE (emp)-[:WORKS_FOR]->(com)", parameters("person_name", person.get("name").asString(), "company_name", companyName)); @@ -60,11 +43,6 @@ public List execute(Transaction tx) { return employees; } } - - private static List matchPersonNodes(Transaction tx) { - return tx.run("MATCH (a:Person) RETURN a.name AS name").list(); - } - // end::result-retain[] } diff --git a/examples/src/main/java/org/neo4j/docs/driver/RxAutocommitTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/RxAutocommitTransactionExample.java index 9322be1045..4026cdec97 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/RxAutocommitTransactionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/RxAutocommitTransactionExample.java @@ -18,19 +18,14 @@ */ package org.neo4j.docs.driver; -// tag::rx-autocommit-transaction-import[] - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import org.neo4j.driver.reactive.RxSession; +import org.neo4j.driver.Query; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.Collections; -import java.util.Map; -// end::rx-autocommit-transaction-import[] -@SuppressWarnings("deprecation") +import static reactor.adapter.JdkFlowAdapter.flowPublisherToFlux; + public class RxAutocommitTransactionExample extends BaseApplication { public RxAutocommitTransactionExample(String uri, String user, String password) { super(uri, user, password); @@ -38,27 +33,13 @@ public RxAutocommitTransactionExample(String uri, String user, String password) // tag::rx-autocommit-transaction[] public Flux readProductTitles() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - + var query = new Query("MATCH (p:Product) WHERE p.id = $id RETURN p.title", Collections.singletonMap("id", 0)); return Flux.usingWhen( - Mono.fromSupplier(driver::rxSession), - session -> Flux.from(session.run(query, parameters).records()) + Mono.fromSupplier(driver::reactiveSession), + session -> flowPublisherToFlux(session.run(query)) + .flatMap(result -> flowPublisherToFlux(result.records())) .map(record -> record.get(0).asString()), - RxSession::close); + session -> flowPublisherToFlux(session.close())); } // end::rx-autocommit-transaction[] - - // tag::RxJava-autocommit-transaction[] - public Flowable readProductTitlesRxJava() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - - return Flowable.using( - driver::rxSession, - session -> Flowable.fromPublisher(session.run(query, parameters).records()) - .map(record -> record.get(0).asString()), - session -> Observable.fromPublisher(session.close()).subscribe()); - } - // end::RxJava-autocommit-transaction[] } diff --git a/examples/src/main/java/org/neo4j/docs/driver/RxResultConsumeExample.java b/examples/src/main/java/org/neo4j/docs/driver/RxResultConsumeExample.java index 81576b0b13..843b48910d 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/RxResultConsumeExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/RxResultConsumeExample.java @@ -18,20 +18,13 @@ */ package org.neo4j.docs.driver; -// tag::rx-result-consume-import[] - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import org.neo4j.driver.reactive.RxResult; -import org.neo4j.driver.reactive.RxSession; +import org.neo4j.driver.Query; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.Collections; -import java.util.Map; -// end::rx-result-consume-import[] +import static reactor.adapter.JdkFlowAdapter.flowPublisherToFlux; +import static reactor.adapter.JdkFlowAdapter.publisherToFlowPublisher; -@SuppressWarnings("deprecation") public class RxResultConsumeExample extends BaseApplication { public RxResultConsumeExample(String uri, String user, String password) { super(uri, user, password); @@ -39,32 +32,16 @@ public RxResultConsumeExample(String uri, String user, String password) { // tag::rx-result-consume[] public Flux getPeople() { - String query = "MATCH (a:Person) RETURN a.name ORDER BY a.name"; - + var query = new Query("MATCH (a:Person) RETURN a.name ORDER BY a.name"); return Flux.usingWhen( - Mono.fromSupplier(driver::rxSession), - session -> session.readTransaction(tx -> { - RxResult result = tx.run(query); - return Flux.from(result.records()) + Mono.fromSupplier(driver::reactiveSession), + session -> flowPublisherToFlux(session.executeRead(tx -> { + var flux = flowPublisherToFlux(tx.run(query)) + .flatMap(result -> flowPublisherToFlux(result.records())) .map(record -> record.get(0).asString()); - }), - RxSession::close); + return publisherToFlowPublisher(flux); + })), + session -> flowPublisherToFlux(session.close())); } // end::rx-result-consume[] - - // tag::RxJava-result-consume[] - public Flowable getPeopleRxJava() { - String query = "MATCH (a:Person) RETURN a.name ORDER BY a.name"; - Map parameters = Collections.singletonMap("id", 0); - - return Flowable.using( - driver::rxSession, - session -> session.readTransaction(tx -> { - RxResult result = tx.run(query, parameters); - return Flowable.fromPublisher(result.records()) - .map(record -> record.get(0).asString()); - }), - session -> Observable.fromPublisher(session.close()).subscribe()); - } - // end::RxJava-result-consume[] } diff --git a/examples/src/main/java/org/neo4j/docs/driver/RxTransactionFunctionExample.java b/examples/src/main/java/org/neo4j/docs/driver/RxTransactionFunctionExample.java index 0c64f07d38..7324cc9e60 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/RxTransactionFunctionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/RxTransactionFunctionExample.java @@ -18,59 +18,39 @@ */ package org.neo4j.docs.driver; -// tag::rx-transaction-function-import[] - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import org.neo4j.driver.reactive.RxResult; -import org.neo4j.driver.reactive.RxSession; +import org.neo4j.driver.Query; +import org.neo4j.driver.reactive.ReactiveResult; import org.neo4j.driver.summary.ResultSummary; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.Collections; -import java.util.Map; -// end::rx-transaction-function-import[] +import java.util.concurrent.atomic.AtomicReference; + +import static reactor.adapter.JdkFlowAdapter.flowPublisherToFlux; +import static reactor.adapter.JdkFlowAdapter.publisherToFlowPublisher; public class RxTransactionFunctionExample extends BaseApplication { public RxTransactionFunctionExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::rx-transaction-function[] public Flux printAllProducts() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); + var query = new Query("MATCH (p:Product) WHERE p.id = $id RETURN p.title", Collections.singletonMap("id", 0)); return Flux.usingWhen( - Mono.fromSupplier(driver::rxSession), - session -> session.readTransaction(tx -> { - RxResult result = tx.run(query, parameters); - return Flux.from(result.records()) + Mono.fromSupplier(driver::reactiveSession), + session -> flowPublisherToFlux(session.executeRead(tx -> { + var resultRef = new AtomicReference(); + var flux = flowPublisherToFlux(tx.run(query)) + .doOnNext(resultRef::set) + .flatMap(result -> flowPublisherToFlux(result.records())) .doOnNext(record -> System.out.println(record.get(0).asString())) - .then(Mono.from(result.consume())); - }), - RxSession::close); + .then(Mono.defer(() -> Mono.from(flowPublisherToFlux(resultRef.get().consume())))); + return publisherToFlowPublisher(flux); + })), + session -> flowPublisherToFlux(session.close())); } // end::rx-transaction-function[] - - @SuppressWarnings("deprecation") - // tag::RxJava-transaction-function[] - public Flowable printAllProductsRxJava() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - - return Flowable.using( - driver::rxSession, - session -> session.readTransaction(tx -> { - RxResult result = tx.run(query, parameters); - return Flowable.fromPublisher(result.records()) - .doOnNext(record -> System.out.println(record.get(0).asString())) - .ignoreElements() - .andThen(result.consume()); - }), - session -> Observable.fromPublisher(session.close()).subscribe()); - } - // end::RxJava-transaction-function[] } diff --git a/examples/src/main/java/org/neo4j/docs/driver/RxUnmanagedTransactionExample.java b/examples/src/main/java/org/neo4j/docs/driver/RxUnmanagedTransactionExample.java deleted file mode 100644 index 7a40fdc1a6..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/RxUnmanagedTransactionExample.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::reactor-unmanaged-transaction-import[] - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import org.neo4j.driver.reactive.RxQueryRunner; -import org.neo4j.driver.reactive.RxSession; -import org.reactivestreams.Publisher; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.Map; -// end::reactor-unmanaged-transaction-import[] - -@SuppressWarnings("deprecation") -public class RxUnmanagedTransactionExample extends BaseApplication { - public RxUnmanagedTransactionExample(String uri, String user, String password) { - super(uri, user, password); - } - - // tag::reactor-unmanaged-transaction[] - static class QueryRunnerAndCallbacks { - final RxQueryRunner queryRunner; - - final Publisher commit; - final Publisher rollback; - - QueryRunnerAndCallbacks(RxQueryRunner queryRunner, Publisher commit, Publisher rollback) { - this.queryRunner = queryRunner; - this.commit = commit; - this.rollback = rollback; - } - } - - public Flux readSingleProduct() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - - // The additional holder is required to make both usingWhen constructs close - // the resources in the correct order. - Mono queryRunnerSupplier = Mono.using( - driver::rxSession, - session -> Mono.from(session.beginTransaction()) - .map(tx -> new QueryRunnerAndCallbacks(tx, tx.commit(), tx.rollback())), - RxSession::close); - - return Flux.usingWhen( - queryRunnerSupplier, - queryRunnerAndCallbacks -> Flux.from(queryRunnerAndCallbacks - .queryRunner - .run(query, parameters) - .records()) - .map(record -> record.get(0).asString()), - queryRunnerAndCallbacks -> queryRunnerAndCallbacks.commit, - (queryRunnerAndCallbacks, error) -> queryRunnerAndCallbacks.rollback, - queryRunnerAndCallbacks -> queryRunnerAndCallbacks.rollback); - } - // end::reactor-unmanaged-transaction[] - - // tag::RxJava-unmanaged-transaction[] - public Flowable readSingleProductRxJava() { - String query = "MATCH (p:Product) WHERE p.id = $id RETURN p.title"; - Map parameters = Collections.singletonMap("id", 0); - - return Flowable.using( - driver::rxSession, - session -> Flowable.fromPublisher(session.beginTransaction()).flatMap(tx -> Flowable.fromPublisher( - tx.run(query, parameters).records()) - .map(record -> record.get(0).asString()) - .concatWith(tx.commit()) - .onErrorResumeNext(error -> { - // We rollback and rethrow the error. For a real application, you may want to handle the - // error directly here - return Flowable.fromPublisher(tx.rollback()).concatWith(Flowable.error(error)); - })), - session -> Observable.fromPublisher(session.close()) - .onErrorResumeNext(Observable.empty()) - .subscribe()); - } - // end::RxJava-unmanaged-transaction[] -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/ServiceUnavailableExample.java b/examples/src/main/java/org/neo4j/docs/driver/ServiceUnavailableExample.java deleted file mode 100644 index 87730b8c32..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/ServiceUnavailableExample.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::service-unavailable-import[] - -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Config; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Logging; -import org.neo4j.driver.Session; -import org.neo4j.driver.exceptions.ServiceUnavailableException; - -import static java.util.concurrent.TimeUnit.SECONDS; -// end::service-unavailable-import[] - -public class ServiceUnavailableExample implements AutoCloseable { - protected final Driver driver; - - public ServiceUnavailableExample(String uri, String user, String password) { - Config config = Config.builder() - .withMaxTransactionRetryTime(3, SECONDS) - .withLogging(Logging.none()) - .build(); - - driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); - } - - @Override - public void close() throws RuntimeException { - driver.close(); - } - - @SuppressWarnings("deprecation") - // tag::service-unavailable[] - public boolean addItem() { - try (Session session = driver.session()) { - return session.writeTransaction(tx -> { - tx.run("CREATE (a:Item)").consume(); - return true; - }); - } catch (ServiceUnavailableException ex) { - return false; - } - } - // end::service-unavailable[] - -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/SessionExample.java b/examples/src/main/java/org/neo4j/docs/driver/SessionExample.java deleted file mode 100644 index b73cf5fe13..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/SessionExample.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -// tag::session-import[] - -import org.neo4j.driver.Session; - -import static org.neo4j.driver.Values.parameters; -// end::session-import[] - -public class SessionExample extends BaseApplication { - public SessionExample(String uri, String user, String password) { - super(uri, user, password); - } - - // tag::session[] - public void addPerson(String name) { - try (Session session = driver.session()) { - session.run("CREATE (a:Person {name: $name})", parameters("name", name)); - } - } - // end::session[] -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/Slf4jLoggingExample.java b/examples/src/main/java/org/neo4j/docs/driver/Slf4jLoggingExample.java deleted file mode 100644 index 01b8325fb8..0000000000 --- a/examples/src/main/java/org/neo4j/docs/driver/Slf4jLoggingExample.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.docs.driver; - -import static java.util.Collections.singletonMap; - -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Config; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Logging; -import org.neo4j.driver.Session; - -public class Slf4jLoggingExample implements AutoCloseable { - private final Driver driver; - - public Slf4jLoggingExample(String uri, String user, String password) { - Config config = Config.builder().withLogging(Logging.slf4j()).build(); - - driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config); - } - - public Object runReturnQuery(Object value) { - try (Session session = driver.session()) { - return session.run("RETURN $x", singletonMap("x", value)) - .single() - .get(0) - .asObject(); - } - } - - @Override - public void close() { - driver.close(); - } -} diff --git a/examples/src/main/java/org/neo4j/docs/driver/TransactionFunctionExample.java b/examples/src/main/java/org/neo4j/docs/driver/TransactionFunctionExample.java index 971424d9cc..e7cb30c2f2 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/TransactionFunctionExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/TransactionFunctionExample.java @@ -18,27 +18,17 @@ */ package org.neo4j.docs.driver; -// tag::transaction-function-import[] - -import org.neo4j.driver.Session; - import static org.neo4j.driver.Values.parameters; -// end::transaction-function-import[] public class TransactionFunctionExample extends BaseApplication { public TransactionFunctionExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::transaction-function[] public void addPerson(final String name) { - try (Session session = driver.session()) { - session.writeTransaction(tx -> { - tx.run("CREATE (a:Person {name: $name})", parameters("name", name)) - .consume(); - return 1; - }); + try (var session = driver.session()) { + session.executeWriteWithoutResult(tx -> tx.run("CREATE (a:Person {name: $name})", parameters("name", name)).consume()); } } // end::transaction-function[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/TransactionMetadataConfigExample.java b/examples/src/main/java/org/neo4j/docs/driver/TransactionMetadataConfigExample.java index f47e0b5f26..1859eac751 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/TransactionMetadataConfigExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/TransactionMetadataConfigExample.java @@ -18,36 +18,25 @@ */ package org.neo4j.docs.driver; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; +import org.neo4j.driver.TransactionConfig; -import java.util.HashMap; import java.util.Map; -import org.neo4j.driver.Session; -import org.neo4j.driver.TransactionConfig; + +import static org.neo4j.driver.Values.parameters; +import static org.neo4j.driver.Values.value; public class TransactionMetadataConfigExample extends BaseApplication { public TransactionMetadataConfigExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::transaction-metadata-config[] public void addPerson(final String name) { - try (Session session = driver.session()) { - Map transactionMetadata = new HashMap<>(); - transactionMetadata.put("applicationId", value("123")); - - TransactionConfig txConfig = TransactionConfig.builder() - .withMetadata(transactionMetadata) + try (var session = driver.session()) { + var txConfig = TransactionConfig.builder() + .withMetadata(Map.of("applicationId", value("123"))) .build(); - session.writeTransaction( - tx -> { - tx.run("CREATE (a:Person {name: $name})", parameters("name", name)) - .consume(); - return 1; - }, - txConfig); + session.executeWriteWithoutResult(tx -> tx.run("CREATE (a:Person {name: $name})", parameters("name", name)).consume(), txConfig); } } // end::transaction-metadata-config[] diff --git a/examples/src/main/java/org/neo4j/docs/driver/TransactionTimeoutConfigExample.java b/examples/src/main/java/org/neo4j/docs/driver/TransactionTimeoutConfigExample.java index c7ed4f2654..a7e2444b0f 100644 --- a/examples/src/main/java/org/neo4j/docs/driver/TransactionTimeoutConfigExample.java +++ b/examples/src/main/java/org/neo4j/docs/driver/TransactionTimeoutConfigExample.java @@ -19,30 +19,24 @@ package org.neo4j.docs.driver; -import static org.neo4j.driver.Values.parameters; +import org.neo4j.driver.TransactionConfig; import java.time.Duration; -import org.neo4j.driver.Session; -import org.neo4j.driver.TransactionConfig; + +import static org.neo4j.driver.Values.parameters; public class TransactionTimeoutConfigExample extends BaseApplication { public TransactionTimeoutConfigExample(String uri, String user, String password) { super(uri, user, password); } - @SuppressWarnings("deprecation") // tag::transaction-timeout-config[] public void addPerson(final String name) { - try (Session session = driver.session()) { - TransactionConfig txConfig = TransactionConfig.builder() + try (var session = driver.session()) { + var txConfig = TransactionConfig.builder() .withTimeout(Duration.ofSeconds(5)) .build(); - session.writeTransaction( - tx -> { - tx.run("CREATE (a:Person {name: $name})", parameters("name", name)); - return 1; - }, - txConfig); + session.executeWriteWithoutResult(tx -> tx.run("CREATE (a:Person {name: $name})", parameters("name", name)), txConfig); } } // end::transaction-timeout-config[] diff --git a/examples/src/test/java/org/neo4j/docs/driver/ExamplesIT.java b/examples/src/test/java/org/neo4j/docs/driver/ExamplesIT.java index 76880239c6..cd6bfeca59 100644 --- a/examples/src/test/java/org/neo4j/docs/driver/ExamplesIT.java +++ b/examples/src/test/java/org/neo4j/docs/driver/ExamplesIT.java @@ -18,21 +18,36 @@ */ package org.neo4j.docs.driver; -import static java.nio.charset.StandardCharsets.UTF_8; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Session; +import org.neo4j.driver.SessionConfig; +import org.neo4j.driver.Value; +import org.neo4j.driver.Values; +import org.neo4j.driver.internal.util.EnabledOnNeo4jWith; +import org.neo4j.driver.summary.QueryType; +import org.neo4j.driver.summary.ResultSummary; +import org.neo4j.driver.testutil.DatabaseExtension; +import org.neo4j.driver.testutil.ParallelizableIT; +import org.neo4j.driver.testutil.StdIOCapture; +import org.neo4j.driver.testutil.TestUtil; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import static java.util.Arrays.asList; import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.junit.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.Config.TrustStrategy.trustAllCertificates; import static org.neo4j.driver.Values.parameters; import static org.neo4j.driver.internal.util.Neo4jEdition.ENTERPRISE; import static org.neo4j.driver.internal.util.Neo4jFeature.BOLT_V4; @@ -40,31 +55,6 @@ import static org.neo4j.driver.testutil.TestUtil.createDatabase; import static org.neo4j.driver.testutil.TestUtil.dropDatabase; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.neo4j.driver.Config; -import org.neo4j.driver.Driver; -import org.neo4j.driver.Session; -import org.neo4j.driver.SessionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.exceptions.value.Uncoercible; -import org.neo4j.driver.internal.util.EnabledOnNeo4jWith; -import org.neo4j.driver.summary.QueryType; -import org.neo4j.driver.summary.ResultSummary; -import org.neo4j.driver.testutil.DatabaseExtension; -import org.neo4j.driver.testutil.ParallelizableIT; -import org.neo4j.driver.testutil.StdIOCapture; -import org.neo4j.driver.testutil.TestUtil; - @ParallelizableIT class ExamplesIT { static final String USER = "neo4j"; @@ -74,7 +64,6 @@ class ExamplesIT { private String uri; - @SuppressWarnings("deprecation") private int readInt(String database, final String query, final Value parameters) { SessionConfig sessionConfig; if (database == null) { @@ -83,7 +72,7 @@ private int readInt(String database, final String query, final Value parameters) sessionConfig = SessionConfig.forDatabase(database); } try (Session session = neo4j.driver().session(sessionConfig)) { - return session.readTransaction( + return session.executeRead( tx -> tx.run(query, parameters).single().get(0).asInt()); } } @@ -96,13 +85,9 @@ private int readInt(final String query) { return readInt(query, parameters()); } - @SuppressWarnings("deprecation") private void write(final String query, final Value parameters) { try (Session session = neo4j.driver().session()) { - session.writeTransaction(tx -> { - tx.run(query, parameters).consume(); - return null; - }); + session.executeWriteWithoutResult(tx -> tx.run(query, parameters).consume()); } } @@ -125,7 +110,7 @@ void setUp() { } @Test - void testShouldRunAutocommitTransactionExample() throws Exception { + void testShouldRunAutocommitTransactionExample() { // Given try (AutocommitTransactionExample example = new AutocommitTransactionExample(uri, USER, neo4j.adminPassword())) { @@ -138,7 +123,7 @@ void testShouldRunAutocommitTransactionExample() throws Exception { } @Test - void testShouldRunAsyncAutocommitTransactionExample() throws Exception { + void testShouldRunAsyncAutocommitTransactionExample() { try (AsyncAutocommitTransactionExample example = new AsyncAutocommitTransactionExample(uri, USER, neo4j.adminPassword())) { // create some 'Product' nodes @@ -154,7 +139,7 @@ void testShouldRunAsyncAutocommitTransactionExample() throws Exception { } @Test - void testShouldAsyncRunResultConsumeExample() throws Exception { + void testShouldAsyncRunResultConsumeExample() { // Given write("CREATE (a:Person {name: 'Alice'})"); write("CREATE (a:Person {name: 'Bob'})"); @@ -168,7 +153,7 @@ void testShouldAsyncRunResultConsumeExample() throws Exception { } @Test - void testShouldAsyncRunMultipleTransactionExample() throws Exception { + void testShouldAsyncRunMultipleTransactionExample() { // Given write("CREATE (a:Person {name: 'Alice'})"); write("CREATE (a:Person {name: 'Bob'})"); @@ -186,7 +171,7 @@ void testShouldAsyncRunMultipleTransactionExample() throws Exception { } @Test - void testShouldRunConfigConnectionPoolExample() throws Exception { + void testShouldRunConfigConnectionPoolExample() { // Given try (ConfigConnectionPoolExample example = new ConfigConnectionPoolExample(uri, USER, neo4j.adminPassword())) { // Then @@ -195,7 +180,7 @@ void testShouldRunConfigConnectionPoolExample() throws Exception { } @Test - void testShouldRunBasicAuthExample() throws Exception { + void testShouldRunBasicAuthExample() { // Given try (BasicAuthExample example = new BasicAuthExample(uri, USER, neo4j.adminPassword())) { // Then @@ -204,7 +189,7 @@ void testShouldRunBasicAuthExample() throws Exception { } @Test - void testShouldRunConfigConnectionTimeoutExample() throws Exception { + void testShouldRunConfigConnectionTimeoutExample() { // Given try (ConfigConnectionTimeoutExample example = new ConfigConnectionTimeoutExample(uri, USER, neo4j.adminPassword())) { @@ -214,7 +199,7 @@ void testShouldRunConfigConnectionTimeoutExample() throws Exception { } @Test - void testShouldRunConfigMaxRetryTimeExample() throws Exception { + void testShouldRunConfigMaxRetryTimeExample() { // Given try (ConfigMaxRetryTimeExample example = new ConfigMaxRetryTimeExample(uri, USER, neo4j.adminPassword())) { // Then @@ -223,7 +208,7 @@ void testShouldRunConfigMaxRetryTimeExample() throws Exception { } @Test - void testShouldRunConfigTrustExample() throws Exception { + void testShouldRunConfigTrustExample() { // Given try (ConfigTrustExample example = new ConfigTrustExample(uri, USER, neo4j.adminPassword())) { // Then @@ -232,7 +217,7 @@ void testShouldRunConfigTrustExample() throws Exception { } @Test - void testShouldRunConfigUnencryptedExample() throws Exception { + void testShouldRunConfigUnencryptedExample() { // Given try (ConfigUnencryptedExample example = new ConfigUnencryptedExample(uri, USER, neo4j.adminPassword())) { // Then @@ -241,22 +226,7 @@ void testShouldRunConfigUnencryptedExample() throws Exception { } @Test - void testShouldRunCypherErrorExample() throws Exception { - // Given - try (CypherErrorExample example = new CypherErrorExample(uri, USER, neo4j.adminPassword())) { - // When & Then - StdIOCapture stdIO = StdIOCapture.capture(); - try (stdIO) { - int employeeNumber = example.getEmployeeNumber("Alice"); - - assertThat(employeeNumber, equalTo(-1)); - } - assertThat(stdIO.stderr().toString(), containsString("Invalid input")); - } - } - - @Test - void testShouldRunDriverLifecycleExample() throws Exception { + void testShouldRunDriverLifecycleExample() { // Given try (DriverLifecycleExample example = new DriverLifecycleExample(uri, USER, neo4j.adminPassword())) { // Then @@ -282,31 +252,7 @@ void testShouldRunHelloWorld() throws Exception { } @Test - void testShouldRunDriverIntroduction() throws Exception { - // Given - Config config = Config.builder() - .withEncryption() - .withTrustStrategy(trustAllCertificates()) - .build(); - try (DriverIntroductionExample intro = - new DriverIntroductionExample(uri, USER, neo4j.adminPassword(), config)) { - // When - StdIOCapture stdIO = StdIOCapture.capture(); - - try (stdIO) { - intro.createFriendship("Alice", "David", "School"); - intro.findPerson("Alice"); - } - - // Then - assertThat(stdIO.stdout().size(), equalTo(2)); - assertThat(stdIO.stdout().get(0), containsString("Created friendship between: Alice, David from School")); - assertThat(stdIO.stdout().get(1), containsString("Found person: Alice")); - } - } - - @Test - void testShouldRunReadWriteTransactionExample() throws Exception { + void testShouldRunReadWriteTransactionExample() { // Given try (ReadWriteTransactionExample example = new ReadWriteTransactionExample(uri, USER, neo4j.adminPassword())) { // When @@ -318,7 +264,7 @@ void testShouldRunReadWriteTransactionExample() throws Exception { } @Test - void testShouldRunResultConsumeExample() throws Exception { + void testShouldRunResultConsumeExample() { // Given write("CREATE (a:Person {name: 'Alice'})"); write("CREATE (a:Person {name: 'Bob'})"); @@ -332,7 +278,7 @@ void testShouldRunResultConsumeExample() throws Exception { } @Test - void testShouldRunResultRetainExample() throws Exception { + void testShouldRunResultRetainExample() { // Given write("CREATE (a:Person {name: 'Alice'})"); write("CREATE (a:Person {name: 'Bob'})"); @@ -348,36 +294,7 @@ void testShouldRunResultRetainExample() throws Exception { } @Test - void testShouldRunServiceUnavailableExample() throws Exception { - // Given - try (ServiceUnavailableExample example = new ServiceUnavailableExample(uri, USER, neo4j.adminPassword())) { - try { - // When - neo4j.stopProxy(); - - // Then - assertThat(example.addItem(), equalTo(false)); - } finally { - neo4j.startProxy(); - } - } - } - - @Test - void testShouldRunSessionExample() throws Exception { - // Given - try (SessionExample example = new SessionExample(uri, USER, neo4j.adminPassword())) { - // When - example.addPerson("Alice"); - - // Then - assertThat(example, instanceOf(SessionExample.class)); - assertThat(personCount("Alice"), greaterThan(0)); - } - } - - @Test - void testShouldRunTransactionFunctionExample() throws Exception { + void testShouldRunTransactionFunctionExample() { // Given try (TransactionFunctionExample example = new TransactionFunctionExample(uri, USER, neo4j.adminPassword())) { // When @@ -389,7 +306,7 @@ void testShouldRunTransactionFunctionExample() throws Exception { } @Test - void testShouldConfigureTransactionTimeoutExample() throws Exception { + void testShouldConfigureTransactionTimeoutExample() { // Given try (TransactionTimeoutConfigExample example = new TransactionTimeoutConfigExample(uri, USER, neo4j.adminPassword())) { @@ -402,7 +319,7 @@ void testShouldConfigureTransactionTimeoutExample() throws Exception { } @Test - void testShouldConfigureTransactionMetadataExample() throws Exception { + void testShouldConfigureTransactionMetadataExample() { // Given try (TransactionMetadataConfigExample example = new TransactionMetadataConfigExample(uri, USER, neo4j.adminPassword())) { @@ -438,7 +355,7 @@ void testShouldRunAsyncTransactionFunctionExample() throws Exception { } @Test - void testPassBookmarksExample() throws Exception { + void testPassBookmarksExample() { try (PassBookmarkExample example = new PassBookmarkExample(uri, USER, neo4j.adminPassword())) { // When example.addEmployAndMakeFriends(); @@ -463,64 +380,9 @@ void testPassBookmarksExample() throws Exception { } } - @Test - void testAsyncUnmanagedTransactionExample() throws Exception { - try (AsyncUnmanagedTransactionExample example = - new AsyncUnmanagedTransactionExample(uri, USER, neo4j.adminPassword())) { - // create a 'Product' node - try (Session session = neo4j.driver().session()) { - session.run("CREATE (:Product {id: 0, title: 'Mind Gem'})"); - } - - StdIOCapture stdIOCapture = StdIOCapture.capture(); - - // print the single 'Product' node - try (stdIOCapture) { - await(example.printSingleProduct()); - } - - assertEquals(1, stdIOCapture.stdout().size()); - assertEquals("Mind Gem", stdIOCapture.stdout().get(0)); - } - } - - @Test - void testSlf4jLogging() throws Exception { - // log file is defined in logback-test.xml configuration file - Path logFile = Paths.get("target", "test.log"); - if (Files.exists(logFile)) { - // delete file made this test flaky - // erase content instead - Files.write(logFile, new byte[0]); - } - - // verify erased - String logFileContent = new String(Files.readAllBytes(logFile), UTF_8); - assertThat(logFileContent, is(emptyString())); - - String randomString = UUID.randomUUID().toString(); - try (Slf4jLoggingExample example = new Slf4jLoggingExample(uri, USER, neo4j.adminPassword())) { - Object result = example.runReturnQuery(randomString); - assertEquals(randomString, result); - } - assertTrue(Files.exists(logFile)); - - logFileContent = new String(Files.readAllBytes(logFile), UTF_8); - assertThat(logFileContent, containsString("RETURN $x")); - assertThat(logFileContent, containsString(randomString)); - } - - @Test - void testHostnameVerificationExample() { - try (HostnameVerificationExample example = - new HostnameVerificationExample(uri, USER, neo4j.adminPassword(), neo4j.tlsCertFile())) { - assertTrue(example.canConnect()); - } - } - @Test @EnabledOnNeo4jWith(BOLT_V4) - void testShouldRunRxAutocommitTransactionExample() throws Exception { + void testShouldRunRxAutocommitTransactionExample() { try (RxAutocommitTransactionExample example = new RxAutocommitTransactionExample(uri, USER, neo4j.adminPassword())) { // create some 'Product' nodes @@ -532,29 +394,6 @@ void testShouldRunRxAutocommitTransactionExample() throws Exception { // read all 'Product' nodes List titles = await(example.readProductTitles()); assertEquals(new HashSet<>(asList("Tesseract", "Orb", "Eye of Agamotto")), new HashSet<>(titles)); - - titles = await(example.readProductTitlesRxJava()); - assertEquals(new HashSet<>(asList("Tesseract", "Orb", "Eye of Agamotto")), new HashSet<>(titles)); - } - } - - @Test - @EnabledOnNeo4jWith(BOLT_V4) - void testRxUnmanagedTransactionExample() throws Exception { - try (RxUnmanagedTransactionExample example = - new RxUnmanagedTransactionExample(uri, USER, neo4j.adminPassword())) { - // create a 'Product' node - try (Session session = neo4j.driver().session()) { - session.run("CREATE (:Product {id: 0, title: 'Mind Gem'})"); - } - - List products = await(example.readSingleProduct()); - assertEquals(1, products.size()); - assertEquals("Mind Gem", products.get(0)); - - products = await(example.readSingleProductRxJava()); - assertEquals(1, products.size()); - assertEquals("Mind Gem", products.get(0)); } } @@ -586,33 +425,7 @@ void testShouldRunRxTransactionFunctionExampleReactor() throws Exception { @Test @EnabledOnNeo4jWith(BOLT_V4) - void testShouldRunRxTransactionFunctionExampleRxJava() throws Exception { - try (RxTransactionFunctionExample example = - new RxTransactionFunctionExample(uri, USER, neo4j.adminPassword())) { - // create some 'Product' nodes - try (Session session = neo4j.driver().session()) { - session.run( - "UNWIND ['Infinity Gauntlet', 'Mjölnir'] AS item " + "CREATE (:Product {id: 0, title: item})"); - } - - StdIOCapture stdIOCapture = StdIOCapture.capture(); - - // print all 'Product' nodes to fake stdout - try (stdIOCapture) { - final List summaryList = await(example.printAllProductsRxJava()); - assertThat(summaryList.size(), equalTo(1)); - ResultSummary summary = summaryList.get(0); - assertEquals(QueryType.READ_ONLY, summary.queryType()); - } - - Set capturedOutput = new HashSet<>(stdIOCapture.stdout()); - assertEquals(new HashSet<>(asList("Infinity Gauntlet", "Mjölnir")), capturedOutput); - } - } - - @Test - @EnabledOnNeo4jWith(BOLT_V4) - void testShouldRunRxResultConsumeExampleReactor() throws Exception { + void testShouldRunRxResultConsumeExampleReactor() { // Given write("CREATE (a:Person {name: 'Alice'})"); write("CREATE (a:Person {name: 'Bob'})"); @@ -625,24 +438,9 @@ void testShouldRunRxResultConsumeExampleReactor() throws Exception { } } - @Test - @EnabledOnNeo4jWith(BOLT_V4) - void testShouldRunRxResultConsumeExampleRxJava() throws Exception { - // Given - write("CREATE (a:Person {name: 'Alice'})"); - write("CREATE (a:Person {name: 'Bob'})"); - try (RxResultConsumeExample example = new RxResultConsumeExample(uri, USER, neo4j.adminPassword())) { - // When - List names = await(example.getPeopleRxJava()); - - // Then - assertThat(names, equalTo(asList("Alice", "Bob"))); - } - } - @Test @EnabledOnNeo4jWith(value = BOLT_V4, edition = ENTERPRISE) - void testUseAnotherDatabaseExample() throws Exception { + void testUseAnotherDatabaseExample() { Driver driver = neo4j.driver(); dropDatabase(driver, "examples"); createDatabase(driver, "examples"); @@ -656,20 +454,4 @@ void testUseAnotherDatabaseExample() throws Exception { assertThat(greetingCount, is(1)); } } - - @Test - void testReadingValuesExample() throws Exception { - try (ReadingValuesExample example = new ReadingValuesExample(uri, USER, neo4j.adminPassword())) { - assertThat(example.integerFieldIsNull(), is(false)); - assertThat(example.integerAsInteger(), is(4)); - assertThat(example.integerAsLong(), is(4L)); - assertThrows(Uncoercible.class, example::integerAsString); - - assertThat(example.nullIsNull(), is(true)); - assertThat(example.nullAsString(), is("null")); - assertThat(example.nullAsObject(), nullValue()); - assertThat(example.nullAsObjectFloatDefaultValue(), is(1.0f)); - assertThrows(Uncoercible.class, example::nullAsObjectFloat); - } - } } diff --git a/examples/src/test/java/org/neo4j/docs/driver/RoutingExamplesIT.java b/examples/src/test/java/org/neo4j/docs/driver/RoutingExamplesIT.java index 8bfcabfd55..bfbbeb39eb 100644 --- a/examples/src/test/java/org/neo4j/docs/driver/RoutingExamplesIT.java +++ b/examples/src/test/java/org/neo4j/docs/driver/RoutingExamplesIT.java @@ -42,7 +42,7 @@ class RoutingExamplesIT { .withAdminPassword(null); @Test - void testShouldRunConfigCustomResolverExample() throws Exception { + void testShouldRunConfigCustomResolverExample() { // Given URI boltUri = URI.create(NEO4J_CONTAINER.getBoltUrl()); String neo4jUrl = String.format("neo4j://%s:%d", boltUri.getHost(), boltUri.getPort());