From 74287ed82f135311fc77d4ecdeebc7b6c5332ec1 Mon Sep 17 00:00:00 2001 From: eliott <eliott.sammier@tetras-libre.fr> Date: Tue, 25 Jun 2024 16:17:23 +0200 Subject: [PATCH] Add inference for transitive rdfs:subClassOf --- .../macao_12/result/macao_full.ttl | 78 +++++++++++++------ .../macao_12/script/src/transform.py | 40 ++++++++++ 2 files changed, 95 insertions(+), 23 deletions(-) diff --git a/tetras_extraction/macao_12/result/macao_full.ttl b/tetras_extraction/macao_12/result/macao_full.ttl index 01f11646..547d75f0 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 288cb935..9bfc7790 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) -- GitLab