Exercices IA & Data Science Knowledge Graph avec NetworkX
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Knowledge Graph avec NetworkX

Un Knowledge Graph (graphe de connaissances) représente des informations sous forme de triplets : (sujet, relation, objet). Par exemple : (Python, est_un, langage), (Django, utilise, Python), (FastAPI, utilise, Python).

C'est une approche complementaire aux embeddings pour le RAG. Au lieu de chercher par similarite semantique, tu navigues dans un reseau de relations structurees.

La librairie networkx permet de créer facilement ces graphes en Python :

import networkx as nx

G = nx.DiGraph() # graphe oriente
G.add_edge("Python", "langage", relation="est_un")
G.add_edge("Django", "Python", relation="utilise")

# Tous les voisins sortants de Python
list(G.successors("Python")) # ["langage"]

# Tous les noeuds qui pointent vers Python
list(G.predecessors("Python")) # ["Django"]

# Acceder a la relation
G.edges["Django", "Python"]["relation"] # "utilise"

Écris une fonction build_knowledge_graph(triplets) qui :
- prend une liste de triplets (sujet, relation, objet) sous forme de tuples
- construit un graphe oriente avec networkx
- renvoie le graphe

Puis une fonction query_graph(graph, entity) qui :
- prend un graphe et le nom d'une entite
- renvoie un dictionnaire avec deux clés :
- "relations_sortantes" : liste de tuples (relation, cible) pour les aretes sortantes
- "relations_entrantes" : liste de tuples (source, relation) pour les aretes entrantes

Exemple :

triplets = [("Python", "est_un", "langage"), ("Django", "utilise", "Python")]
g = build_knowledge_graph(triplets)
query_graph(g, "Python")
renvoie {
"relations_sortantes": [("est_un", "langage")],
"relations_entrantes": [("Django", "utilise")]
}

Tests (1/1)

Tests
import networkx as nx
triplets = [
    ('Python', 'est_un', 'langage'),
    ('Django', 'utilise', 'Python'),
    ('FastAPI', 'utilise', 'Python'),
    ('Django', 'est_un', 'framework'),
]
g = build_knowledge_graph(triplets)
assert isinstance(g, nx.DiGraph), 'Doit renvoyer un DiGraph'
assert g.number_of_edges() == 4, f'Doit avoir 4 aretes, got {g.number_of_edges()}'
# Query Python
r = query_graph(g, 'Python')
assert ('est_un', 'langage') in r['relations_sortantes'], 'Python est_un langage doit etre sortant'
assert ('Django', 'utilise') in r['relations_entrantes'], 'Django utilise Python doit etre entrant'
assert ('FastAPI', 'utilise') in r['relations_entrantes'], 'FastAPI utilise Python doit etre entrant'
# Query entite sans relations
r2 = query_graph(g, 'langage')
assert r2['relations_sortantes'] == [], 'langage n\'a pas de relations sortantes'
assert len(r2['relations_entrantes']) == 1, 'langage a une relation entrante'
# Graphe vide
g_vide = build_knowledge_graph([])
assert g_vide.number_of_edges() == 0

Indices (3 disponibles)

solution.py