From 002d116f8ddf0b34c831807fab14f2fee901a3d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Lamercerie?=
 <aurelien.lamercerie@laposte.net>
Date: Tue, 28 Sep 2021 20:09:19 +0200
Subject: [PATCH] Generic CTS to generate atom classes and instances

---
 .gitignore                      |   1 +
 config/transduction-schemes.ttl | 442 ++++++++++++--------------------
 frame/system-ontology.ttl       |  16 +-
 prepare_work_data.py            |  45 ++--
 4 files changed, 202 insertions(+), 302 deletions(-)

diff --git a/.gitignore b/.gitignore
index deab3047..e0eaa071 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ corpus/ERTMS*
 .project
 *.ttl.tbc
 output*.ttl
+output/*
diff --git a/config/transduction-schemes.ttl b/config/transduction-schemes.ttl
index 6f80a614..534b6826 100644
--- a/config/transduction-schemes.ttl
+++ b/config/transduction-schemes.ttl
@@ -30,50 +30,6 @@ cts:abstraction_extraction
   rdfs:label "abstraction extension" ;
   rdfs:subClassOf cts:net_extension ;
 .
-cts:add-abstraction
-  rdf:type sh:SPARQLRule ;
-  rdfs:label "add-abstraction" ;
-  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
-PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
-PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
-PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
-PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
-PREFIX sys-agent: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/agent#>
-PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
-
-# -- Add Entity class / instance in System Ontology
-CONSTRUCT { 
-   # Classification
-   ?subAbstractionUri rdfs:subClassOf ?abstractionUri.
-   ?subAbstractionUri rdfs:label ?abstractionConcept.
-   ?subAbstractionUri sys:from_structure ?req.
-   # Instantiation: no instance for abstraction
-}
-WHERE {
-   # net1: feature
-   ?net1 a net:Instance.
-   ?net1 net:type net:atom.
-   ?net1 net:atomOf sys:Abstraction.
-   ?net1 net:has_structure ?req.
-   ?net1 net:has_atom ?atomObject1.
-   ?atomObject1 net:has_parent_class ?abstractionClass.
-   ?atomObject1 net:has_concept ?abstractionConcept.	
-   # Filter: entity not present in a class list
-   FILTER NOT EXISTS  { ?net2 net:class2 ?abstractionConcept}
-   # URI: class
-   cprm:Config_Parameters cprm:baseURI ?baseURI.
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   BIND (concat( ?frameURI, ?abstractionClass) AS ?s1).
-   BIND (concat(?s1, '#', ?abstractionConcept) AS ?s2).
-   BIND (uri( ?s1) AS ?abstractionUri).
-   BIND (uri(?s2) AS ?subAbstractionUri).
-}""" ;
-  sh:order 3.1 ;
-.
 cts:add-conjunctive-entity-classes
   rdf:type sh:SPARQLRule ;
   rdfs:label "add-conjunctive-entity-classes" ;
@@ -117,8 +73,6 @@ WHERE {
    ?subEntityObject3 net:has_instance ?mainInstance.	
    # extension: disjunction of UW
    ?uw2 unl:and ?uw3.
-  # --old --- FILTER NOT EXISTS  { ?net2 net:has_subClass ?mainEntity }.
-  # --old --- FILTER NOT EXISTS  { ?subEntity23Uri owl:equivalentClass ?c }.
    # Label(s) / URI (for classes)
    ?uw2 rdfs:label ?uw2Label.
    ?uw3 rdfs:label ?uw3Label.
@@ -127,7 +81,7 @@ WHERE {
    BIND (concat(?concept2, '-or-', ?concept3) AS ?concept23)
    BIND (concat(?concept23, '_', ?mainEntity) AS ?subEntity23).
    # URI (for classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?entityClass) AS ?s1).
    BIND (concat(?s1, '#', ?mainEntity) AS ?s2).
    BIND (concat(?s1, '#', ?subEntity2) AS ?s3).
@@ -186,8 +140,6 @@ WHERE {
    ?subEntityObject3 net:has_instance ?mainInstance.	
    # extension: disjunction of UW
    ?uw2 unl:or ?uw3.
-  # --old --- FILTER NOT EXISTS  { ?net2 net:has_subClass ?mainEntity }.
-  # --old --- FILTER NOT EXISTS  { ?subEntity23Uri owl:equivalentClass ?c }.
    # Label(s) / URI (for classes)
    ?uw2 rdfs:label ?uw2Label.
    ?uw3 rdfs:label ?uw3Label.
@@ -196,7 +148,7 @@ WHERE {
    BIND (concat(?concept2, '-or-', ?concept3) AS ?concept23)
    BIND (concat(?concept23, '_', ?mainEntity) AS ?subEntity23).
    # URI (for classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?entityClass) AS ?s1).
    BIND (concat(?s1, '#', ?mainEntity) AS ?s2).
    BIND (concat(?s1, '#', ?subEntity2) AS ?s3).
@@ -212,57 +164,6 @@ WHERE {
 }""" ;
   sh:order 3.4 ;
 .
-cts:add-entity
-  rdf:type sh:SPARQLRule ;
-  rdfs:label "add-entity" ;
-  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
-PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
-PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
-PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
-PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
-PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
-
-# -- Add Entity class / instance in System Ontology
-CONSTRUCT { 
-   # Classification
-   ?mainEntityUri rdfs:subClassOf ?entityUri.
-   ?mainEntityUri rdfs:label ?entityConcept.
-   ?mainEntityUri sys:from_structure ?req.
-   # Instantiation
-   ?mainInstanceUri a ?mainEntityUri.
-   ?mainInstanceUri rdfs:label ?mainInstance.
-   ?mainInstanceUri sys:from_structure ?req.
-}
-WHERE {
-   # net1: entity
-   ?net1 a net:Instance.
-   ?net1 net:type net:atom.
-   ?net1 net:atomOf sys:Entity.
-   ?net1 net:has_structure ?req.
-   ?net1 net:has_atom ?atomObject1.
-   ?atomObject1 net:has_parent_class ?entityClass.	
-   ?atomObject1 net:has_concept ?entityConcept.
-   ?atomObject1 net:has_instance ?mainInstance. 
-   # Filter: entity not present in a class list
-   FILTER NOT EXISTS  { ?net2 net:has_subClass ?entityConcept}
-   # URI (for classes)
-   cprm:Config_Parameters cprm:baseURI ?baseURI.
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   # -- old --- fprm:System_Entity rdfs:label ?entityLabel.
-   BIND (concat( ?frameURI, ?entityClass) AS ?s1).
-   BIND (concat(?s1, '#', ?entityConcept) AS ?s2).
-   BIND (uri( ?s1) AS ?entityUri).
-   BIND (uri(?s2) AS ?mainEntityUri).
-   # URI (for instance)
-   BIND (concat(?s1, '_', ?mainInstance) AS ?s3).
-   BIND (uri(?s3) AS ?mainInstanceUri).
-}""" ;
-  sh:order 3.1 ;
-.
 cts:add-event
   rdf:type sh:SPARQLRule ;
   rdfs:label "add-event" ;
@@ -319,15 +220,14 @@ WHERE {
    BIND (concat(?actorConcept, '-', ?verbConcept) AS ?e1).
    BIND (concat(?e1, '-', ?targetConcept) AS ?eventLabel).
    # URI (for classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Event fprm:class ?eventClass.
+   sys:Structure sys:has_frame_uri ?frameURI.
+   sys:Event sys:is_class ?eventClass.
    BIND (concat( ?frameURI, ?eventClass) AS ?c1).
    BIND (concat(?c1, '_', ?eventLabel) AS ?c2).
    BIND (uri( ?c1) AS ?eventClassUri).
    BIND (uri(?c2) AS ?newEventUri).
    # URI (for object property)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Event fprm:objectProperty ?eventObjectProperty.
+   sys:Event sys:has_object_property ?eventObjectProperty.
    BIND (concat( ?frameURI, ?eventObjectProperty) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o1) AS ?eventObjectPropertyUri).
@@ -335,49 +235,6 @@ WHERE {
 }""" ;
   sh:order 3.1 ;
 .
-cts:add-feature
-  rdf:type sh:SPARQLRule ;
-  rdfs:label "add-entity-classes" ;
-  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
-PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
-PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
-PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
-PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
-PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
-
-# -- Add Entity class / instance in System Ontology
-CONSTRUCT { 
-   # Classification
-   ?subFeatureUri rdfs:subClassOf ?featureUri.
-   ?subFeatureUri rdfs:label ?featureConcept.
-   ?subFeatureUri sys:from_structure ?req.
-   # Instantiation: no instance for feature
-}
-WHERE {
-   # net1: feature
-   ?net1 a net:Instance.
-   ?net1 net:type net:atom.
-   ?net1 net:atomOf sys:Feature.
-   ?net1 net:has_structure ?req.
-   ?net1 net:has_atom ?atomObject1.
-   ?atomObject1 net:has_parent_class ?featureClass.
-   ?atomObject1 net:has_concept ?featureConcept.	
-   # Filter: entity not present in a class list
-   FILTER NOT EXISTS  { ?net2 net:class2 ?featureConcept}
-   # URI: class
-   cprm:Config_Parameters cprm:baseURI ?baseURI.
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   BIND (concat( ?frameURI, ?featureClass) AS ?s1).
-   BIND (concat(?s1, '#', ?featureConcept) AS ?s2).
-   BIND (uri( ?s1) AS ?featureUri).
-   BIND (uri(?s2) AS ?subFeatureUri).
-}""" ;
-  sh:order 3.1 ;
-.
 cts:add-list-of-entity-classes
   rdf:type sh:SPARQLRule ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
@@ -416,8 +273,7 @@ WHERE {
    ?subEntityObject net:has_instance ?mainInstance.	
    # Filter -- old --- FILTER NOT EXISTS  { ?net2 net:has_subClass ?mainEntity}	
    # URI (for classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Entity rdfs:label ?entityLabel.
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?entityClass) AS ?s1).
    BIND (concat(?s1, '#', ?mainEntity) AS ?s2).
    BIND (concat(?s1, '#', ?subEntity) AS ?s3).
@@ -485,14 +341,14 @@ WHERE {
    BIND (concat(?actorConcept, '-', ?verbConcept) AS ?e1).
    BIND (concat(?e1, '-', ?targetConcept) AS ?statePropertyLabel).
    # URI (for classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_State_Property fprm:class ?statePropertyClass.
+   sys:Structure sys:has_frame_uri ?frameURI.
+   sys:State_Property sys:is_class ?statePropertyClass.
    BIND (concat( ?frameURI, ?statePropertyClass) AS ?c1).
    BIND (concat(?c1, '_', ?statePropertyLabel) AS ?c2).
    BIND (uri( ?c1) AS ?statePropertyClassUri).
    BIND (uri(?c2) AS ?newStatePropertyUri).
    # URI (for object property)
-   fprm:System_State_Property fprm:objectProperty ?statePropertyObjectProperty.
+   sys:State_Property sys:has_object_property ?statePropertyObjectProperty.
    BIND (concat( ?frameURI, ?statePropertyObjectProperty) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o1) AS ?statePropertyObjectPropertyUri).
@@ -518,72 +374,16 @@ WHERE {
 }""" ;
   sh:order 3.1 ;
 .
-cts:add-verb
-  rdf:type sh:SPARQLRule ;
-  rdfs:label "add-verb" ;
-  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
-PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
-PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
-PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
-PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
-PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
-
-# -- Add Verb class / instance in System Ontology
-CONSTRUCT { 
-   # Classification
-   ?verbUri rdfs:subClassOf ?verbClassUri.
-   ?verbUri rdfs:label ?verbConcept.
-   ?verbUri sys:from_structure ?req.
-   # Instantiation !!! TODO !!!
-   # -- old --- ?mainInstanceUri a ?mainVerbUri.
-   # -- old --- ?mainInstanceUri rdfs:label ?mainInstance.
-   # -- old --- ?mainInstanceUri sys:from_structure ?req.
-}
-WHERE {
-   # net1: entity
-   ?net1 a net:Instance.
-   ?net1 net:type net:atom.
-   ?net1 net:atomOf sys:Verb.
-   ?net1 net:has_structure ?req.
-   ?net1 net:has_atom ?verbObject1.
-   ?verbObject1 net:has_parent_class ?verbClass.	
-   ?verbObject1 net:has_concept ?verbConcept.
-   # -- old --- ?verbObject1 net:has_instance ?mainInstance. 
-   # Filter: entity not present in a class list
-   FILTER NOT EXISTS  { ?net2 net:has_subClass ?verbConcept}
-   # URI (for classes)
-   cprm:Config_Parameters cprm:baseURI ?baseURI.
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Event fprm:class ?eventURI.
-   # -- old --- fprm:System_Entity rdfs:label ?verbLabel.
-   BIND (concat( ?frameURI, ?verbClass) AS ?s1).
-   BIND (concat(?s1, '#', ?verbConcept) AS ?s2).
-   BIND (uri( ?s1) AS ?verbClassUri).
-   BIND (uri(?s2) AS ?verbUri).
-   # URI (for instance)
-   # -- old --- BIND (concat(?s1, '_', ?mainInstance) AS ?s3).
-   # -- old --- BIND (uri(?s3) AS ?mainInstanceUri).
-}""" ;
-  sh:order 3.1 ;
-.
 cts:batch_execution
   rdf:type owl:Class ;
   rdf:type sh:NodeShape ;
   rdfs:label "batch execution" ;
   rdfs:subClassOf cts:Transduction_Schemes ;
-  sh:rule cts:add-abstraction ;
   sh:rule cts:add-conjunctive-entity-classes ;
   sh:rule cts:add-disjunctive-entity-classes ;
-  sh:rule cts:add-entity ;
   sh:rule cts:add-event ;
-  sh:rule cts:add-feature ;
   sh:rule cts:add-list-of-entity-classes ;
   sh:rule cts:add-state-property ;
-  sh:rule cts:add-verb ;
   sh:rule cts:bypass-reification ;
   sh:rule cts:complement-list-of-entity-classes ;
   sh:rule cts:compose-agt-verb-obj-as-simple-event ;
@@ -591,17 +391,19 @@ cts:batch_execution
   sh:rule cts:compose-entity-modlist-1 ;
   sh:rule cts:compose-entity-modlist-2 ;
   sh:rule cts:compose-entity-modlist-3 ;
-  sh:rule cts:compute-class-uri-of-entity-net-object ;
+  sh:rule cts:compute-class-uri-of-net-object ;
   sh:rule cts:compute-domain-range-of-event-object-properties ;
   sh:rule cts:compute-domain-range-of-state-property-object-properties ;
-  sh:rule cts:compute-instance-uri-of-entity-net-object ;
+  sh:rule cts:compute-instance-uri-of-net-object ;
   sh:rule cts:create-atom-net ;
   sh:rule cts:define-uw-id ;
   sh:rule cts:extend-mod-list ;
+  sh:rule cts:generate-atom-class ;
+  sh:rule cts:generate-atom-instance ;
   sh:rule cts:init-mod-list ;
+  sh:rule cts:instantiate-atom-net ;
   sh:rule cts:instantiate-classlist-by-extension-1 ;
   sh:rule cts:instantiate-classlist-by-extension-2 ;
-  sh:rule cts:instantiate-entity-net ;
   sh:rule cts:link-to-scope-entry ;
   sh:rule cts:typify-modlist-entity ;
   sh:rule cts:typify-modlist-feature ;
@@ -667,8 +469,7 @@ WHERE {
    ?featureObject net:has_parent_class ?featureClass.
    ?featureObject net:has_concept ?featureConcept.
    # URI: entity class
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Entity rdfs:label ?entityLabel.
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?entityClass) AS ?c1).
    BIND (concat(?c1, '#', ?subEntity) AS ?c2).
    BIND (uri(?c2) AS ?subEntityUri).
@@ -1138,9 +939,9 @@ WHERE {
 }""" ;
   sh:order 2.6 ;
 .
-cts:compute-class-uri-of-entity-net-object
+cts:compute-class-uri-of-net-object
   rdf:type sh:SPARQLRule ;
-  rdfs:label "compute-class-uri-of-entity-net-object" ;
+  rdfs:label "compute-class-uri-of-net-object" ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
 PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@@ -1159,12 +960,12 @@ CONSTRUCT {
    ?object net:classUri ?objectClassUri.
 }
 WHERE {
-   # net1: entity
+   # object
    ?object a net:Object.
    ?object net:has_parent_class ?objectClass.	
    ?object net:has_concept ?objectConcept.
-   # URI (for classes and instance)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
+   # URI (for classes)
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?objectClass) AS ?s1).
    BIND (concat(?s1, '#', ?objectConcept) AS ?s2).
    BIND (uri( ?s1) AS ?parentClassUri).
@@ -1222,8 +1023,8 @@ WHERE {
 		}
    )
    # URI (for object property)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_Event fprm:objectProperty ?eventObjectProperty.
+   sys:Structure sys:has_frame_uri ?frameURI.
+   sys:Event sys:has_object_property ?eventObjectProperty.
    BIND (concat( ?frameURI, ?eventObjectProperty) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o2) AS ?newEventObjectPropertyUri).
@@ -1280,17 +1081,17 @@ WHERE {
 		}
    )
    # URI (for object property)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   fprm:System_State_Property fprm:objectProperty ?objectPropertyRef.
+   sys:Structure sys:has_frame_uri ?frameURI.
+   sys:State_Property sys:has_object_property ?objectPropertyRef.
    BIND (concat( ?frameURI, ?objectPropertyRef) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o2) AS ?objectPropertyUri).
 }""" ;
   sh:order 3.5 ;
 .
-cts:compute-instance-uri-of-entity-net-object
+cts:compute-instance-uri-of-net-object
   rdf:type sh:SPARQLRule ;
-  rdfs:label "compute-instance-uri-of-entity-net-object" ;
+  rdfs:label "compute-instance-uri-of-net-object" ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
 PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@@ -1308,12 +1109,12 @@ CONSTRUCT {
    ?object net:instanceUri ?objectInstanceUri.
 }
 WHERE {
-   # net1: entity
+   # object
    ?object a net:Object.
    ?object net:has_parent_class ?objectClass.	
    ?object net:has_instance ?objectInstance. 
    # URI (for classes and instance)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
+   sys:Structure sys:has_frame_uri ?frameURI.
    BIND (concat( ?frameURI, ?objectClass) AS ?s1).
    BIND (concat(?s1, '_', ?objectInstance) AS ?s3).
    BIND (uri(?s3) AS ?objectInstanceUri).
@@ -1428,9 +1229,9 @@ cts:entity_extraction
   sh:rule cts:create-atom-net ;
   sh:rule cts:extend-mod-list ;
   sh:rule cts:init-mod-list ;
+  sh:rule cts:instantiate-atom-net ;
   sh:rule cts:instantiate-classlist-by-extension-1 ;
   sh:rule cts:instantiate-classlist-by-extension-2 ;
-  sh:rule cts:instantiate-entity-net ;
   sh:rule cts:typify-modlist-entity ;
   sh:rule cts:typify-modlist-feature ;
 .
@@ -1485,25 +1286,108 @@ cts:feature_extraction
   rdfs:label "feature extraction" ;
   rdfs:subClassOf cts:net_extension ;
 .
+cts:generate-atom-class
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "add-entity-classes" ;
+  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
+PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
+PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
+PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
+PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
+PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
+PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
+PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
+
+# -- Generate atom class in System Ontology
+CONSTRUCT { 
+   # Classification
+   ?newClassUri rdfs:subClassOf ?parentUri.
+   ?newClassUri rdfs:label ?atomConcept.
+   ?newClassUri sys:from_structure ?req.
+}
+WHERE {
+   # net1: atom
+   ?net1 a net:Instance.
+   ?net1 net:type net:atom.
+   ?net1 net:has_structure ?req.
+   ?net1 net:has_atom ?atomObject1.
+   ?atomObject1 net:has_parent_class ?atomParentClass.
+   ?atomObject1 net:has_concept ?atomConcept.	
+   # Filter: entity not present in a class list
+   FILTER NOT EXISTS  { ?net2 net:class2 ?atomConcept}
+   # URI: class
+   sys:Structure sys:has_frame_uri ?frameURI.
+   BIND (concat( ?frameURI, ?atomParentClass) AS ?s1).
+   BIND (concat(?s1, '#', ?atomConcept) AS ?s2).
+   BIND (uri( ?s1) AS ?parentUri).
+   BIND (uri(?s2) AS ?newClassUri).
+}""" ;
+  sh:order 3.1 ;
+.
+cts:generate-atom-instance
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "add-entity" ;
+  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
+PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
+PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
+PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
+PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
+PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
+PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
+PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
+
+# -- Generate atom instance in System Ontology
+CONSTRUCT { 
+   # Instantiation
+   ?newInstanceUri a ?classUri.
+   ?newInstanceUri rdfs:label ?atomInstance.
+   ?newInstanceUri sys:from_structure ?req.
+}
+WHERE {
+   # net1: entity
+   ?net1 a net:Instance.
+   ?net1 net:type net:atom.
+   ?net1 net:atomOf sys:Entity.
+   ?net1 net:has_structure ?req.
+   ?net1 net:has_atom ?atomObject1.
+   ?atomObject1 net:has_parent_class ?atomParentClass.	
+   ?atomObject1 net:has_concept ?atomConcept.
+   ?atomObject1 net:has_instance ?atomInstance. 
+   # Filter: entity not present in a class list
+   FILTER NOT EXISTS  { ?net2 net:has_subClass ?atomConcept}
+   # URI (for classes)
+   sys:Structure sys:has_frame_uri ?frameURI.
+   BIND (concat( ?frameURI, ?atomParentClass) AS ?s1).
+   BIND (concat(?s1, '#', ?atomConcept) AS ?s2).
+   BIND (uri( ?s1) AS ?parentUri).
+   BIND (uri(?s2) AS ?classUri).
+   # URI (for instance)
+   BIND (concat(?s1, '_', ?atomInstance) AS ?s3).
+   BIND (uri(?s3) AS ?newInstanceUri).
+}""" ;
+  sh:order 3.1 ;
+.
 cts:generation
   rdf:type owl:Class ;
   rdf:type sh:NodeShape ;
   rdfs:label "generation" ;
   rdfs:subClassOf cts:Transduction_Schemes ;
-  sh:rule cts:add-abstraction ;
   sh:rule cts:add-conjunctive-entity-classes ;
   sh:rule cts:add-disjunctive-entity-classes ;
-  sh:rule cts:add-entity ;
   sh:rule cts:add-event ;
-  sh:rule cts:add-feature ;
   sh:rule cts:add-list-of-entity-classes ;
   sh:rule cts:add-state-property ;
-  sh:rule cts:add-verb ;
   sh:rule cts:complement-list-of-entity-classes ;
-  sh:rule cts:compute-class-uri-of-entity-net-object ;
+  sh:rule cts:compute-class-uri-of-net-object ;
   sh:rule cts:compute-domain-range-of-event-object-properties ;
   sh:rule cts:compute-domain-range-of-state-property-object-properties ;
-  sh:rule cts:compute-instance-uri-of-entity-net-object ;
+  sh:rule cts:compute-instance-uri-of-net-object ;
+  sh:rule cts:generate-atom-class ;
+  sh:rule cts:generate-atom-instance ;
 .
 cts:init-mod-list
   rdf:type sh:SPARQLRule ;
@@ -1548,6 +1432,43 @@ WHERE {
 }""" ;
   sh:order 2.3 ;
 .
+cts:instantiate-atom-net
+  rdf:type sh:SPARQLRule ;
+  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
+PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
+PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
+PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
+PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
+PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
+PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
+PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
+    
+# -- Instantiate atom net
+CONSTRUCT { 
+   # Object: entity 
+   ?atomObject1 net:has_instance ?instanceName. 
+}
+WHERE {
+   # net1: atom
+   ?net1 a net:Instance.
+   ?net1 net:type net:atom.
+   # -- old --- ?net1 net:atomOf sys:Entity.
+   ?net1 net:has_structure ?req.
+   ?net1 net:has_node ?uw1.
+   ?net1 net:has_atom ?atomObject1. 
+   # condition: agt/obj(uw0, uw1)
+   ?uw0 (unl:agt | unl:obj | unl:aoj) ?uw1.
+   # UW: type UW-Occurrence and substructure of req sentence
+   ?uw0 rdf:type unl:UW_Occurrence.
+   ?uw0 unl:is_substructure_of ?req.
+   # Label: id, name
+   ?uw1 unl:has_id ?uw1Id.
+   BIND (?uw1Id AS ?instanceName).
+}""" ;
+  sh:order 2.2 ;
+.
 cts:instantiate-classlist-by-extension-1
   rdf:type sh:SPARQLRule ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
@@ -1625,46 +1546,6 @@ WHERE {
 }""" ;
   sh:order 2.8 ;
 .
-cts:instantiate-entity-net
-  rdf:type sh:SPARQLRule ;
-  sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-PREFIX unl: <https://unl.tetras-libre.fr/rdf/schema#>
-PREFIX net: <https://unsel.tetras-libre.fr/tenet/semantic-net#>
-PREFIX cprm: <https://unsel.tetras-libre.fr/tenet/config/parameters#>
-PREFIX req: <https://unsel.tetras-libre.fr/tenet/frame/requirement-ontology#>
-PREFIX sys: <https://unsel.tetras-libre.fr/tenet/frame/system-ontology/>
-PREFIX fprm: <https://unsel.tetras-libre.fr/tenet/frame/parameters#>
-    
-# -- Create Entity net
-CONSTRUCT { 
-   # Object: entity 
-   ?atomObject1 net:has_instance ?instanceName. 
-}
-WHERE {
-   # net1: entity (with entity object)
-   ?net1 a net:Instance.
-   ?net1 net:type net:atom.
-   ?net1 net:atomOf sys:Entity.
-   ?net1 net:has_structure ?req.
-   ?net1 net:has_node ?uw1.
-   ?net1 net:has_atom ?atomObject1. 
-   # condition: agt/obj(uw0, uw1)
-   ?uw0 (unl:agt | unl:obj | unl:aoj) ?uw1.
-   # UW: type UW-Occurrence and substructure of req sentence
-   ?uw0 rdf:type unl:UW_Occurrence.
-   ?uw0 unl:is_substructure_of ?req.
-   # -- old ---- ?uw1 rdf:type unl:UW_Occurrence.
-   # -- old ---- ?uw1 unl:is_substructure_of ?req.
-   # -- old ---- ?uw1 unl:is_occurrence_of ?lexTrg.
-   # Label: id, name
-   ?uw1 unl:has_id ?uw1Id.
-   BIND (?uw1Id AS ?instanceName).
-}""" ;
-  sh:order 2.2 ;
-.
 cts:link-to-scope-entry
   rdf:type sh:SPARQLRule ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
@@ -1742,9 +1623,9 @@ CONSTRUCT {
 }
 WHERE {
    # Entity (from System Ontology)
-   ?entity rdf:type fprm:System_Entity.
-   ?entity fprm:class ?entityClass.
-   ?entity fprm:restriction ?entityRestriction.
+   ?targetClass rdfs:subClassOf* sys:Entity.
+   ?targetClass sys:is_class ?entityClass.
+   ?targetClass sys:has_restriction ?entityRestriction.
    # net: modList
    ?semNet a net:Instance.
    ?semNet net:type net:mod_list.
@@ -1780,9 +1661,9 @@ CONSTRUCT {
 }
 WHERE {
    # Entity Feature (from System Ontology)
-   ?entity rdf:type fprm:System_Feature.
-   ?entity fprm:class ?featureClass.
-   ?entity fprm:restriction ?featureRestriction.
+   ?targetClass rdfs:subClassOf* sys:Feature.
+   ?targetClass sys:is_class ?featureClass.
+   ?targetClass sys:has_restriction ?featureRestriction.
    # net: modList
    ?semNet a net:Instance.
    ?semNet net:type net:mod_list.
@@ -1802,5 +1683,4 @@ cts:verb_extraction
   rdf:type sh:NodeShape ;
   rdfs:label "verb extraction" ;
   rdfs:subClassOf cts:net_extension ;
-  sh:rule cts:add-verb ;
 .
diff --git a/frame/system-ontology.ttl b/frame/system-ontology.ttl
index 730140b0..4b87f86b 100644
--- a/frame/system-ontology.ttl
+++ b/frame/system-ontology.ttl
@@ -30,13 +30,15 @@ sys:Entity
   rdfs:label "entity"@en ;
   rdfs:label "entité"@fr ;
   rdfs:subClassOf sys:Structure ;
-  sys:is_class "sys:Entity" ;
+  sys:is_class "Entity" ;
 .
 sys:Event
   rdf:type owl:Class ;
   rdfs:label "Event"@en ;
   rdfs:label "Evénèment"@fr ;
   rdfs:subClassOf sys:Structure ;
+  sys:has_object_property "eventObjectProperty" ;
+  sys:is_class "Event" ;
 .
 sys:Feature
   rdf:type owl:Class ;
@@ -50,10 +52,13 @@ sys:State_Property
   rdfs:label "Propriété d'état"@fr ;
   rdfs:label "State Property"@en ;
   rdfs:subClassOf sys:Structure ;
+  sys:has_object_property "statePropertyObjectProperty" ;
+  sys:is_class "State_Property" ;
 .
 sys:Structure
   rdf:type owl:Class ;
   rdfs:label "System Ontology Structure" ;
+  sys:has_frame_uri "https://unsel.tetras-libre.fr/tenet/frame/system-ontology/" ;
 .
 sys:Verb
   rdf:type owl:Class ;
@@ -150,6 +155,11 @@ sys:has_frame_base_uri
   rdfs:subPropertyOf sys:seedProperty ;
   sys:has_frame_base_uri "https://unsel.tetras-libre.fr/tenet/frame/system-ontology/" ;
 .
+sys:has_frame_uri
+  rdf:type rdf:Property ;
+  rdfs:label "has frame uri" ;
+  rdfs:subPropertyOf sys:structureProperty ;
+.
 sys:has_mother_class
   rdf:type rdf:Property ;
   rdfs:label "has mother class" ;
@@ -223,6 +233,10 @@ sys:statePropertyObjectProperty
   rdfs:label "state property object property" ;
   rdfs:subPropertyOf sys:objectProperty ;
 .
+sys:structureProperty
+  rdf:type rdf:Property ;
+  rdfs:label "structure property" ;
+.
 sys:verbClassProperty
   rdf:type rdf:Property ;
   rdfs:label "verb property" ;
diff --git a/prepare_work_data.py b/prepare_work_data.py
index 0a3af744..e2a18651 100644
--- a/prepare_work_data.py
+++ b/prepare_work_data.py
@@ -24,16 +24,19 @@ CONFIG_DIR = "config/"
 FRAME_DIR = "frame/"
 CORPUS_DIR = "corpus/"
 CTS_DIR = "cts/"
+OUTPUT_DIR = "output/"
 
 # Config Definition
+TURTLE_SUFFIX = ".ttl"
+ONTO_FILE = "-ontology" + TURTLE_SUFFIX
 dash_file = "dash-data-shapes.ttl" # data from "http://datashapes.org/dash.ttl"
 schema_file = "unl-rdf-schema.ttl"
 semantic_net_file = "semantic-net.ttl"
 cts_file = "transduction-schemes.ttl"
 c_param_file = "config-parameters.ttl"
-req_onto_file = "requirement-ontology.ttl"
-sys_onto_file = "system-ontology.ttl"
-f_param_file = "ontology-parameters.ttl"
+# -- old --- req_onto_file = "requirement" + ONTO_FILE
+# -- old --- sys_onto_file = "system" + ONTO_FILE
+# -- old --- f_param_file = "ontology-parameters.ttl"
 
 # Dev Tests
 base_uri = "https://unsel.tetras-libre.fr/tenet/working"
@@ -78,20 +81,20 @@ def load_config(work_graph):
     print("----- Config Parameter Definition (" + str(len(work_graph)) + ")")
 
 
-def load_frame(work_graph):
+def load_frame(work_graph, target_system):
     print("-- Frame Ontology Loading:")
     
-    file_ref = FRAME_DIR + req_onto_file
-    work_graph.parse(file_ref)
-    print("----- Requirement Frame Ontology (" + str(len(work_graph)) + ")")
+    # -- old --- file_ref = FRAME_DIR + req_onto_file
+    # -- old --- work_graph.parse(file_ref)
+    # -- old --- print("----- Requirement Frame Ontology (" + str(len(work_graph)) + ")")
     
-    file_ref = FRAME_DIR + sys_onto_file
+    file_ref = FRAME_DIR + target_system + ONTO_FILE
     work_graph.parse(file_ref)
     print("----- System Frame Ontology (" + str(len(work_graph)) + ")")
     
-    file_ref = FRAME_DIR + f_param_file
-    work_graph.parse(file_ref)
-    print("----- Ontology Parameters (" + str(len(work_graph)) + ")")
+    # -- old --- file_ref = FRAME_DIR + f_param_file
+    # -- old --- work_graph.parse(file_ref)
+    # -- old --- print("----- Ontology Parameters (" + str(len(work_graph)) + ")")
 
 
 #def define_namespace(work_graph):
@@ -169,14 +172,14 @@ def finalize_export_file(export_file):
 # Main Function
 #==============================================================================
   
-def run(corpus, output_ref, output_file):
+def run(corpus, source_ref, target_ref):
     try:
         print("[Tenet] Prepare work data from corpus " + corpus)
     
         print("\n" + "- Graph Initialization")
         work_graph = Graph()
         load_config(work_graph)   
-        load_frame(work_graph) 
+        load_frame(work_graph, target_ref) 
         #define_namespace(work_graph)
     
         print("\n" + "- Preparation of Transduction Process")
@@ -186,25 +189,27 @@ def run(corpus, output_ref, output_file):
         load_sentences(work_graph, corpus)
     
         print("\n" + "- Result")
-        export_result(work_graph, output_ref, output_file)
+        output_file = OUTPUT_DIR + source_ref + TURTLE_SUFFIX
+        export_result(work_graph, source_ref, output_file)
         finalize_export_file(output_file)
         
         print()
     
     except:
         print("!!! An exception occurred !!!") 
-    
+        
 
 #==============================================================================
 # Execution
 #==============================================================================
 
 if __name__ == '__main__':
-    #run(req_100, 'R100', 'output100.ttl') 
-    #run(req_200, 'R200', 'output200.ttl')
-    run(req_300, 'R300b', 'output300b.ttl') 
-    run(corpus_40, 'Corpus-CCTP-40c', 'outputCCTP40c.ttl')
-    #run(corpus_ERTMS, 'Corpus-ERTMS', 'outputERTMS.ttl')
+    target_ref = "system"
+    run(req_100, 'R100', target_ref) 
+    run(req_200, 'R200', target_ref)
+    run(req_300, 'R300a', target_ref) 
+    run(corpus_40, 'Corpus-CCTP-40c', target_ref)
+    run(corpus_ERTMS, 'Corpus-ERTMS', target_ref)
 
 
     
-- 
GitLab