Skip to content

Instantly share code, notes, and snippets.

@Podbrushkin
Created November 23, 2023 13:44
Show Gist options
  • Save Podbrushkin/855bf73fca135ef6a4a0ee532f462f6b to your computer and use it in GitHub Desktop.
Save Podbrushkin/855bf73fca135ef6a4a0ee532f462f6b to your computer and use it in GitHub Desktop.
Neo4j Embedded Example
package myapp;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.configuration.GraphDatabaseSettings.LogQueryLevel;
import org.neo4j.configuration.connectors.BoltConnector;
import org.neo4j.configuration.helpers.SocketAddress;
import org.neo4j.dbms.api.DatabaseManagementServiceBuilder;
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.TransactionContext;
public class GraphApplication {
public static void main(String... a) throws IOException {
// This is the db itself, should be long-lived
var graphDb = new DatabaseManagementServiceBuilder(Path.of("target","mydb"))
.setConfig(BoltConnector.enabled, true)
.setConfig(BoltConnector.listen_address, new SocketAddress("localhost", 7687))
.setConfig(BoltConnector.encryption_level, BoltConnector.EncryptionLevel.DISABLED)
.setConfig(GraphDatabaseSettings.log_queries, LogQueryLevel.VERBOSE)
.build();
registerShutdownHook(graphDb);
// You could also use the graph database api and skip using bolt.
// The advantage of using build also in an embedded scenario: You can switch to a server with ease.
// Same goes for the driver with the connection pool
// The session itself is short-lived
try (
var driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.none());
var session = driver.session()
) {
session.executeWrite(t -> t.run("CREATE (p:Person {name: 'Arnold Schwarzenegger'}) - [:ACTED_IN] -> (:Movie {title: 'The Terminator'})").consume().counters().nodesCreated());
var movies = session.executeRead(GraphApplication::findMovieAndTheirActors);
movies.forEach(System.out::println);
}
// graphDb.shutdown();
}
record Person(String name) {
}
record Movie(String title, List<Person>actedIn) {
}
static List<Movie> findMovieAndTheirActors(TransactionContext tx) {
var query = """
MATCH (m:Movie) <- [:ACTED_IN] - (p:Person)
WHERE m.title =~ $movieTitle
RETURN m.title AS title, collect(p.name) AS actors
""";
return tx.run(query, Map.of("movieTitle", ".*The.*")).list(r -> {
var actors = r.get("actors").asList(v -> new Person(v.asString()));
return new Movie(r.get("title").asString(), actors);
});
}
private static void registerShutdownHook( final DatabaseManagementService managementService ) {
// Registers a shutdown hook for the Neo4j instance so that it
// shuts down nicely when the VM exits (even if you "Ctrl-C" the
// running application).
Runtime.getRuntime().addShutdownHook( new Thread()
{
@Override
public void run() {
System.out.println("Shutdown requested, please wait 3 seconds...");
managementService.shutdown();
System.out.println("Shutdown completed successfully.");
}
} );
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>somegroup</groupId>
<artifactId>someapp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<neo4j.version>5.11.0</neo4j.version>
<neo4j-java-driver.version>5.11.0</neo4j-java-driver.version>
<exec.mainClass>myapp.GraphApplication</exec.mainClass>
</properties>
<dependencies>
<!-- Embbeded instance -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>${neo4j.version}</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-bolt</artifactId>
<version>${neo4j.version}</version>
</dependency>
<!-- Driver (for connection) -->
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>${neo4j-java-driver.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
</plugins>
</build>
</project>
@Podbrushkin
Copy link
Author

To download and run execute in empty dir:

mkdir src/main/java/myapp
curl -L -O 'https://gist.github.com/Podbrushkin/855bf73fca135ef6a4a0ee532f462f6b/raw/8f6d9142c6f97a1844728e8f387dbbce602fa684/pom.xml'
curl -L 'https://gist.github.com/Podbrushkin/855bf73fca135ef6a4a0ee532f462f6b/raw/8f6d9142c6f97a1844728e8f387dbbce602fa684/GraphApplication.java' > .\src\main\java\myapp\GraphApplication.java
mvn clean compile exec:java

@Podbrushkin
Copy link
Author

It doesn't actually log queries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment