Module 11 — Modéliser un graphe et le charger : contraintes, index, LOAD CSV
Le mini-graphe de l'équipe Veille tient sur onze nœuds : parfait pour comprendre Cypher, insuffisant pour la production. Inès demande à Sami de charger le vrai corpus, les 200 853 articles du jeu News, dans Neo4j pour que Karim puisse ensuite écrire la recommandation. Ce module lui apprend à passer d'une table plate (news.csv) à un graphe pertinent, à poser les contraintes et les index dans le bon ordre, et à charger le tout en vingt-cinq secondes avec LOAD CSV WITH HEADERS et CALL { } IN TRANSACTIONS.
De la table au graphe : trois questions
Un fichier CSV liste des articles avec leurs colonnes ; un graphe met en relation des entités. Le passage se fait avec trois questions qu'on pose à chaque colonne.
- Est-ce qu'on va la filtrer ou la traverser ? Si oui, elle mérite de devenir un nœud. Une catégorie qu'on va lister, filtrer et suivre est un nœud ; un identifiant qu'on ne regarde jamais reste une propriété.
- Est-ce qu'elle relie deux entités ? Alors c'est une relation. « L'article X est publié dans la catégorie Y » n'est pas une propriété, c'est une relation
PUBLIE_DANS. - Est-ce qu'on veut simplement l'afficher ? Elle reste une propriété du nœud auquel elle appartient. Le titre, la date et le lien de l'article sont des propriétés : on ne recherche pas « tous les articles avec exactement ce titre », on les affiche une fois l'article trouvé.
Deux conventions de nommage rendent le graphe lisible.
- Étiquettes : un mot, au singulier, en PascalCase —
Article,Categorie,Auteur. JamaisArticles, jamaisarticle. - Relations : en majuscules, souvent un verbe conjugué à la troisième personne —
PUBLIE_DANS,ECRIT_PAR,HABITE. Le sens de la flèche va du sujet vers le complément : « l'article est publié dans la catégorie », donc(:Article)-[:PUBLIE_DANS]->(:Categorie).
Ces conventions ne sont pas décoratives : elles font que le motif Cypher se lit comme une phrase. MATCH (a:Article)-[:ECRIT_PAR]->(au:Auteur) se lit sans effort « l'article a est écrit par l'auteur au ». C'est le premier gain sur SQL.
Le modèle Veille
Trois entités, deux relations, aucune ambiguïté.
(:Article {id, titre, date, lien})-[:PUBLIE_DANS]->(:Categorie {nom})
(:Article)-[:ECRIT_PAR]->(:Auteur {nom})
Chaque article a une catégorie (relation obligatoire) et zéro, un ou plusieurs auteurs (relation optionnelle et multiple). Cinq propriétés au total : id et nom servent de clés d'unicité, titre, date et lien sont là pour l'affichage et le tri. Rien de plus. On ne dupliquera pas le titre sur l'auteur, ni la catégorie sur l'article : le graphe le fait pour nous.
Categorie du champ category de l'article ?Dans Elasticsearch, category reste une chaîne keyword sur le document : c'est l'objet qu'on cherche. Dans Neo4j, on veut lister les catégories, en compter les articles, sauter d'un auteur à ses catégories favorites — donc en faire un nœud. Les deux moteurs ne modélisent pas la même chose parce qu'ils ne répondent pas à la même famille de questions.