Publié par
Il y a 7 années · 8 minutes · Data

NoSQL Europe : Bases de données graphe et Neo4j


Alors que les autres types de bases de données NoSQL trouvent une partie de leur justification dans la performance qu’elles apportent pour manipuler leur représentation de données respective, les base de données graphe permettent avant tout d’adresser des problèmes complexes, voire impossible à résoudre avec les bases de données relationnelles.

Cet article présente les principes des base de données graphe, leur intérêt, les problèmes qu’elles résolvent. Il s’est attardé sur Neo4j, la base de données graphe majeure actuellement, sur laquelle il travaille au sein de Neo Technology. Cette entreprise suédoise a su s’imposer sur ce marché restreint grâce à un investissement massif dans leur produit couplé à une communication efficace.

Tout en résolvant les problèmes de graphe, Neo4j met en avant ses performances et sa scalabilité (gestion de plusieurs milliards de nœuds de graphe sur une seule instance). Alors que cette base de données a atteint sa version 1.0 il y a 2 mois, il est intéressant de regarder de plus près ce produit et les possibilités offertes par la persistance de graphe.

 

L’intérêt des bases de données graphe

La modélisation de données en graphe

La modélisation de données en graphe est particulièrement intuitive car elle est peu contrainte et correspond directement à la réalité. L’exemple suivant permet de s’en convaincre :

La comparaison avec la modélisation relationnelle ne porte donc pas simplement sur la faisabilité de certaines modélisation mais également sur la flexibilité que l’on obtient puisqu’il n’est ici plus nécessaire d’avoir un schéma figé.

Des possibilités différentes avec les graphes

Un graphe qui contient des données métier peut également stocker lui-même toute forme de méta-donnée :

  • Schéma des données : Les bases de données graphes n’ont pas de schémas qui contraignent le format des données. Il est toutefois possible de définir un schéma sous forme de graphe qui sera manipulé par l’application ou par un framework intermédiaire.
  • Indexes : Beaucoup de structures de données peuvent être représentées sous forme de graphe. Le parcours et la recherche rapide parmi un ensemble de nœuds du graphe peuvent ainsi être facilités en créant une liste chainée ou une skip-list.
  • Configuration : Les paramètres de configuration peuvent être stockés dans des nœuds indépendants du graphe. Non reliés au reste du graphe contenant les données métier, ils peuvent être rendus invisibles lors des traitement fonctionnels tout en étant facilement accessibles par le reste de l’application.

Au-delà de la représentation des données particulière qu’elles proposent, les bases de données graphes se distinguent également par leur capacité à exécuter les algorithmes de graphes courants sur les données qu’elles stockent. Il est ainsi possible de chercher les plus courts chemins d’un nœud à un autre ou les nœuds ayant une position centrale dans un graphe.

Cas d’utilisation

La modélisation des réseaux sociaux est évidemment devenue ces dernières années l’un de cas d’utilisation les plus visibles des bases de données graphe. LinkedIn parvient ainsi facilement à afficher le degré de séparation entre chaque contact, qui n’est finalement que la distance entre les nœuds dans le graphe représentant les personnes et leurs relations. Bien que très intéressante cette problématique n’est pas très courante du fait du faible nombre d’acteurs sur ce marché.

Des cas d’utilisation qui devraient de révéler plus courants sont :

  • la modélisation d’un ensemble de connaissances sur les personnes, et les organisations d’un secteur de marché ou d’un écosystème de manière plus générale.
  • la représentation de données métier particulières telles que celles du cinéma (films, acteurs, réalisateurs, …), de l’édition (livres, auteurs, éditeur, …) ou encore la description de l’ensemble des pièces d’une machine industrielle et de la manière dont elles sont liées entre elles.

Dans tous les cas, une telle base de données sera idéalement intégrée à un environnement de persistance hétérogène (on parle ainsi de « persistance polyglotte ») qui répondrait au différentes problématiques par la meilleure solution.

Neo4j

Tour d’horizon de Neo4j

Neo4j est une base de données graphe en Java prévue pour être embarquée dans une application ou accédée en client / serveur via une API REST. La manipulation de graphe en Java avec Neo4j est très naturelle grâce à son API : Node et Relationship sont les principales classes et permettent de modéliser un graphe tout en adjoignant un ensemble de propriétés à chaque nœud et relation.

Neo4j ne supporte actuellement pas la distribution du graphe sur plusieurs instances. Cette fonctionnalité est connue pour être particulièrement complexe à développer de manière efficace. En effet, les nœuds d’un graphe pouvant avoir un nombre arbitraire de relations, il s’agit de trouver un partitionnement qui soit suffisamment efficace pour entraîner un nombre minimum de sauts d’instances lors du parcours d’un graphe. Neo Technology y travaille malgré tout activement, ce qui devrait conduire à une disponibilité d’une version distribuée de Neo4j d’ici la fin de l’année. En attendant, l’éditeur insiste sur le fait que leur base de données se comporte très bien avec plusieurs milliards de nœuds, sur une seule instance.

Le marché des bases de données graphe est restreint. Neo4j y est très visible mais on lui reproche sa licence GPL 3.0 qui requiert l’achat d’une licence commerciale pour une utilisation normale en entreprise. HypergraphDB peut alors être une alternative. D’autres options peuvent être AllegroGraph ou InfoGrid. FlockDB enfin, est une base de données graphe qui est plus simple. Initialement développée par Twitter, elle résout un ensemble de problématiques beaucoup plus restreint afin de permettre un partitionnement sur plusieurs instances et une latence très faible. FlockDB est développé en Scala et s’appuie sur MySQL.

Premiers pas avec Neo4j

Pour débuter avec Neo4j, l’idéal est de créer une petite application l’embarquant. Neo4j pourra être téléchargé et intégré au projet directement par Maven, en ajoutant son repository (Neo4j n’étant par disponible sur le repository central) et en déclarant la dépendance vers neo4j-kernel :

<repository>
   <id>neo4j-public-repository</id>
   <url>http://m2.neo4j.org</url>
</repository>
<dependency>
   <groupId>org.neo4j</groupId>
   <artifactId>neo4j-kernel</artifactId>
   <version>1.0</version>
</dependency>

La création d’une base de données embarquée se fera par programmation. Les interactions sont alors simples :

GraphDatabaseService graphDb = new EmbeddedGraphDatabase("/var/graphdb");

// Toute lecture et écriture doit se faire dans une transaction avec Neo4J
Transaction tx = graphDb.beginTx();
try
{
   Node jamesGosling = graphDb.createNode();
   Node java = graphDb.createNode();
   Relationship relationship = 
      jamesGosling.createRelationshipTo(java, CustomRelationships.CREATED);
 
   jamesGosling.setProperty("nom", "James Gosling");
   java.setProperty("date", "1995");
   relationship.setProperty("type", "a créé");

   tx.success();
}
finally
{
   tx.finish();
}

graphDb.shutdown();

Comme indiqué, tout accès à la base doit se faire au sein d’une transaction. Les nœuds créés par createNode() ainsi que les relations créées auprès des nœuds sont automatiquement persistés à la fin de la transaction.
Les relations sont typées à l’aide d’une enum implémentant RelationshipType. Ceci permet une validation à la compilation plus efficace qu’avec de simple chaines de caractères. Cette enum est définie ainsi :

public enum CustomRelationships implements RelationshipType {
   CREATED,
   OWNS,
   USES
}

Une fois un graphe créé en base, il est parcouru simplement par accès sur les objets Node et Relationship ou par l’API Traverser. Pour tout parcours, il est toutefois nécessaire d’obtenir un nœud de départ : cette problématique est adressée par des modules complémentaires.

Les modules d’extension

Neo4j se présente sous la forme d’un composant principal et de nombreux modules d’extension. L’un d’entre eux sera particulièrement utile lors des accès au graphe puisqu’il s’agit d’un module d’indexation : Neo4j-index permet d’indexer les nœuds d’un graphe avec Lucene. Il sera alors aisé d’accéder à un nœud pour initier un parcours de graphe.

Neo4j-graph-algo apporte un certain nombre d’algorithmes de graphe (plus court chemin et centrality). Neo4j-rdf permet de transformer Neo4j en stockage RDF.

D’autres extensions sont disponibles et enumérées sur le site de Neo4j.

Conclusion

Parmi les bases de données NoSQL, les bases de données graphe sont celles qui sont le moins souvent mises en avant. Ceci s’explique peut-être par le fait qu’elles cherchent à adresser une problématique qui intéresse encore peu les entreprises. Gageons que ce constat pourrait évoluer si les outils permettant de manipuler ce type de « nuage de connaissance » se multiplient et que le Web sémantique se démocratise.

Si ce scénario se réalisait, Neo4j se retrouverait dans une position très confortable puisque l’investissement important mis dans cette base de données lui a permis de créer la distance avec ses concurrents directs.

Michaël Figuière
Michaël est consultant chez Xebia où il intervient notamment sur des sites Web à fort trafic. A son aise tant avec les environnements JEE qu'avec les technologies de plus bas niveau, il est spécialisé dans les architectures distribuées et les technologies innovantes telles que NoSQL, les moteurs de recherche, ou encore le data mining.

8 réflexions au sujet de « NoSQL Europe : Bases de données graphe et Neo4j »

  1. Publié par Alexandre Bertails, Il y a 7 années

    > sur la flexibilité que l’on obtient puisqu’il n’est ici plus nécessaire d’avoir un schéma figé

    Même si ça marche, dans les faits, c’est une mauvaise idée : c’est moins efficace et vite l’anarchie. Une meilleure formulation : la flexibilité ici est plus sur la capacité de mixer et étendre des « schémas » (cf. RDF et OWL).

    Enfin, dans le cas de neo4j, faire attention quand on mentionne RDF. Dans la réalité, c’est un sous-projet de la communauté, qui n’est plus vraiment maintenu et qui n’était pas du tout compatible avec la nouvelle version de neo4j lorsque j’ai regardé. Par contre, ils ne se provent pas de se faire de la pub avec…

  2. Publié par Michael Figuiere, Il y a 7 années

    Merci pour ces précisions !

    Par « flexibilité » je fais effectivement référence à l’extensibilité et non au fait d’ajouter des relations et des propriétés arbitraires au graphe.

    Michael Figuière (Xebia)

  3. Publié par Eric Taix, Il y a 5 années

    Sauf erreur de ma part la version community est sous licence GPL, ce qui signifie que si on attaque Neo4j via un protocole réseau (REST) on peut utiliser cette version même dans un logiciel fermé et commercial.
    Par contre les versions advanced et enterprise sont sous licence AGPL. Cette licence prévoit que même l’utilisation à travers un protocole réseau revient au même que sans. Donc impossible d’utiliser ces licences dans un logiciel fermé et commercial.

  4. Publié par Neo4jFrance, Il y a 5 années

    Il est bien heureusement tout à fait possible d’utiliser Neo4j dans le cadre d’une application commerciale, open-source ou non. Par exemple, Adobe utilise Neo4j dans un outil de collaboration social, Telenor (Leader Telco Nordics) utilise Neo4j dans un outil de contrôle d’accès.

    :)

  5. Publié par Zida, Il y a 5 années

    comme le modèle relationnel qui assure les propriété ACID, quel son les propriétés assuré par les gaph database? ainsi que les avantage par raport aux autre base de donnée NoSQL
    Merci

  6. Publié par ABIDI, Il y a 4 années

    Bonjour,

    Je suis en train d’utiliser Neo4j, j’ai commencé ça fait 3 jours, pour créer un socle technique.
    J’ai rencontré un problème au niveau de MAJ de données, voici le Query que j’ai implémenté:
    « MERGE person WHERE person.firstName! = {0} SET person.title = {1} RETURN person »

    Résulat: Exception:
    org.springframework.dao.InvalidDataAccessResourceUsageException: Error executing statement MERGE …
    aused by: expected START or CREATE

    Alors, j’ai vu que pour la MAJ on peut utiliser le mot clé MERGE.

    Quelqu’un a une idée SVP?
    Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *