Introduction à Neo4J

S'intéresser de plus près à l'outil

N'oubliez pas de changer de database entre chaque exercice ! -> Comment Faire ?

On mange où ce midi ?

Aucunes des informations qui vont suivre ne sont à prendre au premier degré !

J'ai modélisé grossièrement nos interactions quant au choix du restaurant où nous allons manger ce midi.

L'idée était de mettre en place des interactions entre des objets hétérogènes en observant une approche orientée résultat.

Vous allez avoir besoin du fichier suivant :«  (vous pouvez déjà l'importer sur votre base comme dans l'exercice précédent) »

exercice_2.cypher

L'objectif sera de répondre à deux questions.

Question

Première question :

Avec qui suis-je compatible ?

Comprendre par là : Est compatible avec moi quelqu'un qui, soit mange  [:MANGE] les mêmes choses que moi, soit [ :AIME] les mêmes restaurants que moi.

Indice
  • Avant de répondre à cette question, il est peut-être judicieux de consulter le graphe importé afin d'en comprendre la structure.

  • Pensez aussi à restreindre le graphe avec des requêtes afin qu'il soit plus lisible.

Indice

On peut toujours enchaîner les requêtes dans le match.

Indice

Il est possible d'écrire cette requête en une ligne de match et un return.

Solution

Voici la requête :

1
match (moi{fullname : 'Ulysse Meyer'})-[r1:MANGE]->(nourriture)<-[r2:MANGE]-(amiparnourriture)
2
match (moi{fullname : 'Ulysse Meyer'})-[r3:AIME]->(restaurant)<-[r4:AIME]-(amiparrestaurant)
3
return r1,r2,r3,r4

Équivalent à :

1
match (amiparrestaurant)-[r4:AIME]->(restaurant)<-[r3:AIME]-(moi{fullname : 'Ulysse Meyer'})-[r1:MANGE]->(nourriture)<-[r2:MANGE]-(amiparnourriture)
2
return r1,r2,r3,r4

Soit visuellement :

Question

Le but de l'exercice est de savoir où l'on va pouvoir manger ce soir.

Par conséquent, je vous le demande, quels restaurants satisferaient un maximum de monde ?

L'objectif est d'obtenir les listes des trois restaurant les plus compatibles avec les différents "human".

Indice

Un restaurant est compatible avec un "human" si, soit l'"human" l' :AIME soit il :PROPOSE un plat que l'"human" :MANGE...

Indice

Pensez à COUNT et WHERE (pour exclure l’intersection de deux relations), aussi, "distinct" exist en Cypher (« count( distinct x) ... » )

Indice

Order By DESC et Limit existe aussi en Cypher.

Indice

On peut enchaîner les relations...

Solution

Voici la requête :

1
match (r:restaurant)<-[:AIME]-(h2:human)
2
match (r:restaurant)-[:PROPOSE]->(:plat)<-[:MANGE]-(h1:human)
3
WHERE not(h1-[:AIME]->r)
4
return r, (count(distinct h1)+count(distinct h2)) as combatibilité_totale
5
order by combatibilité_totale DESC
6
limit 3

C'est Flunch ce soir !

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Ulysse Meyer, 2014 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)