From 05cb77e2327e51a2d74f81d0f158f4deb6c3fdc5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Lamercerie?=
 <aurelien.lamercerie@tetras-libre.fr>
Date: Thu, 7 Sep 2023 11:58:20 +0200
Subject: [PATCH] New rule to deduce a relation from restriction (4)

---
 .../heuristic_deducer/relation_deducer_1.py   | 33 ++++++--
 tenet/transduction/naming_computer.py         |  1 +
 .../test_data/deducer-devGraph-1.result.ttl   | 80 ++++++++++---------
 3 files changed, 67 insertions(+), 47 deletions(-)

diff --git a/tenet/scheme/amr_master_rule/transduction/heuristic_deducer/relation_deducer_1.py b/tenet/scheme/amr_master_rule/transduction/heuristic_deducer/relation_deducer_1.py
index 9462113e..daf79119 100644
--- a/tenet/scheme/amr_master_rule/transduction/heuristic_deducer/relation_deducer_1.py
+++ b/tenet/scheme/amr_master_rule/transduction/heuristic_deducer/relation_deducer_1.py
@@ -47,20 +47,26 @@ def __search_structure(graph):
     return result_set
 
 
-def __search_individual_from_class(graph, class_net):
+def __search_individual_from_class(graph, class_net_uri):
     select_data_list = ['?individual_net']
     clause_list = [
         '?individual_net a net:Individual_Net.',
-        f'?individual_net net:hasMotherClassNet <{class_net}>.' 
+        f'?individual_net net:hasMotherClassNet <{class_net_uri}>.' 
     ]
     query_code = generate_select_query(graph, select_data_list, clause_list)
     result_set = graph.query(query_code) 
     return result_set
 
 
-def __search_subclass_of_class(graph, class_net):
-    # To be defined
-    pass
+def __search_subclass_of_class_net(graph, class_net_uri):
+    select_data_list = ['?subclass_net']
+    clause_list = [
+        f'?subclass_net net:hasMotherClassNet* <{class_net_uri}>.'
+    ]
+    query_code = generate_select_query(graph, select_data_list, clause_list)
+    result_set = graph.query(query_code)
+    return result_set
+
 
 #==============================================================================
 # Useful Computation Method(s)
@@ -101,16 +107,27 @@ def __construct_individual_net(graph, mother_class_net):
     # -- Net Composition
     individual_net = net.IndividualNet(graph)
     
+    # -- Main mother class
+    main_mother_class_net = mother_class_net
+    if mother_class_net.mother_class_net:
+        main_mother_class_net = net.ClassNet(graph, uri=mother_class_net.mother_class_net[0])
+    
     # -- Data Computation
     individual_net.base_node = mother_class_net.base_node
     individual_net.node = mother_class_net.node
-    individual_net.individual_label = __define_individual_label(mother_class_net)
-    individual_net.mother_class_net = mother_class_net.uri
+    individual_net.individual_label = __define_individual_label(main_mother_class_net)
     structure_ref = __get_structure(graph)
     individual_net.structure = structure_ref
+    
+    # -- Mother classes
+    mother_class_net_list = [mother_class_net.uri]
+    subclass_net_set = __search_subclass_of_class_net(graph, mother_class_net.uri)
+    for row in subclass_net_set:
+        mother_class_net_list.append(row.subclass_net)
+    individual_net.mother_class_net = mother_class_net_list
 
     # -- Net Naming
-    individual_net.naming = define_individual_naming(mother_class_net, structure_ref)
+    individual_net.naming = define_individual_naming(main_mother_class_net, structure_ref)
     
     # -- Relation Propagation
     # __propagate_relation(graph, individual_net, base_leaf) 
diff --git a/tenet/transduction/naming_computer.py b/tenet/transduction/naming_computer.py
index a099efeb..08d501e7 100644
--- a/tenet/transduction/naming_computer.py
+++ b/tenet/transduction/naming_computer.py
@@ -9,6 +9,7 @@
 #==============================================================================
 
 from rdflib import URIRef
+from transduction import net
 
 
 #==============================================================================
diff --git a/tests/dev_owl_rule_tests/test_data/deducer-devGraph-1.result.ttl b/tests/dev_owl_rule_tests/test_data/deducer-devGraph-1.result.ttl
index 64d3316c..b901bf30 100644
--- a/tests/dev_owl_rule_tests/test_data/deducer-devGraph-1.result.ttl
+++ b/tests/dev_owl_rule_tests/test_data/deducer-devGraph-1.result.ttl
@@ -471,37 +471,6 @@ net:axiom_disjointProperty_not-direct_direct_d2 a net:Axiom_Net ;
         net:compositeProperty_not-direct_d2 ;
     net:hasStructure "SSC-01-01" .
 
-net:compositeClass_object-orbit-hasManner-direct-sun_o a net:Composite_Class_Net ;
-    net:composeFrom net:atomClass_object_o,
-        net:atomClass_sun_s2,
-        net:compositeProperty_orbit-hasManner-direct_o2 ;
-    net:coverBaseNode :leaf_object_o ;
-    net:coverNode :leaf_direct-02_d,
-        :leaf_direct-02_d2,
-        :leaf_hasManner_m9,
-        :leaf_object_o,
-        :leaf_orbit-01_o2,
-        :leaf_sun_s2 ;
-    net:hasMotherClassNet net:atomClass_object_o ;
-    net:hasNaming "object-orbit-hasManner-direct-sun" ;
-    net:hasRestriction net:restriction_orbit-hasManner-direct-sun_o2 ;
-    net:hasStructure "SSC-01-01" .
-
-net:compositeClass_object-orbit-hasManner-not-direct-sun_o a net:Composite_Class_Net ;
-    net:composeFrom net:atomClass_object_o,
-        net:atomClass_sun_s2,
-        net:compositeProperty_orbit-hasManner-not-direct_o2 ;
-    net:coverBaseNode :leaf_object_o ;
-    net:coverNode :leaf_direct-02_d2,
-        :leaf_hasManner_m9,
-        :leaf_object_o,
-        :leaf_orbit-01_o2,
-        :leaf_sun_s2 ;
-    net:hasMotherClassNet net:atomClass_object_o ;
-    net:hasNaming "object-orbit-hasManner-not-direct-sun" ;
-    net:hasRestriction net:restriction_orbit-hasManner-not-direct-sun_o2 ;
-    net:hasStructure "SSC-01-01" .
-
 net:entityClass a owl:AnnotationProperty ;
     rdfs:label "entity class" ;
     rdfs:subPropertyOf net:objectValue .
@@ -653,20 +622,20 @@ net:relation_SolarSystem-hasPart-sun-SSC-01-01_p a net:Relation_Net ;
     net:hasStructure "SSC-01-01" ;
     net:hasSubjectNet net:individual_SolarSystem_p .
 
-net:relation_gravitation-bind-system-SSC-01-01-bind-SolarSystem_g a net:Relation_Net ;
+net:relation_gravitation-SSC-01-01-bind-SolarSystem_g a net:Relation_Net ;
     net:composeFrom net:atomProperty_bind_b,
         net:individual_SolarSystem_p,
-        net:individual_gravitation-bind-system-SSC-01-01_g ;
+        net:individual_gravitation-SSC-01-01_g ;
     net:coverBaseNode :leaf_gravitation_g ;
     net:coverNode :leaf_bind-01_b,
         :leaf_gravitation_g,
         :leaf_system_p,
         :leaf_system_s ;
-    net:hasNaming "gravitation-bind-system-SSC-01-01-bind-SolarSystem" ;
+    net:hasNaming "gravitation-SSC-01-01-bind-SolarSystem" ;
     net:hasObjectNet net:individual_SolarSystem_p ;
     net:hasPredicateNet net:atomProperty_bind_b ;
     net:hasStructure "SSC-01-01" ;
-    net:hasSubjectNet net:individual_gravitation-bind-system-SSC-01-01_g .
+    net:hasSubjectNet net:individual_gravitation-SSC-01-01_g .
 
 net:type a owl:AnnotationProperty ;
     rdfs:label "type "@fr ;
@@ -857,6 +826,37 @@ net:compositeClass_gravitation-bind-system_g a net:Composite_Class_Net ;
     net:hasRestriction net:restriction_bind-system_b ;
     net:hasStructure "SSC-01-01" .
 
+net:compositeClass_object-orbit-hasManner-direct-sun_o a net:Composite_Class_Net ;
+    net:composeFrom net:atomClass_object_o,
+        net:atomClass_sun_s2,
+        net:compositeProperty_orbit-hasManner-direct_o2 ;
+    net:coverBaseNode :leaf_object_o ;
+    net:coverNode :leaf_direct-02_d,
+        :leaf_direct-02_d2,
+        :leaf_hasManner_m9,
+        :leaf_object_o,
+        :leaf_orbit-01_o2,
+        :leaf_sun_s2 ;
+    net:hasMotherClassNet net:atomClass_object_o ;
+    net:hasNaming "object-orbit-hasManner-direct-sun" ;
+    net:hasRestriction net:restriction_orbit-hasManner-direct-sun_o2 ;
+    net:hasStructure "SSC-01-01" .
+
+net:compositeClass_object-orbit-hasManner-not-direct-sun_o a net:Composite_Class_Net ;
+    net:composeFrom net:atomClass_object_o,
+        net:atomClass_sun_s2,
+        net:compositeProperty_orbit-hasManner-not-direct_o2 ;
+    net:coverBaseNode :leaf_object_o ;
+    net:coverNode :leaf_direct-02_d2,
+        :leaf_hasManner_m9,
+        :leaf_object_o,
+        :leaf_orbit-01_o2,
+        :leaf_sun_s2 ;
+    net:hasMotherClassNet net:atomClass_object_o ;
+    net:hasNaming "object-orbit-hasManner-not-direct-sun" ;
+    net:hasRestriction net:restriction_orbit-hasManner-not-direct-sun_o2 ;
+    net:hasStructure "SSC-01-01" .
+
 net:compositeClass_system-hasPart-object_s a net:Class_Net,
         net:Composite_Class_Net ;
     :role_domain net:atomClass_system_p,
@@ -1129,21 +1129,23 @@ net:Property_Net a owl:Class ;
 net:Value_Net a owl:Class ;
     rdfs:subClassOf net:Net .
 
-net:individual_gravitation-bind-system-SSC-01-01_g a net:Individual_Net ;
+net:individual_gravitation-SSC-01-01_g a net:Individual_Net ;
     net:coverBaseNode :leaf_gravitation_g ;
     net:coverNode :leaf_bind-01_b,
         :leaf_gravitation_g,
         :leaf_system_s ;
-    net:hasIndividualLabel "any gravitation-bind-system" ;
+    net:hasIndividualLabel "any gravitation" ;
     net:hasMotherClassNet net:compositeClass_gravitation-bind-system_g ;
-    net:hasNaming "gravitation-bind-system-SSC-01-01" ;
+    net:hasNaming "gravitation-SSC-01-01" ;
     net:hasStructure "SSC-01-01" .
 
 net:individual_object-SSC-01-01_o a net:Individual_Net ;
     net:coverBaseNode :leaf_object_o ;
     net:coverNode :leaf_object_o ;
     net:hasIndividualLabel "any object" ;
-    net:hasMotherClassNet net:atomClass_object_o ;
+    net:hasMotherClassNet net:atomClass_object_o,
+        net:compositeClass_object-orbit-hasManner-direct-sun_o,
+        net:compositeClass_object-orbit-hasManner-not-direct-sun_o ;
     net:hasNaming "object-SSC-01-01" ;
     net:hasStructure "SSC-01-01" .
 
-- 
GitLab