Skip to content

Add implementation neo4j, redis, and elastic for small search engine #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
oracle-of-bacon-backend/.data/
node_modules
imdb-data

*.swp
*.class
66 changes: 15 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,70 +1,34 @@
# Oracle of Bacon

## Présentation
### Oracle Bacon
Some project which uses
- Elastic search
- Neo4j
- Redis

L'objectif de l'application est de déterminer le degré de séparation entre Kevin Bacon et un acteur donné via ses rôles dans les films.
![](./result.png)

Par exemple : **Al Pacino**

- **Al Pacino** a joué dans `Carlito’s Way` avec `Nelson Vasquez`
- `Nelson Vasquez` a joué dans `The Guiding Light` avec **Kevin Bacon**
#### Instructions

![](./example-oracle-of-bacon.png)

## Les modules

Le projet est réparti en deux modules :

- [Le back end](./oracle-of-bacon-backend) qui gère la logique et la connexion aux différents Data Stores.
- [Le front end](./oracle-of-bacon-frontend) qui expose l'IHM.

## Pour démarrer

Pour lancer le projet démarrez deux terminaux et positionnez-vous dans ce répertoire :

```BASH
cd <path to directory oracle-of-bacon>
```

Dans le premier, lancez le frontend :

```BASH
```sh
cd oracle-of-bacon-frontend
npm install
npm run dev
```

Dans le second, lancez le backend :

```BASH
```sh
cd oracle-of-bacon-backend
./gradlew run
```

Rendez-vous sur a page http://localhost:8080.

Pour la suite du projet, nous vous conseillons d'importer le backend dans votre IDE/éditeur préféré. Sauf désir de créativité :smiley:, vous n'avez rien à faire dans le front-end.

## Le data set

Les données sont des données qui proviennent de imdb, le dataset est disponible ici : http://bit.ly/imdbdataset

## Votre mission

Le site a été bouchonné (cf `TODO`), vous devez effectuer les tâches suivantes :

- Importer les données dans Neo4J à l'aide de l'outil d'import : [`ìmport-tool`](http://neo4j.com/docs/operations-manual/current/tutorial/import-tool/).
- Implémenter l'Oracle de Bacon à l'aide de Neo4J dans la méthode `com.serli.oracle.of.bacon.repository.Neo4JRepository#getConnectionsToKevinBacon`
- Implémenter la gestion du last 10 search à l'aide de Redis dans la méthode `com.serli.oracle.of.bacon.repository.RedisRepository#getLastTenSearches`
- Importer les données à l'aide de ElasticSearch dans `com.serli.oracle.of.bacon.loader.elasticsearch.CompletionLoader` (alternativement vous pouvez importer les données avec le script node dans `script/insert.js`) (les liens suivants pourront vous aider : [search](https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html), [mapping](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html) et [suggest](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html))
- Implémenter la suggestion sur le nom des acteurs dans `com.serli.oracle.of.bacon.repository.ElasticSearchRepository#getActorsSuggests`
#### Configurations

L'évaluation de votre travail sera effectuée selon les critères suivants :
- To load the datasets in neo4j peruse the document oracle-of-bacon-backend/instructions-neo4j.md
- Load the data in elastic search with index name suggestions
- Start ( Redis, Neo4j, Elastic Search)

- Bon fonctionnement (First make it work)
- Qualité de la solution implémentée (Then make it good)
- Qualité générale de votre code (et de vos commits, il ne faut pas pousser :smiley:)

La livraison de votre travail s'effectue à l'aide d'une pull-request sur le repository https://github.com/nosql-bootcamp/oracle-of-bacon.

**Vous devez commencer par forker le repository https://github.com/nosql-bootcamp/oracle-of-bacon**
#### Authors
- Guillem Sanyas and Daniel Santos
70 changes: 70 additions & 0 deletions last.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Oracle of Bacon

## Présentation

L'objectif de l'application est de déterminer le degré de séparation entre Kevin Bacon et un acteur donné via ses rôles dans les films.

Par exemple : **Al Pacino**

- **Al Pacino** a joué dans `Carlito’s Way` avec `Nelson Vasquez`
- `Nelson Vasquez` a joué dans `The Guiding Light` avec **Kevin Bacon**

![](./example-oracle-of-bacon.png)

## Les modules

Le projet est réparti en deux modules :

- [Le back end](./oracle-of-bacon-backend) qui gère la logique et la connexion aux différents Data Stores.
- [Le front end](./oracle-of-bacon-frontend) qui expose l'IHM.

## Pour démarrer

Pour lancer le projet démarrez deux terminaux et positionnez-vous dans ce répertoire :

```BASH
cd <path to directory oracle-of-bacon>
```

Dans le premier, lancez le frontend :

```BASH
cd oracle-of-bacon-frontend
npm install
npm run dev
```

Dans le second, lancez le backend :

```BASH
cd oracle-of-bacon-backend
./gradlew run
```

Rendez-vous sur a page http://localhost:8080.

Pour la suite du projet, nous vous conseillons d'importer le backend dans votre IDE/éditeur préféré. Sauf désir de créativité :smiley:, vous n'avez rien à faire dans le front-end.

## Le data set

Les données sont des données qui proviennent de imdb, le dataset est disponible ici : http://bit.ly/imdbdataset

## Votre mission

Le site a été bouchonné (cf `TODO`), vous devez effectuer les tâches suivantes :

- Importer les données dans Neo4J à l'aide de l'outil d'import : [`ìmport-tool`](http://neo4j.com/docs/operations-manual/current/tutorial/import-tool/).
- Implémenter l'Oracle de Bacon à l'aide de Neo4J dans la méthode `com.serli.oracle.of.bacon.repository.Neo4JRepository#getConnectionsToKevinBacon`
- Implémenter la gestion du last 10 search à l'aide de Redis dans la méthode `com.serli.oracle.of.bacon.repository.RedisRepository#getLastTenSearches`
- Importer les données à l'aide de ElasticSearch dans `com.serli.oracle.of.bacon.loader.elasticsearch.CompletionLoader` (alternativement vous pouvez importer les données avec le script node dans `script/insert.js`) (les liens suivants pourront vous aider : [search](https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html), [mapping](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html) et [suggest](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html))
- Implémenter la suggestion sur le nom des acteurs dans `com.serli.oracle.of.bacon.repository.ElasticSearchRepository#getActorsSuggests`

L'évaluation de votre travail sera effectuée selon les critères suivants :

- Bon fonctionnement (First make it work)
- Qualité de la solution implémentée (Then make it good)
- Qualité générale de votre code (et de vos commits, il ne faut pas pousser :smiley:)

La livraison de votre travail s'effectue à l'aide d'une pull-request sur le repository https://github.com/nosql-bootcamp/oracle-of-bacon.

**Vous devez commencer par forker le repository https://github.com/nosql-bootcamp/oracle-of-bacon**
115 changes: 115 additions & 0 deletions oracle-of-bacon-backend/instructions-neo4j.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
This is the instruction to replicate the results over neo4j bacon

1 - create a connection dbms to neo4j
User: oracle-bacon
Password: password
2 - import the data
In the folder of imports copy the three files
***actors.csv, movies.csv, roles.csv***
3 - in your terminal execute bin/cyphershell
User: neo4j
password: password # this is the password of your dbms
4 - Run the following commands in cyphershell
4.1 - First check that the data is right executing the following commands
These commands will return the number of lines, (you should see something like this)


```
neo4j@neo4j> LOAD CSV FROM 'file:///actors.csv' AS row RETURN count(row);
+------------+
| count(row) |
+------------+
| 1854871 |
+------------+

neo4j@neo4j> LOAD CSV FROM 'file:///movies.csv' AS row RETURN count(row);
+------------+
| count(row) |
+------------+
| 759282 |
+------------+

neo4j@neo4j> LOAD CSV FROM 'file:///roles.csv' AS row RETURN count(row);
+------------+
| count(row) |
+------------+
| 13103223 |
+------------+


```


5- Now let's load the data, the following lines ensure that even if you
execute the same script, will not repeat information :v


Actors
```
:auto USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///actors.csv' AS line
WITH line.`name:ID` as name
MERGE(o:Actor{name:name}) set o.name=name
RETURN count(o);
```

Movies
```
:auto USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///movies.csv' AS line
WITH line.`title:ID` as title
MERGE(o:Movie{title:title}) set o.title=title
RETURN count(o);
```

Relations
```
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM 'file:///roles.csv'
AS line WITH line.`:END_ID` as title, line.`:TYPE`
as relation, line.`:START_ID` as actor
MATCH (a:Actor{name:actor})
MATCH (m:Movie{title:title})
MERGE (a)-[rel:PLAYED_IN]->(m)
RETURN count(rel);
```


Queries

Get some actors and movies where they played in
```
MATCH (o:Actor)-[rel:PLAYED_IN]->(p:Movie) RETURN p,rel,o LIMIT 50;
```

Delete all connection type ```relation```
```
match(n)-[r:relation]-(o) delete r;
```

Get movies of a given actor
```
match p=(n:Actor)-[r:PLAYED_IN]-(o:Movie) where n.name="Bacon, Kevin (I)" return p;
match p=(n:Actor)-[r:PLAYED_IN]-(o:Movie) where n.name="A., Randy" return p;

```

Get subgraphs
```
MATCH (o:Actor)-[rel:PLAYED_IN]->(p:Movie)
RETURN p,rel,o LIMIT 100;
```


Get all nodes related to a given node(in this case nodes related to Abadie, William

```
match p=(n:Actor)-[*]-(o:Movie) where n.name="Abadie, William" return p;
```


With the last query now it rests to implement it in java, here we have the link

(Neo4j Data)[https://neo4j.com/developer/java/)

For further information please visit [Import Data](https://neo4j.com/developer/desktop-csv-import/)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.serli.oracle.of.bacon.api.APIEndPoint;
import net.codestory.http.WebServer;

import static com.serli.oracle.of.bacon.utils.EnvUtils.getenv;
import static com.serli.oracle.of.bacon.utils.Utils.getenv;

public class Application {

Expand All @@ -13,7 +13,7 @@ public static void main(String[] args) {
routes.add(new APIEndPoint());
});

String port = getenv("PORT", "8000");
String port = getenv("PORT", "8001");

webServer.start(Integer.valueOf(port));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,64 +22,23 @@ public APIEndPoint() {
}

@Get("bacon-to?actor=:actorName")
// TODO change return type
public String getConnectionsToKevinBacon(String actorName) {
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" +
"]";
redisRepository.insertSearch(actorName);
return neo4JRepository.connectionsToJson(neo4JRepository.getConnections(actorName));
}

@Get("some-nodes")
public String getSomeNodes(String actorName) {
return neo4JRepository.connectionsToJson(neo4JRepository.getSomeNodes());
}

@Get("suggest?q=:searchQuery")
public List<String> getActorSuggestion(String searchQuery) throws IOException {
return Arrays.asList("Niro, Chel",
"Senanayake, Niro",
"Niro, Juan Carlos",
"de la Rua, Niro",
"Niro, Simão");
public List<String> getActorSuggestion(String searchQuery) throws Exception {
return elasticSearchRepository.getActorsSuggests(searchQuery);
}

@Get("last-searches")
public List<String> last10Searches() {
return Arrays.asList("Peckinpah, Sam",
"Robbins, Tim (I)",
"Freeman, Morgan (I)",
"De Niro, Robert",
"Pacino, Al (I)");
return redisRepository.getLastNSearches(10);
}
}
Loading