|
package ac.simons.neo4j.twitch; |
|
|
|
import java.io.IOException; |
|
import java.nio.file.Files; |
|
import java.util.List; |
|
import java.util.Map; |
|
|
|
import org.neo4j.configuration.connectors.BoltConnector; |
|
import org.neo4j.configuration.helpers.SocketAddress; |
|
import org.neo4j.dbms.api.DatabaseManagementServiceBuilder; |
|
import org.neo4j.driver.AuthTokens; |
|
import org.neo4j.driver.GraphDatabase; |
|
import org.neo4j.driver.Transaction; |
|
|
|
public class GraphApplication { |
|
|
|
public static void main(String... a) throws IOException { |
|
|
|
// This is the db itself, should be long lived |
|
var graphDb = new DatabaseManagementServiceBuilder(Files.createTempDirectory("neo4j").toFile()) |
|
.setConfig(BoltConnector.enabled, true) |
|
.setConfig(BoltConnector.listen_address, new SocketAddress("localhost", 7687)) |
|
.build(); |
|
|
|
// You could also use the graph database api and skip using bolt. |
|
// The advante 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.writeTransaction(t -> t.run("CREATE (p:Person {name: 'Arnold Schwarzenegger'}) - [:ACTED_IN] -> (:Movie {title: 'The Terminator'})").consume().counters().nodesCreated()); |
|
|
|
|
|
var movies = session.readTransaction(GraphApplication::findMovieAndTheirActors); |
|
movies.forEach(System.out::println); |
|
} |
|
|
|
graphDb.shutdown(); |
|
} |
|
|
|
record Person(String name) { |
|
} |
|
|
|
record Movie(String title, List<Person>actedIn) { |
|
} |
|
|
|
static List<Movie> findMovieAndTheirActors(Transaction 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())); |
|
var movie = new Movie(r.get("title").asString(), actors); |
|
return movie; |
|
}); |
|
} |
|
} |