Skip to content
Learni
View all tutorials
Bases de données graphiques

Comment maîtriser Neo4j avancé en 2026

Introduction

Neo4j, base de données graphique leader, excelle dans les relations complexes comme les réseaux sociaux, fraudes ou recommandations. En 2026, avec Graph Data Science (GDS) 2.x et Cypher optimisé, il gère des milliards de nœuds en temps réel. Ce tutoriel avancé vous guide de l'installation Docker à l'intégration Node.js, traversals profonds, algorithmes centrality et tuning performances. Pourquoi c'est crucial ? Les graphes surpassent les RDBMS sur les jointures (jusqu'à 1000x plus rapides) et scalent horizontalement via Fabric. Vous apprendrez à modéliser proprement, indexer pour O(1), et éviter les pièges comme les traversals non bornés. À la fin, vous déployez un système fraud detection fonctionnel, bookmarquez ce guide pour vos projets critiques. (132 mots)

Prérequis

  • Docker 24+ installé et lancé
  • Node.js 20+ avec npm
  • Connaissances Cypher intermédiaires (MATCH, CREATE)
  • Git pour cloner exemples optionnels
  • 8GB RAM minimum pour tests GDS

Installation Neo4j via Docker

docker-run.sh
docker run \
  --name neo4j-adv \
  --publish=7474:7474 --publish=7687:7687 \
  -p 7473:7473 \
  -v $HOME/neo4j/data:/data \
  -v $HOME/neo4j/logs:/logs \
  -v $HOME/neo4j/import:/import \
  -v $HOME/neo4j/plugins:/plugins \
  -v $HOME/neo4j/conf:/conf \
  -e NEO4J_AUTH=neo4j/Passw0rd2026 \
  -e NEO4J_PLUGINS='["graph-data-science","apoc"]' \
  -e NEO4J_dbms_memory_pagecache_size=2G \
  neo4j:5.21-enterprise

Ce script lance Neo4j Enterprise 5.21 avec GDS et APOC activés, volumes persistants, et auth par défaut. Le port 7474 est pour le Browser, 7687 pour Bolt (drivers). Ajustez RAM via pagecache pour datasets >1M nœuds ; évitez community pour GDS pro.

Première connexion et setup

Accédez à http://localhost:7474, login neo4j/Passw0rd2026. Exécutez :server switch bolt://localhost:7687 dans le Browser. Activez GDS via CALL gds.debug.sysInfo() et APOC avec CALL apoc.help("terms"). Importez un dataset test : téléchargez LDBC SNB dans /import. Cette base prépare traversals avancés.

Modélisation graphe fraud detection

create-fraud-schema.cypher
CREATE CONSTRAINT account_id IF NOT EXISTS FOR (a:Account) REQUIRE a.id IS UNIQUE;
CREATE CONSTRAINT user_id IF NOT EXISTS FOR (u:User) REQUIRE u.id IS UNIQUE;
CREATE CONSTRAINT transaction_id IF NOT EXISTS FOR (t:Transaction) REQUIRE t.id IS UNIQUE;

// Nœuds de base (100 comptes/users)
UNWIND range(1,100) AS i
CREATE (u:User {id: 'U'+i, name: 'User'+i, country: 'FR'})
CREATE (a:Account {id: 'A'+i, balance: rand()*10000, userId: 'U'+i});

// Transactions frauduleuses (liens suspects)
UNWIND [
  {from: 'A1', to: 'A50', amount: 50000, time: datetime()},
  {from: 'A50', to: 'A1', amount: 49900, time: datetime() + duration('PT1H')}
] AS tx
MATCH (from:Account {id: tx.from}), (to:Account {id: tx.to})
CREATE (t:Transaction {id: randomUUID(), amount: tx.amount, time: tx.time})
CREATE (from)-[:TRANSFERRED {amount: tx.amount}]->(t)-[:TO]->(to)
CREATE (u:User {id: 'Fraudster1', name: 'Suspect', country: 'XX'})-[:OWNS]->(a:Account {id: 'A50', balance: -1000});

Ce script crée contraintes UNIQUE pour perf, puis un graphe fraud avec cycles suspects (A1<->A50). 100 nœuds de base + 2 tx circulaires. Utilisez UNWIND pour bulk insert scalable ; UUID pour ids immuables. Exécutez dans Browser pour ~50ms.

Traversal profond et pattern matching

advanced-traversal.cypher
// Trouver cycles frauduleux (profondeur 3)
MATCH path = (source:Account {id: 'A1'})-[:TRANSFERRED*1..3]->(target:Account)
WHERE source <> target AND ALL(r IN rels(path) | r.amount > 40000)
RETURN path, reduce(total=0.0, r IN rels(path) | total + r.amount) AS totalAmount
ORDER BY length(path) ASC
LIMIT 5;

// Shortest path avec poids
MATCH (start:Account {id:'A1'}), (end:Account {id:'A50'})
CALL gds.shortestPath.dijkstra.stream({
  sourceNode: start, targetNode: end,
  relationshipType: 'TRANSFERRED',
  relationshipWeightProperty: 'amount'
})
YIELD index, sourceNode, targetNode, totalCost, path
RETURN gds.util.asNode(sourceNode).id AS from,
       gds.util.asNode(targetNode).id AS to,
       totalCost, path
ORDER BY index;

Premier query détecte cycles via variable-length paths borné (*1..3) et ALL() predicate. Deuxième utilise GDS dijkstra pour SP pondéré (amount). Bornes évitent explosion combinatoriale ; stream() pour lazy eval. Résultat : paths frauduleux en <10ms.

Optimisation avec indexes et GDS

Les traversals explosent sans indexes : O(n!) vs O(log n). Ajoutez composite indexes pour patterns récurrents. GDS projette graphes en mem pour algos parallèles (PageRank, Louvain). Pour fraud, calculez betweenness centrality : nœuds centraux = suspects.

Indexes, contraintes et GDS centrality

indexes-gds.cypher
// Indexes composites pour perf
CREATE INDEX account_balance IF NOT EXISTS FOR (a:Account) ON (a.balance, a.id);
CREATE INDEX transaction_time IF NOT EXISTS FOR (t:Transaction) ON (t.time);

// Projetter graphe GDS (in-mem)
CALL gds.graph.project(
  'fraudGraph',
  'Account',
  'TRANSFERRED',
  {relationshipProperties: 'amount'}
);

// Betweenness Centrality (fraud score)
CALL gds.betweenness.stream('fraudGraph', {
  maxIterations: 100,
  centralityRangeFrom: 0.9
})
YIELD nodeId, score
WHERE gds.util.asNode(nodeId).balance < 0
RETURN gds.util.asNode(nodeId).id AS account,
       score AS fraudScore
ORDER BY score DESC
LIMIT 10;

// Drop graph
CALL gds.graph.drop('fraudGraph');

Indexes sur props filtrés boostent SCANs. GDS project() crée vue mem (scalé à 1B edges). Betweenness identifie brokers frauduleux ; rangeFrom prune low scores. Drop() libère RAM ; itérez en prod via Cypher procedures.

Intégration Node.js avec driver

neo4j-client.ts
import { Neo4j } from 'neo4j-driver';

const driver = Neo4j.driver(
  'bolt://localhost:7687',
  Neo4j.auth.basic('neo4j', 'Passw0rd2026')
);

const detectFraud = async () => {
  const session = driver.session({ database: 'neo4j' });
  try {
    const res = await session.executeRead(tx => tx.run(
      `MATCH (a1:Account {id: $id1})-[:TRANSFERRED*1..2]-(a2:Account)
       WHERE a2.balance < 0
       RETURN a1.id AS source, a2.id AS suspect, count(*) AS hops`,
      { id1: 'A1' }
    ));
    res.records.forEach(record => {
      console.log(`Fraud path: ${record.get('source')} -> ${record.get('suspect')} (${record.get('hops')} hops)`);
    });
  } catch (error) {
    console.error('Query failed:', error);
  } finally {
    await session.close();
  }
};

detectFraud().finally(() => driver.close());

Driver TS officiel gère pool sessions. executeRead() pour queries RO safe (ACID). Params $id1 préviennent injections. Close() explicit pour prod ; utilisez Rx pour streams async. Installez via npm i neo4j-driver. Exécutez avec ts-node.

Transaction write avancée avec APOC

apoc-transaction.cypher
// Bulk update avec APOC (path expansion)
MATCH (a:Account {id: 'A1'})-[:TRANSFERRED*]->(suspicious:Account {balance: -1000})
CALL apoc.do.case([
  length((a)-[:TRANSFERRED*]->(suspicious)) > 1, 'SET suspicious.riskScore = 0.95',
  suspicious.country <> 'FR', 'DETACH DELETE suspicious'
], '', {suspicious: suspicious, a: a}) YIELD value
RETURN value;

APOC.do.case() conditionne updates bulk. Path expansion *-> compte cycles. riskScore prop pour ML downstream. DETACH DELETE nettoie graphe ; utilisez en tx write pour atomicité.

Bonnes pratiques

  • Modélisez directionnel : [:OWNS]-> vs bidir pour traversals rapides.
  • Bornez toujours paths (*1..5) et utilisez PROFILE pour EXPLAIN.
  • GDS en batch : project() une fois, stream/write multiple algos.
  • Indexes sélectifs : seulement sur equality + range props.
  • Fabric pour scale : shard multi-instances sans downtime.

Erreurs courantes à éviter

  • Traversals non bornés : explosion mem (limitez ..5 max).
  • Oublier close() driver/session : leaks connexions Bolt.
  • Pas d'indexes sur labels seuls : full scans lents >1M nœuds.
  • GDS sur graphe live : project() copie, double RAM usage.

Pour aller plus loin

Explorez Neo4j Sandbox pour datasets prêts. Lisez Graph Algorithms Book. Maîtrisez AuraDB pour cloud. Découvrez nos formations Learni sur graphes et certification Neo4j.