Aller au contenu
DataNeo4JNoSQL

Introduction aux bases de données Orientées Graphes

Les bases de données Orientées Graphes proposent une nouvelle façon de travailler sur des domaines complexes. Découvrons pourquoi et comment utiliser Neo4J !

Pourquoi et comment utiliser Neo4J ?

Les bases de données orientées graphes telles que Neo4J appartiennent à la catégorie des bases de données NoSQL. Comme les autres types de bases de cette catégorie, elles ont été conçues dans le but de répondre à des besoins précis, ce qui en fait une bonne addition pour sa boîte à outils technique.

A la différence des bases orientées documents comme MongoDB ou CouchDB, qui ont pour but d'offrir un stockage d'objets complexes au format Json ou Xml, les bases orientées graphes ont pour but de stocker des objets simples aux nombreuses relations.

Applications dans le monde réel

De nombreuses sociétés utilisent déjà les bases de données orientées graphes comme Neo4J pour répondre à des besoins réels. J'ai sélectionné quelques exemples d'utilisation où ce type de bases excelle tout particulièrement :

Les réseaux sociaux

Prenons le cas de Behance, le réseau social créatif d'Adobe qui doit gérer plus de 18 millions d'utilisateurs. La pierre angulaire des réseaux sociaux est le fil d'activité qui permet à un utilisateur d'afficher tous les contenus des personnes qu'il suit ou qui lui sont recommandés. La taille et la complexité des relations d'un tel service augmentent avec le nombre d'utilisateurs et le contenu générés par ceux-ci provoquent des problèmes de performance ainsi que de coût sur l'architecture mise en place.

L'utilisation de graphes dans ce cas de figure permet de réduire la complexité en simplifiant le modèle de données et son utilisation ainsi que d'optimiser les performances.

Détection de fraude

La détection de fraude dans les secteurs bancaire et l’assurance pour un acteur comme Zurich Suisse est vitale et la gestion et détection de fraude deviennent de plus en plus avancées afin d'analyser les comportements et séparer les vraies fraudes des faux-positifs.

Dans cette situation les graphes permettent des analyses plus poussées et bien plus rapides que les bases relationnelles ordinaires afin de comprendre les liens et de créer des alertes lorsque certaines valeurs sont dépassées.

Recommandations

Dans le domaine de l'e-commerce, prenons Ebay: les moteurs de recommandations (de plus en plus calculés en temps réel) doivent permettre de trouver les produits correspondants aux recherches et précédents achats des utilisateurs. Ces recherches s'effectuent sur un grand nombre de paramètres du comportement utilisateur ainsi que sur des bases d'articles de plus en plus imposantes. Les bases de données orientées graphes peuvent contenir le catalogue des produits ainsi que les interactions clients dans des modèles performants afin de déterminer les recommandations au plus vite.

Identité et gestion des accès

Chez Comcast ou Microsoft par exemple, relier des comptes utilisateurs à des domaines sur lesquels ils ont des droits et des rôles différents peut rapidement devenir un besoin complexe, sans parler de la scalabilité. Les graphes permettent de gérer et visualiser ces données tout en répondant aux besoins de performances attendus par les utilisateurs.

Le fonctionnement de Neo4J

Le type de bases de données orienté graphe a comme particularité qu'il stocke deux types de données d'égale importance :

  • Les entités stockées sous forme de nodes.
  • Les relations entre ces entités.

Ce fonctionnement unique permet de favoriser les jointures entre les données afin d'effectuer des recherches performantes sans avoir à recalculer leurs relations à la volée. Grâce à cela, les bases orientées graphes sont particulièrement utiles pour modéliser des domaines complexes ou effectuer des analyses sur un grand nombre d'entités différentes pour y chercher des motifs. Neo4J propose son propre langage de requête nommé Cypher. Il existe un grand nombre de connecteurs pour à peu près tous les langages mais nous allons rester sur la syntaxe standard de Cypher.

Comment je crée un Node?

Voici un exemple de création de nodes :

CREATE (n: User {name: 'Joany', title: 'developper'})

On crée ici une node n possédant un label, comme un titre, User ainsi que des propriétés (ici name et title). Sur Neo4J on peut créer une node avec autant de labels et de propriétés que l'on souhaite.

Bien que les propriétés soient sous une forme qui rappelle un objet, celles-ci possèdent une limitation importante qu'il faut toujours garder à l’esprit : elles doivent forcément être de type primitif ou tableau de primitif.

Les valeurs possibles pour les primitifs sont :

  • Un booléen
  • Une date ou une durée
  • Un nombre (float ou integer)
  • Une chaine de charactères
  • Un point

Impossible donc d'imbriquer des objets comme on pourrait faire dans les philosophies orientées documents par exemple. Le seul moyen de lier plusieurs objets métier est donc de créer des relations entre les nodes.

Comment je crée une relation?

Une relation doit forcément relier deux nodes. Elle peut posséder des labels et des propriétés tout comme une node. Ici on va commencer par chercher les nodes existantes que l'on veut lier. Nous verrons plus en détail la recherche et l'affichage dans la prochaine partie. Pour l'instant contentons-nous de créer la relation entre ces deux nodes:

MATCH (a: User), (b: User)
WHERE a.name = 'Joany' AND b.name = 'Pierre'
CREATE (a)-[r: HAS_FRIEND]->(b)

Ici on a créé une relation avec un label qui va nous servir plus tard de type pour la recherche. On peut également remarquer que cette relation possède une direction. C'est a qui est ami avec b. Une relation entre deux nodes peut également être bidirectionnelle ou sans direction en fonction des flèches ajoutées (->).

Il est également possible de créer une relation et une node en même temps, comme ici :

MATCH (a: User)
WHERE a.name = 'Joany'
CREATE (a)-[r: HAS_WATCHED]->(b: Movie {name: 'Inception'})

Ou tout l'arbre correspondant:

CREATE (a: User {name: 'Clément'})-[r: HAS_WATCHED]->(b: Movie {name: 'Inception'})<-[n: HAS_WATCHED]-(c: User {name: 'Sarah'})

Ici on a donc deux nouvelles nodes User qui ont toutes les deux une relation Has_Watched vers le même film. Avec tout cela nous avons donc le graphe suivant dans l’outil de visualisation de Neo4J :

Comment je recherche dans un graphe?

Comme tout langage de requête, Cypher a comme objectif premier de permettre la recherche d'informations dans les graphes stockés dans Neo4J.

MATCH (:User {name: 'Joany'})-[:HAS_FRIEND]->(a: User)
RETURN a

Par exemple ici la récupération de tous les Users liés par la relation Has_Friend. La notation reste proche de ce que l'on a pu voir plus haut pour la création. La requête nous renverra la node de Pierre au format Json:

{
  "identity": 49,
  "labels": [
    "User"
  ],
  "properties": {
    "name": "Pierre",
    "title": "musician"
  },
  "elementId": "49"
}

Le sens d'une relation n'a pas d'importance lorsque l'on effectue une recherche. On pourrait très bien trouver les personnes qui ont déjà regardé un film particulier même si nous avons créé la relation dans le sens User vers Movie comme dans l'exemple plus haut :

MATCH (u: User)-[:HAS_WATCHED]-(m: Movie {name: 'Inception'})
WITH (u)
ORDER BY u.name
RETURN collect(u.name)

J'en profite ici pour ne récupérer que les noms des Users ayant regardé le film dans une liste ordonnée alphabétiquement. Le résultat de la requête me renverra par exemple ["Clément", "Joany", "Sarah"].

Le dernier cas de figure que je voulais partager avec vous concerne les Matchs optionnels. Dans ce cas de figure, j'essaie de récupérer les informations pour afficher sur un profil utilisateur. Je veux la node User ainsi que tous les Comments associés :

MATCH (a: User {name: 'Joany'})
OPTIONAL MATCH (a)-[:HAS_WRITTER]->(c: Comment)
RETURN a, c

Dans cet exemple, je ne suis pas sûr que l'utilisateur que je cible ai déjà écrit de commentaires. C'est un point important car un User sans commentaire dans le cas d'un Match simple ne m'aurait pas retourné de résultat, que le User existe ou non. Le Match vérifie qu'un User ayant au moins une relation de type Has_Written le liant à une note Comment existe. Avec un Optionnal Match en revanche, je récupérerai mon User même s'il n'a pas écrit de commentaire.

Au travers de ces exemples simples, nous avons fait le tour des fonctionnalités de base. On aurait pu parler de la mise à jour de données déjà enregistrées ainsi que des cas plus complexes d'utilisation de Cypher mais je vous laisse continuer ce voyage. Vous avez maintenant toutes les clés en main pour continuer l’aventure et utiliser les bases de données orientées graphes dans les meilleures conditions.

Quelques ressources pour aller plus loin

L'introduction aux graphes par Neo4J

Le manuel de Neo4J pour Cypher

Le livre blanc sur des cas d'utilisation réels

Dernier