diff --git a/tetras_extraction/macao_12/result/macao_full.ttl b/tetras_extraction/macao_12/result/macao_full.ttl
index 01f11646066e507d17b00f21921dd0dfdd806e98..547d75f012d743aa7b02e3850b92d02f8cda5ab2 100644
--- a/tetras_extraction/macao_12/result/macao_full.ttl
+++ b/tetras_extraction/macao_12/result/macao_full.ttl
@@ -9,10 +9,13 @@
     owl:imports <http://www.semanticweb.org/eliott/ontologies/2024/4/macao> .
 
 :Image a owl:Class ;
-    rdfs:subClassOf :MacaoRessource .
+    rdfs:subClassOf :MacaoObject,
+        :MacaoRessource .
 
 :SimpleFlash a owl:Class ;
-    rdfs:subClassOf :FlashObject .
+    rdfs:subClassOf :FlashObject,
+        :MacaoObject,
+        :MacaoRessource .
 
 :aReponse a owl:ObjectProperty ;
     rdfs:range :Reponse .
@@ -86,7 +89,8 @@
     owl:versionInfo 1.1 .
 
 :FlashObject a owl:Class ;
-    rdfs:subClassOf :MacaoRessource .
+    rdfs:subClassOf :MacaoObject,
+        :MacaoRessource .
 
 :MosMod951 a :Module,
         owl:NamedIndividual ;
@@ -5769,8 +5773,6 @@
     :titre "Choisir une transcription (5)" ;
     rdfs:subClassOf :MosEtp644 .
 
-:MacaoObject a owl:Class .
-
 :MacaoRoot a owl:Class .
 
 :MosMod34 a :Module,
@@ -5868,9 +5870,6 @@
     :titre "Spécificité des voyelles (2)" ;
     rdfs:subClassOf :MosEtp171 .
 
-:MacaoRessource a owl:Class ;
-    rdfs:subClassOf :MacaoObject .
-
 :pg313 a :ExerciceQC,
         :ExerciceQC_QCU,
         :Page,
@@ -5999,13 +5998,13 @@
     :titre "Lire des transcriptions phonétiques (3)" ;
     rdfs:subClassOf :MosEtp746 .
 
-:Exercice a owl:Class ;
-    rdfs:subClassOf :Page .
-
 :ExerciceGD a owl:Class ;
-    rdfs:subClassOf :Exercice .
+    rdfs:subClassOf :Exercice,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
-:MacaoContenu a owl:Class ;
+:MacaoRessource a owl:Class ;
     rdfs:subClassOf :MacaoObject .
 
 :MosEtp558 a :SousPartie,
@@ -6035,6 +6034,11 @@
     :titre "> Reconnaître les marques de l'accentuation" ;
     rdfs:subClassOf :MosMod60 .
 
+:Exercice a owl:Class ;
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject,
+        :Page .
+
 :MosEtp555 a :SousPartie,
         owl:NamedIndividual ;
     rdfs:label "Quelques définitions" ;
@@ -6051,10 +6055,17 @@
     rdfs:subClassOf :MosMod39 .
 
 :ExerciceQC_QCM a owl:Class ;
-    rdfs:subClassOf :ExerciceQC .
+    rdfs:subClassOf :Exercice,
+        :ExerciceQC,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
 :ExerciceQM a owl:Class ;
-    rdfs:subClassOf :Exercice .
+    rdfs:subClassOf :Exercice,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
 :MosMod39 a :Module,
         owl:NamedIndividual ;
@@ -6450,7 +6461,8 @@
     rdfs:subClassOf :MosEtp746 .
 
 :Module a owl:Class ;
-    rdfs:subClassOf :MacaoContenu .
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject .
 
 :MosEtp335 a :SousPartie,
         owl:NamedIndividual ;
@@ -6472,7 +6484,13 @@
     rdfs:subClassOf :MosMod34 .
 
 :ExerciceTAT a owl:Class ;
-    rdfs:subClassOf :Exercice .
+    rdfs:subClassOf :Exercice,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
+
+:MacaoContenu a owl:Class ;
+    rdfs:subClassOf :MacaoObject .
 
 :MosEtp129 a :SousPartie,
         owl:NamedIndividual ;
@@ -6646,6 +6664,8 @@
     :titre "> Utiliser les marques de l'accentuation" ;
     rdfs:subClassOf :MosMod60 .
 
+:MacaoObject a owl:Class .
+
 :MosEtp210 a :SousPartie,
         owl:NamedIndividual ;
     rdfs:label "> Reconnaître les auxiliaires" ;
@@ -6673,7 +6693,8 @@
     rdfs:subClassOf :MosMod34 .
 
 :SousPartie a owl:Class ;
-    rdfs:subClassOf :MacaoContenu .
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject .
 
 :MosEtp171 a :SousPartie,
         owl:NamedIndividual ;
@@ -6738,19 +6759,30 @@
     rdfs:subClassOf :MosMod341 .
 
 :ExerciceQC_QCU a owl:Class ;
-    rdfs:subClassOf :ExerciceQC .
+    rdfs:subClassOf :Exercice,
+        :ExerciceQC,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
 :ExerciceQC a owl:Class ;
-    rdfs:subClassOf :Exercice .
+    rdfs:subClassOf :Exercice,
+        :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
 :Cours a owl:Class ;
-    rdfs:subClassOf :Page .
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject,
+        :Page .
 
 :Page a owl:Class ;
-    rdfs:subClassOf :MacaoContenu .
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject .
 
 :Reponse a owl:Class ;
-    rdfs:subClassOf :MacaoContenu .
+    rdfs:subClassOf :MacaoContenu,
+        :MacaoObject .
 
 [] a owl:AllDisjointClasses ;
     owl:members ( :ExerciceGD :ExerciceQC :ExerciceQM :ExerciceTAT ) .
diff --git a/tetras_extraction/macao_12/script/src/transform.py b/tetras_extraction/macao_12/script/src/transform.py
index 288cb9358c7a606c73c2476f302fbd323a53268f..9bfc779028747cb03868524785d281e6945ce4d1 100644
--- a/tetras_extraction/macao_12/script/src/transform.py
+++ b/tetras_extraction/macao_12/script/src/transform.py
@@ -7,11 +7,23 @@ def construct(g: Graph, query: str):
     """Performs a SPARQL `CONSTRUCT` query and add the resulting triples
     to the graph, in-place.
     """
+
     res = g.query(query)
     if res.graph is not None:
         g += res.graph
 
 
+def construct_while(g: Graph, query: str):
+    """Repeat a CONSTRUCT query, adding triples to the graph, until the query
+    stops generating new triples"""
+    while True:
+        res = g.query(query)
+        if res.graph is not None and len(res.graph - g) > 0:
+            g += res.graph
+        else:
+            break
+
+
 def main():
     # Load graph
     graph = Graph()
@@ -33,4 +45,32 @@ def main():
         }""",
     )
 
+    # Apply property 'subClassOf' transitively, except on the "fake" class
+    # hierarchy based on MacaoRoot
+    q_transitive_subclass = """
+        CONSTRUCT {
+            ?a rdfs:subClassOf ?c
+        } WHERE {
+            ?a rdfs:subClassOf ?b .
+            ?b rdfs:subClassOf ?c .
+            ?b rdfs:subClassOf :MacaoObject
+            FILTER(?a != owl:Nothing && ?c != owl:Thing)
+        }
+    """
+    construct_while(graph, q_transitive_subclass)
+
+    # construct(
+    #     graph,
+    #     """
+    #     CONSTRUCT {
+
+    #     } WHERE {
+    #         ?subj a ?child_type .
+
+    #         ?child_type rdfs:subClassOf ?parent_type
+    #     }
+    #     """,
+    # )
+
+    # Save the full graph
     graph.serialize(RDF_FULL_FILE, "turtle", base=NS)