Neo4j
Neo4j est une base de données orientée graphe, c'est-à-dire qu'elle est conçue pour stocker et gérer des données sous forme de graphes. Contrairement aux bases de données relationnelles traditionnelles (comme MySQL ou PostgreSQL) qui utilisent des tables, Neo4j fonctionne avec des nœuds (nodes) et des relations (relationships).
Concepts
Nœuds (Nodes) : Les nœuds représentent des entités, comme des personnes, des objets, des lieux, etc. Chaque nœud peut avoir des propriétés (par exemple, un nœud "Personne" peut avoir un nom et un âge).
Relations (Relationships) : Les relations relient deux nœuds et décrivent la nature du lien entre eux (par exemple, une personne peut "CONNAÎTRE" une autre personne). Les relations peuvent aussi avoir des propriétés.
Propriétés (Properties) : Les nœuds et les relations peuvent avoir des propriétés, qui sont des paires clé-valeur (par exemple, "nom: Alice").
Étiquettes (Labels) : Les nœuds peuvent être étiquetés pour définir leur type (par exemple, un nœud peut avoir l'étiquette "Personne").
Cypher : Neo4j utilise le langage de requête Cypher pour interroger la base de données. C'est un langage spécifique aux graphes, qui permet de facilement décrire des relations complexes entre les nœuds.
Avantages
Modélisation des relations complexes : Contrairement aux bases de données relationnelles, qui nécessitent souvent des jointures coûteuses pour modéliser des relations, Neo4j peut naviguer entre les nœuds et les relations de manière extrêmement efficace.
Performances pour les requêtes de graphe : Les requêtes impliquant plusieurs relations entre des entités (comme les relations sociales, les connexions entre objets, etc.) sont beaucoup plus rapides et plus intuitives à réaliser dans Neo4j.
Utilisation naturelle pour les cas d'utilisation liés aux graphes : Il est particulièrement bien adapté pour les réseaux sociaux, les moteurs de recommandation, la détection de fraudes, la gestion de réseaux, etc.
Exercice
Ajouter le serveur Neo4J à votre environnent Docker
neo4j:
container_name: neo4j
image: neo4j:${NEO4J_VERSION:-5.23.0-community}
ports:
- 7474:7474
- 7687:7687
volumes:
- neo4j:/data
environment:
NEO4J_AUTH: neo4j/${DB_ROOT_PASSWORD}
Rendez vous à l'adresse : http://127.0.0.1:7474/browser/
Exécuter le fichier graphe.txt](graphe.txt) dans le browser Neo4J
Créer les contraintes
CREATE CONSTRAINT FOR (n:Movie) REQUIRE (n.title) IS UNIQUE
CREATE CONSTRAINT FOR (n:Person) REQUIRE (n.name) IS UNIQUE
Créer les index
CREATE INDEX FOR (m:Movie) ON (m.released)
Les requêtes simples
Trouvez l'acteur nommé « Tom Hanks »
MATCH (tom:Person {name: "Tom Hanks"}) RETURN tom
Trouvez le film intitulé « Cloud Atlas »
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"}) RETURN cloudAtlas
Trouvez 10 personnes et renvoyez leurs noms
MATCH (people:Person) RETURN people.name LIMIT 10
Recherchez des films sortis dans les années 1990 et renvoyez leurs titres.
MATCH (nineties:Movie) WHERE nineties.released >= 1990
AND nineties.released < 2000 RETURN nineties.title
Les requêtes de relation
Dans quels films Tom Hanks a-t-il joué ?
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
Qui a réalisé « Cloud Atlas » ?
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name
Qui étaient les co-acteurs de Tom Hanks ?
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN DISTINCT coActors.name
Quel est le lien entre les gens et « Cloud Atlas » ?
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo.roles
Utilisez des modèles de longueur variable pour trouver des films et des acteurs jusqu'à 4 « sauts » de Kevin Bacon.
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood)
RETURN DISTINCT hollywood
Utilisez l'algorithme shortestPath() intégré pour trouver le lien entre Kevin Bacon vers Meg Ryan.
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
Recommandons de nouveaux co-acteurs pour Tom Hanks
Une approche de recommandation de base consiste à trouver des connexions au-delà d'un voisinage immédiat qui sont elles-mêmes bien connectées.
Élargissez les co-acteurs de Tom Hanks pour trouver des co-co-acteurs qui n'ont pas travaillé avec Tom Hanks.
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
Trouvez quelqu’un qui puisse présenter Tom Hanks à son potentiel co-acteur, dans ce cas Tom Cruise.
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
RETURN tom, m, coActors, m2, cruise
Supprimer les données
MATCH (n) DETACH DELETE n
Vérifions que tout est supprimé
MATCH (n) RETURN n