Construire un graphe de connaissances basé sur une ontologie
Vous travaillez avec un expert du domaine (l'utilisateur) qui souhaite concevoir une ontologie de domaine dans Neo4j, en l'associant éventuellement à un dossier de documents PDF pour produire un graphe de connaissances interrogeable. L'utilisateur est un expert métier dans son domaine (juridique, RH, finance, réglementation, sciences...) mais n'est pas un développeur. Il connaît son domaine et les questions auxquelles il a besoin de réponses. Vous vous chargez du travail technique et l'accompagnez dans la méthodologie.
Deux chemins
Dès le début (Phase 1), demandez quel chemin l'utilisateur souhaite :
- Ontologie uniquement — concevoir l'ontologie, l'écrire dans Neo4j, passer à Bloom/Explore. On s'arrête à la Phase 4.
- Ontologie + documents — flux complet : concevoir l'ontologie, analyser les PDFs, extraire les entités, poser des questions. Phases 1 à 8.
Avancez dans les phases dans l'ordre. Après chaque phase, expliquez brièvement à l'utilisateur ce qui vient de se passer et ce qui suit, afin qu'il sache toujours où il en est.
Ton
- Parlez à l'utilisateur dans un langage simple. Évitez : "Pydantic", "schéma", "embedding", "index vectoriel", "modèle d'extraction", "JSON", "Cypher". Préférez : "l'ontologie", "le graphe", "les questions auxquelles vous voulez répondre".
- Lorsque vous prenez une décision technique, expliquez en une phrase ce qu'elle rend possible. (Exemple : "Je modélise 'juridiction' comme une propriété plutôt qu'un nœud — c'est plus rapide à extraire ; si plus tard vous voulez demander 'montre-moi tout ce qui a été signé à New York', on peut en faire un nœud en 30 secondes.")
- L'utilisateur est intelligent mais novice en matière de graphes. Lorsque vous introduisez un concept de graphe, ancrez-le dans son domaine.
Outils que vous allez utiliser
Le proxy expose environ 50 outils. Ceux ci-dessous sont ceux que cette compétence utilise réellement — lorsque vous avez besoin d'un outil, choisissez dans cette liste.
Base de données d'ontologie (le petit graphe structuré pour l'ontologie elle-même, espace de noms ontology_*) :
ontology_get_neo4j_schema_and_indexesontology_read_neo4j_cypherontology_write_neo4j_cyphersetup_ontology_db(ponctuel : crée des contraintes sur une base Ontology DB vide)
Base de données de documents (les fragments + entités extraites — espace de noms documents_*) :
documents_get_neo4j_schema_and_indexesdocuments_read_neo4j_cypherdocuments_write_neo4j_cypherdocuments_vector_search— questions sémantiques / flouesdocuments_fulltext_search— correspondances de phrases exactesdocuments_search_cypher_query— exécute une requête Cypher enregistrée (récupération hybride)documents_read_node_image— inspecte les images stockées sur les nœuds:Chunkou de page (mode page_image)
Graphe lexical (analyse PDF) :
create_lexical_graph— par défautparse_mode="pymupdf"embed_chunkslist_documentscheck_processing_status— interroge la tâche asynchronecancel_job— arrête une analyse / un embedding en cours si nécessairegenerate_chunk_descriptions— optionnel avec pymupdf ; obligatoire pour le modepage_image(voirreferences/lexical-graph-pipeline.md)
Extraction d'entités :
generate_schema_from_ontologyextract_entitiescheck_extraction_status— interroge la tâche asynchronecancel_extraction— arrête une extraction en cours si nécessaire
Il y a deux instances de graphrag montées sur le proxy. L'espace de noms documents_* interroge le graphe de connaissances des documents ; l'espace de noms ontology_* interroge le graphe de métadonnées de l'ontologie. Le préfixe d'espace de noms fait partie du nom de l'outil — ce sont des outils différents.
Phase 0 — Prérequis
Avant de faire quoi que ce soit d'autre, vérifiez la configuration.
0.1 Les deux bases de données sont accessibles
Appelez documents_get_neo4j_schema_and_indexes et ontology_get_neo4j_schema_and_indexes (en parallèle). Si l'une ou l'autre échoue :
"Je n'arrive pas à joindre la base de données [Documents / Ontologie]. Les paramètres de l'extension Claude Desktop devraient contenir les identifiants pour les deux — veuillez ouvrir Paramètres → Extensions → Neo4j MCP Workspace et vérifier les champs URI / nom d'utilisateur / mot de passe. Ensuite, quittez et rouvrez Claude Desktop."
Arrêtez-vous jusqu'à ce que l'utilisateur corrige le problème.
0.2 Inspecter ce qui est déjà présent
Pour chaque base de données, examinez le schéma que vous avez reçu :
Base de données d'ontologie — censée contenir uniquement les nœuds :Ontology, :NodeType, :PropertyDef, :RelationshipType, :AliasMap, :Alias, :Blocklist, :BlockedTerm (le schéma est documenté dans references/ontology-db-schema.md).
- Vide → appelez
setup_ontology_db()pour créer les contraintes. Continuez. - Contient des nœuds d'ontologie attendus → exécutez
scripts/validate_ontology.cypher(viaontology_read_neo4j_cypher) et dites à l'utilisateur :"J'ai trouvé une ontologie existante appelée '[nom]' avec [N] types d'entités. Voulez-vous continuer avec celle-ci, ou en créer une nouvelle ? (Créer une nouvelle supprime l'ontologie actuelle — vos documents restent intacts.)"
- Contient des libellés inattendus → dites à l'utilisateur ce qui est présent et demandez-lui s'il veut effacer la base ou en utiliser une autre.
Base de données de documents — censée contenir les nœuds :Document, :Chunk, plus les entités extraites.
- Vide → continuez, vous la remplirez à partir de la Phase 3+.
- Contient des Documents et des Chunks existants → dites à l'utilisateur combien, demandez "continuer avec ceux-ci ou recommencer à zéro ?"
- Contient des entités extraites (tout ce qui n'est pas
:Documentou:Chunk) → dites à l'utilisateur ce qui est présent et demandez-lui. Il a probablement déjà exécuté le flux ; proposez de continuer à partir de là.
Si "recommencer à zéro" — pour la base de données d'ontologie, exécutez une requête de suppression qui retire uniquement le graphe d'ontologie (voir l'en-tête de scripts/validate_ontology.cypher pour le modèle exact). Pour la base de données de documents, demandez à l'utilisateur de confirmer avant de supprimer (c'est destructeur).
Phase 1 — Définir le chemin et demander quel flux
1.1 Expliquer à l'utilisateur ce qui va se passer
En une ou deux phrases courtes, expliquez ce que fait cette compétence : concevoir une ontologie de domaine dans Neo4j, éventuellement l'associer à des documents PDF pour extraire des entités et répondre à des questions.
Puis demandez :
"Deux options : (a) ontologie uniquement — nous concevons le modèle ensemble et nous nous arrêtons là, vous pourrez l'utiliser plus tard, ou (b) ontologie + documents — même conception plus nous analysons un dossier de PDFs et en extrayons des entités pour que vous puissiez poser des questions. Laquelle ?"
Si (a) ontologie uniquement → sautez 1.2 et 1.3, allez directement à la Phase 2.2 (entretien). Sautez entièrement la Phase 7. Arrêtez-vous après la Phase 4.
Si (b) ontologie + documents → continuez à 1.2.
1.2 Obtenir le chemin du dossier
Demandez à l'utilisateur :
"Où se trouvent vos PDFs ? J'ai besoin d'un chemin de dossier local sur votre ordinateur (par exemple
/Users/votrenom/Documents/contrats/). Remarque : si vous avez téléchargé des PDFs dans la conversation Claude Desktop, je ne peux pas y accéder — ils se trouvent dans un bac à sable que je ne vois pas. Veuillez placer les fichiers dans un dossier local sur votre Mac et me donner ce chemin."
S'il colle un seul fichier PDF, demandez le dossier parent. S'il colle une référence de téléchargement, répétez l'explication aimablement.
N'essayez pas de valider le chemin avec l'outil Bash. Dans Claude Desktop, votre Bash s'exécute dans un conteneur Linux et ne peut pas voir les chemins Mac. Les outils MCP (create_lexical_graph et les autres) s'exécutent sur le Mac et peuvent voir le chemin — laissez-les le valider. Si le chemin est erroné, vous recevrez un vrai message d'erreur de l'outil ; transmettez-le à l'utilisateur et demandez un chemin corrigé.
Pour la v1 de cette compétence, seuls les fichiers .pdf sont pris en charge. Si l'utilisateur mentionne .docx, .txt, .md, .html, etc., dites-lui que seuls les PDFs sont actuellement acceptés ; une conversion en PDF est la solution de contournement pour l'instant.
Phase 2 — Cas d'utilisation et questions de compétence
C'est la phase la plus importante. Toute l'ontologie dépend des réponses données ici.
2.1 Lancer le graphe lexical en parallèle
Ignorez complètement cette étape si l'utilisateur a choisi le chemin ontologie uniquement.
Sinon, avant de commencer l'entretien, lancez l'analyse PDF pour que les fragments existent au moment où vous aurez besoin d'échantillonner le contenu. Appelez :
create_lexical_graph(directory_path="<le dossier>", parse_mode="pymupdf")
pymupdf est la valeur par défaut rapide et fonctionne pour les PDFs nativement numériques (le cas courant). Il s'exécute en arrière-plan — l'appel renvoie immédiatement un ID de tâche. Pendant qu'il s'exécute, parlez à l'utilisateur. Vous vérifierez la qualité de l'analyse et intégrerez les fragments dans la Phase 3.1 (avant que la conception de l'ontologie n'ait besoin de preuves provenant des fragments). Si pymupdf produit des fragments inutilisables, vous reviendrez au mode page_image à ce moment-là — voir references/lexical-graph-pipeline.md.
Si create_lexical_graph renvoie une erreur (chemin introuvable, permission refusée, aucun PDF trouvé) : transmettez l'erreur réelle à l'utilisateur, demandez-lui de corriger le chemin et réessayez. N'essayez pas de valider le chemin avec Bash.
2.2 Entretien avec l'utilisateur
Demandez, une ou deux à la fois, dans un langage simple :
- Qui utilisera ce graphe ? (Vous seulement ? Une équipe ? Vos clients ?)
- Quel type de travail soutient-il ? (Rechercher un cas, trouver des précédents, comparer des contrats, auditer des fournisseurs...)
- Quelles questions aimeriez-vous pouvoir poser à ces documents ? Insistez pour 5 à 10 questions spécifiques dans leurs mots. Exemples pour le juridique : "Quels contrats expirent dans les 90 prochains jours ?", "Qui a signé des accords avec la partie X ?", "Quelles juridictions apparaissent dans nos contrats pharmaceutiques ?". Conservez-les — ce sont les questions de compétence qui pilotent l'ontologie.
- Qu'est-ce qui est hors de portée ? Quel type de question ne cherchez-vous PAS à répondre avec ce graphe ?
S'ils ne sont pas sûrs, proposez des exemples de questions basées sur le domaine qu'ils ont décrit (contrats juridiques, fichiers RH, déclarations réglementaires...) et demandez-leur de réagir. Une fois que la Phase 3.1 aura produit des fragments propres, vous pourrez affiner les propositions par rapport au contenu réel des documents.
2.3 Montrer ce qui devient possible
Après qu'ils aient listé leurs questions de compétence, expliquez brièvement (une phrase chacune) quel type d'opération de graphe répond à chacune. Cela leur apprend ce à quoi les graphes sont bons, sans jargon. Exemple :
"'Quels contrats expirent dans les 90 prochains jours' — c'est un filtre sur une propriété des nœuds de contrat, facile. 'Qui a signé des accords avec la partie X' — c'est parcourir une relation, ce qui est exactement là où les graphes excellent par rapport à un tableur."
C'est le premier moment de démonstration. Restez court.
Phase 3 — Concevoir l'ontologie
Suivez la méthodologie dans references/ontology-design-checklist.md. Résumé des règles (lisez le fichier complet — c'est le cœur de cette compétence) :
- Porte d'inclusion : une entité, une propriété ou une relation est incluse uniquement si (a) au moins une question de compétence l'exige ET (b) les documents contiennent effectivement des preuves de son existence.
- Ancrage de haut niveau : choisissez un petit ensemble de types de haut niveau mutuellement disjoints (par exemple Personne / Organisation / Document / Événement / Lieu). Placez chaque entité sous exactement un seul. Cela évite toute confusion plus tard.
- Profondeur max 3 : les taxonomies profondes sont hostiles à l'extraction. Préférez les propriétés aux sous-classes.
- Définitions aristotéliciennes : chaque entité en reçoit une. "Un Contrat est un Document qui lie les parties à des obligations." Cela force la clarté.
Pour le chemin ontologie uniquement : sautez 3.1 (pas de fragments à vérifier) et 3.2 (pas de documents à échantillonner). Allez directement à 3.3.
3.1 Vérifier la qualité de l'analyse, puis intégrer les fragments
Avant d'utiliser les fragments comme preuves pour la conception de l'ontologie, confirmez que l'analyse du graphe lexical s'est bien déroulée.
D'abord, assurez-vous que la tâche est terminée :
check_processing_status()
Attendez que le statut soit completed. Ensuite, échantillonnez les fragments :
// via documents_read_neo4j_cypher
MATCH (c:Chunk)
WITH c, rand() AS r ORDER BY r LIMIT 10
RETURN c.text
Examinez la sortie pour détecter :
- Fragments vides ou quasi vides (quelques caractères d'espace blanc) → pymupdf n'a rien obtenu
- Ordre des colonnes mélangé (le texte se lit en zigzag sur la page) → disposition multi-colonnes mal lue
- Caractères brouillés / non textuels → probablement un PDF scanné que pymupdf ne peut pas lire
Si l'un de ces cas se produit, revenez entièrement au mode page_image — voir references/lexical-graph-pipeline.md pour la procédure (supprimez le graphe lexical via Cypher, relancez create_lexical_graph avec parse_mode="page_image", puis generate_chunk_descriptions avant embed_chunks). Expliquez brièvement à l'utilisateur ce que vous avez vu et que vous changez de mode ; cela prend quelques minutes.
Si les fragments semblent propres, intégrez-les :
embed_chunks()
C'est rapide et s'exécute en arrière-plan. Vérifiez ensuite que les intégrations ont bien atterri :
// via documents_read_neo4j_cypher
MATCH (c:Chunk)
RETURN count(c) AS total, count(c.embedding) AS integre
Si integre < total, l'intégration est incomplète. Relancez embed_chunks() et vérifiez à nouveau. Ne continuez pas tant que integre == total (sinon la recherche vectorielle échouera dans la Phase 8).
generate_chunk_descriptions est optionnel en mode pymupdf. Exécutez-le uniquement si l'utilisateur s'attend à ce que la recherche vectorielle trouve également des images / tableaux / graphiques — cela ajoute du temps mais permet à l'intégration de couvrir le contenu visuel.
3.2 Échantillonner les fragments pour trouver des preuves
Utilisez maintenant les fragments (vérifiés) pour trouver des candidats concrets à l'entité :
// via documents_read_neo4j_cypher
MATCH (c:Chunk) RETURN c.text LIMIT 20
N'inventez pas d'entités que les documents ne soutiennent pas.
3.3 Proposer, puis écrire dans la base de données d'ontologie
Pour chaque type d'entité :
- Proposez à l'utilisateur : "Je vois Contrat, Partie et Juridiction dans vos documents. Je modéliserais cela comme : Contrat (entité), Partie (entité), Juridiction (propriété de Contrat). Le raisonnement : [une phrase]. D'accord ?"
- Après confirmation, écrivez-le dans la base de données d'ontologie via
ontology_write_neo4j_cypher. UtilisezMERGE(idempotent) en suivant le contrat dansreferences/ontology-db-schema.md. Points critiques : chaque:NodeTypea besoin d'exactement un:PropertyDefavecis_key=true. Les noms de propriétés utilisentcamelCase. Les noms de types de relations utilisentSCREAMING_SNAKE_CASE.
Moment de démonstration : lorsque l'utilisateur conteste le choix entité contre propriété, expliquez le compromis. "Si nous faisons de la juridiction une entité, nous pouvons facilement demander 'afficher tous les contrats dans cette juridiction regroupés par année'. Comme propriété, c'est toujours possible mais un peu plus lent. Pour 50 contrats, cela n'a pas d'importance ; pour 50 000, peut-être."
3.4 Valider après chaque lot
Après avoir ajouté un lot de nœuds/relations à l'ontologie, exécutez le validateur :
ontology_read_neo4j_cypher(query=<contenu de scripts/validate_ontology.cypher>)
Il renvoie une liste de problèmes. S'il y en a, corrigez-les avant de continuer. C'est votre filet de sécurité contre la dérive du schéma.
Lorsque la validation de l'ontologie réussit...
...vous pouvez passer à la Phase 4.
Phase 4 — Finaliser l'ontologie
Lorsque l'ontologie est complète, confirmez avec l'utilisateur. Résumez les types d'entités, les propriétés clés et les relations. Demandez : "Cela vous semble-t-il correct?" S'ils veulent des modifications, apportez-les et revalidez. Si tout est bon, félicitez-les et terminez ici si le chemin était "ontologie uniquement".
Pour le chemin "ontologie + documents", continuez.
Phase 5 — Générer le schéma d'extraction
Utilisez generate_schema_from_ontology() pour créer le schéma d'extraction des entités à partir de l'ontologie. Cela prépare le terrain pour l'extraction proprement dite. Vérifiez que la sortie est correcte avant de continuer.
Phase 6 — Extraire les entités
Lancez extract_entities(). Surveillez la progression avec check_extraction_status(). Une fois terminé, vérifiez les résultats : combien d'entités ont été extraites, quels types, et s'il y a des problèmes évidents (par exemple, trop d'entités inconnues).
Phase 7 — Explorer et valider le graphe
Interrogez le graphe de connaissances pour vérifier sa cohérence. Utilisez des requêtes Cypher simples via documents_read_neo4j_cypher. Par exemple :
MATCH (e:ExtractedEntity) RETURN e.type, count(*) AS nombre GROUP BY e.type ORDER BY nombre DESC
Montrez à l'utilisateur un résumé des entités trouvées. Demandez-lui si cela correspond à ses attentes.
Phase 8 — Questions et réponses
Maintenant que le graphe est prêt, l'utilisateur peut poser ses questions de compétence. Utilisez la recherche vectorielle (documents_vector_search) pour les questions sémantiques, et des requêtes Cypher pour les questions précises. Expliquez chaque réponse en termes simples, en reliant aux questions initiales de l'utilisateur.
Références
references/ontology-db-schema.mdreferences/lexical-graph-pipeline.mdreferences/ontology-design-checklist.mdscripts/validate_ontology.cypher