Introduction à Neo4J

Utilisation Massive

! Changez de base de données !

Et si on prenait 1000 noeuds ?

L'objectif de cet exercice est d'observer le comportement du logiciel lorsque l'on a affaire à beaucoup de données :

  • On va créer une liste de noeuds simple avec un CSV

  • On va créer deux types d’interaction entre les noeuds : Suivre un autre noeud (comme on suit un compte sur Twitter) ou Communiquer (unidirectionnel) avec un autre noeud

L'idée est donc de simuler de manière minimaliste un réseau social.

Vous allez avoir besoin du script cypher suivant pour extraire les 3 csvs qui vont suivre :

exercice_3.cypher

node_ex3.csv

relation_1_ex3.csv

relation_2_ex3.csv

Il va falloir modifier le fichier « exercice3.cypher » car il dépend de l'emplacement des fichiers csv sur votre disque (chemin absolu), il est donc préférable de placer les 3 csvs à la racine du disque. Cf capture ci-dessous.

Question

Devant cette masse de données, on peut se demander quels sont les nœuds qui communiquent le plus ?

Indice

Formalisme :

  • Les nœuds sont de la forme : (n:Node {name: 'node_X' }) avec X allant de 1 à 1000

  • Les relations sont de la forme : (n1)-[:SUIVRE { type: 'suivi' }]->(n2) ou (n1)-[:COMMUNIQUER{ type: 'communication' }]->(n2)

Indice

Penser à utiliser LIMIT, c'est conseiller.

Indice

Il est sans doute question de se servir de "ORDER BY"

Solution

Voici la requête :

1
MATCH n-[r]->()
2
where r.type = 'communication'
3
RETURN  n, count(r) 
4
ORDER BY count(r) DESC
5
LIMIT 5

Pour avoir une approche plus visuelle sur un des nœuds les plus communiquant :

1
match (n)-[r]->() where n.name = 'node_100' AND r.type = 'communication' return r

Question

Dans une masse de données comme celle-ci, il pourrait être intéressant de trouver les plus court chemin entre les noeuds.

Indice
  • Il existe une fonction Cypher/Neo4J pour ça : shortestPath qui renvoie la liste des noeuds du plus court chemin d'un noeud donné à un autre.

  • Pour l'utiliser, il faut la lancer dans un match et lui donner une relation en paramètre.

Indice
  • On lui donne une relation ainsi que les deux nœuds précédemment matchés comme ceci : shortestPath((X)-[R*]->(Y)) avec X, Y des noeuds et R une relation.

  • L'étoile '*' désigne le fait que l'on cherche l'ensemble des plus courts chemins.

Solution

Voici la requête :

1
MATCH (n:Node { name:"node_200" }),(n2:Node { name:"node_5" }),
2
  p = shortestPath((n)-[:SUIVRE*]->(n2))
3
RETURN p

Voici la même requête mais avec la relation ":COMMUNIQUER" :

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)