diff --git a/oracle-of-bacon-backend/.gitignore b/oracle-of-bacon-backend/.gitignore index 7f396a4..e2cc8f5 100644 --- a/oracle-of-bacon-backend/.gitignore +++ b/oracle-of-bacon-backend/.gitignore @@ -5,6 +5,10 @@ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 .idea/ +*.iml +.classpath +.project +.settings # User-specific stuff: .idea/workspace.xml @@ -90,3 +94,4 @@ gradle-app.setting # gradle/wrapper/gradle-wrapper.properties # End of https://www.gitignore.io/api/gradle,java,intellij +/bin/ \ No newline at end of file diff --git a/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/api/APIEndPoint.java b/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/api/APIEndPoint.java index b6efd86..4cb0887 100644 --- a/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/api/APIEndPoint.java +++ b/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/api/APIEndPoint.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class APIEndPoint { private final Neo4JRepository neo4JRepository; @@ -24,47 +25,17 @@ public APIEndPoint() { @Get("bacon-to?actor=:actorName") // change return type public String getConnectionsToKevinBacon(String actorName) { - redisRepository.saveSearch(actorName); + System.out.println("-----\nappel getConnectionsToKevinBacon..."); + List elementsGraphe = neo4JRepository.getConnectionsToKevinBacon(actorName); + String elements = elementsGraphe.stream().map(element -> element.toString()).collect(Collectors.joining(", ")); - return "[\n" + - "{\n" + - "\"data\": {\n" + - "\"id\": 85449,\n" + - "\"type\": \"Actor\",\n" + - "\"value\": \"Bacon, Kevin (I)\"\n" + - "}\n" + - "},\n" + - "{\n" + - "\"data\": {\n" + - "\"id\": 2278636,\n" + - "\"type\": \"Movie\",\n" + - "\"value\": \"Mystic River (2003)\"\n" + - "}\n" + - "},\n" + - "{\n" + - "\"data\": {\n" + - "\"id\": 1394181,\n" + - "\"type\": \"Actor\",\n" + - "\"value\": \"Robbins, Tim (I)\"\n" + - "}\n" + - "},\n" + - "{\n" + - "\"data\": {\n" + - "\"id\": 579848,\n" + - "\"source\": 85449,\n" + - "\"target\": 2278636,\n" + - "\"value\": \"PLAYED_IN\"\n" + - "}\n" + - "},\n" + - "{\n" + - "\"data\": {\n" + - "\"id\": 9985692,\n" + - "\"source\": 1394181,\n" + - "\"target\": 2278636,\n" + - "\"value\": \"PLAYED_IN\"\n" + - "}\n" + - "}\n" + - "]"; + System.out.println("Retourne le resultat :"); + System.out.println(elements); + + System.out.println("-----"); + return "[" + elements + "]"; + + } @Get("suggest?q=:searchQuery") diff --git a/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/repository/Neo4JRepository.java b/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/repository/Neo4JRepository.java index e5490f4..d56138b 100644 --- a/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/repository/Neo4JRepository.java +++ b/oracle-of-bacon-backend/src/main/java/com/serli/oracle/of/bacon/repository/Neo4JRepository.java @@ -9,19 +9,69 @@ import org.neo4j.driver.Session; import org.neo4j.driver.types.Node; import org.neo4j.driver.types.Relationship; +import org.neo4j.driver.internal.value.PathValue; +import org.neo4j.driver.v1.Record; +import org.neo4j.driver.v1.StatementResult; +import org.neo4j.driver.v1.Transaction; +import org.neo4j.driver.v1.Value; +import org.neo4j.driver.v1.types.Node; +import org.neo4j.driver.v1.types.Path; +import org.neo4j.driver.v1.types.Relationship; +import static org.neo4j.driver.v1.Values.parameters; + +import java.util.LinkedList; public class Neo4JRepository { private final Driver driver; public Neo4JRepository() { - this.driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password")); + this.driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "motdepasse")); } - public List> getConnectionsToKevinBacon(String actorName) { + public List getConnectionsToKevinBacon(String actorName) { Session session = driver.session(); + // Implémentation de l'oracle de Bacon + List graphe = new LinkedList<>(); + StatementResult resultats = null; + try (Transaction transaction = session.beginTransaction()) + { + resultats = transaction.run(getQuery(), parameters("nomAutreActeur", actorName)); + transaction.success(); + } + + while (resultats.hasNext()) { + Record entree = resultats.next(); + System.out.println(entree); + List valeurs = entree.values(); + + // normalement il n'y a qu'un path par Record + for (Value valeur : valeurs) { + Path chemin = valeur.asPath(); + + chemin.nodes().forEach(node -> { + // |)4r|< |\/|4g1( + String type = node.labels().iterator().next(); + + String clePropriete = "Actor".equals(type) ? "name" : "title"; + graphe.add(new GraphNode(node.id(), node.get(clePropriete).asString(), type)); + }); + + chemin.relationships().forEach(relationship -> { + graphe.add(new GraphEdge(relationship.id(), relationship.startNodeId(), relationship.endNodeId(), relationship.type())); + }); + } + } + + return graphe; + } + + private String getQuery() { + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append("MATCH p = shortestPath((Kevin:Actor {name: \"Bacon, Kevin (I)\"})-[:PLAYED_IN*]-(Other:Actor {name: {nomAutreActeur}})) ") + .append("RETURN p") + ; + return strBuilder.toString(); - // TODO - return null; } private GraphEdge mapRelationShipToNodeEdge(Relationship relationship) { @@ -85,5 +135,17 @@ public GraphEdge(long id, long source, long target, String value) { this.target = target; this.value = value; } + @Override + public String toString() { + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append("{ \"data\" : { ") + .append(" \"id\": " ).append(this.id ).append(", " ) + .append(" \"source\": " ).append(this.source).append(", " ) + .append(" \"target\": " ).append(this.target).append(", " ) + .append(" \"value\": \"").append(this.value ).append("\"") + .append("}}") + ; + return strBuilder.toString(); + } } }