From b2046d8b26f592d5c2d26495e8f3883566364369 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Lamercerie?=
 <aurelien.lamercerie@laposte.net>
Date: Thu, 16 Sep 2021 10:47:54 +0200
Subject: [PATCH] Compute domain/range of event/stateProperty object properties

---
 config/semantic-net.ttl         |  15 ++
 config/transduction-schemes.ttl | 265 +++++++++++++++++++++++++++-----
 2 files changed, 244 insertions(+), 36 deletions(-)

diff --git a/config/semantic-net.ttl b/config/semantic-net.ttl
index a7b13e57..fece4e2f 100644
--- a/config/semantic-net.ttl
+++ b/config/semantic-net.ttl
@@ -45,6 +45,11 @@ net:class
   rdfs:label "class" ;
   rdfs:subClassOf net:Type ;
 .
+net:classUri
+  rdf:type rdf:Property ;
+  rdfs:label "class uri" ;
+  rdfs:subPropertyOf net:objectValue ;
+.
 net:class_list
   rdf:type owl:Class ;
   rdfs:label "classList" ;
@@ -165,6 +170,11 @@ net:has_verb
   rdfs:label "has verb" ;
   rdfs:subPropertyOf net:has_object ;
 .
+net:instanceUri
+  rdf:type rdf:Property ;
+  rdfs:label "instance uri" ;
+  rdfs:subPropertyOf net:objectValue ;
+.
 net:listGuiding
   rdf:type rdf:Property ;
   rdfs:label "Guiding connector of a list (or, and)" ;
@@ -199,6 +209,11 @@ net:objectValue
   rdfs:label "valuations"@fr ;
   rdfs:subPropertyOf net:objectAttribute ;
 .
+net:parentClassUri
+  rdf:type rdf:Property ;
+  rdfs:label "parent class uri" ;
+  rdfs:subPropertyOf net:objectValue ;
+.
 net:property
   rdf:type rdf:Property ;
   rdfs:label "netProperty" ;
diff --git a/config/transduction-schemes.ttl b/config/transduction-schemes.ttl
index 5249022d..98c103f0 100644
--- a/config/transduction-schemes.ttl
+++ b/config/transduction-schemes.ttl
@@ -315,11 +315,13 @@ WHERE {
    ?net1 net:has_actor ?actorObject1.
    ?actorObject1 net:entityClass ?actorClass.	
    ?actorObject1 net:concept ?actorConcept.
-   ?actorObject1 net:entityInstance ?actorInstance. 
+   ?actorObject1 net:entityInstance ?actorInstance.
+   ?actorObject1 net:instanceUri ?actorInstanceUri.  
    ?net1 net:has_target ?targetObject1.
    ?targetObject1 net:entityClass ?targetClass.	
    ?targetObject1 net:concept ?targetConcept.
    ?targetObject1 net:entityInstance ?targetInstance. 
+   ?targetObject1 net:instanceUri ?targetInstanceUri. 
    # Label: event
    BIND (concat(?actorConcept, '-', ?verbConcept) AS ?e1).
    BIND (concat(?e1, '-', ?targetConcept) AS ?eventLabel).
@@ -330,30 +332,31 @@ WHERE {
    BIND (concat(?c1, '_', ?eventLabel) AS ?c2).
    BIND (uri( ?c1) AS ?eventClassUri).
    BIND (uri(?c2) AS ?newEventUri).
-   # URI (for instance)
-   # -- old --- BIND (concat( ?frameURI, ?eventClass) AS ?i1).
-   # -- old --- BIND (concat(?i1, '_', ?mainInstance) AS ?i2).
-   # -- old --- BIND (uri(?i2) AS ?mainInstanceUri).
    # URI (for object property)
+   fprm:System_Ontology fprm:frameURI ?frameURI.
    fprm:System_Event fprm:objectProperty ?eventObjectProperty.
    BIND (concat( ?frameURI, ?eventObjectProperty) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o1) AS ?eventObjectPropertyUri).
    BIND (uri( ?o2) AS ?newEventObjectPropertyUri).
+   # URI (for instance)
+   # -- old --- BIND (concat( ?frameURI, ?eventClass) AS ?i1).
+   # -- old --- BIND (concat(?i1, '_', ?mainInstance) AS ?i2).
+   # -- old --- BIND (uri(?i2) AS ?mainInstanceUri).
    # URI (for Entity classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   BIND (concat( ?frameURI, ?actorClass) AS ?e1a).
-   BIND (concat(?e1a, '#', ?actorConcept) AS ?e1b).
-   BIND (concat(?e1a, '_', ?actorInstance) AS ?e1c).
-   BIND (uri(?e1a) AS ?actorClassUri).
-   BIND (uri(?e1b) AS ?actorUri).
-   BIND (uri(?e1c) AS ?actorInstanceUri).
-   BIND (concat( ?frameURI, ?targetClass) AS ?e2a).
-   BIND (concat(?e2a, '#', ?targetConcept) AS ?e2b).
-   BIND (concat(?e2a, '_', ?targetInstance) AS ?e2c).
-   BIND (uri(?e2a) AS ?targetClassUri).
-   BIND (uri(?e2b) AS ?targetUri).
-   BIND (uri(?e2c) AS ?targetInstanceUri).
+   # -- old --- fprm:System_Ontology fprm:frameURI ?frameURI.
+   # -- old --- BIND (concat( ?frameURI, ?actorClass) AS ?e1a).
+   # -- old --- BIND (concat(?e1a, '#', ?actorConcept) AS ?e1b).
+   # -- old --- BIND (concat(?e1a, '_', ?actorInstance) AS ?e1c).
+   # -- old --- BIND (uri(?e1a) AS ?actorClassUri).
+   # -- old --- BIND (uri(?e1b) AS ?actorUri).
+   # -- old --- BIND (uri(?e1c) AS ?actorInstanceUri).
+   # -- old --- BIND (concat( ?frameURI, ?targetClass) AS ?e2a).
+   # -- old --- BIND (concat(?e2a, '#', ?targetConcept) AS ?e2b).
+   # -- old --- BIND (concat(?e2a, '_', ?targetInstance) AS ?e2c).
+   # -- old --- BIND (uri(?e2a) AS ?targetClassUri).
+   # -- old --- BIND (uri(?e2b) AS ?targetUri).
+   # -- old --- BIND (uri(?e2c) AS ?targetInstanceUri).
 }""" ;
   sh:order 3.1 ;
 .
@@ -496,11 +499,13 @@ WHERE {
    ?net1 net:has_actor ?actorObject1.
    ?actorObject1 net:entityClass ?actorClass.	
    ?actorObject1 net:concept ?actorConcept.
-   ?actorObject1 net:entityInstance ?actorInstance. 
+   ?actorObject1 net:entityInstance ?actorInstance.
+   ?actorObject1 net:instanceUri ?actorInstanceUri.  
    ?net1 net:has_target ?targetObject1.
    ?targetObject1 net:entityClass ?targetClass.	
    ?targetObject1 net:concept ?targetConcept.
    ?targetObject1 net:entityInstance ?targetInstance. 
+   ?targetObject1 net:instanceUri ?targetInstanceUri. 
    # Label: event
    BIND (concat(?actorConcept, '-', ?verbConcept) AS ?e1).
    BIND (concat(?e1, '-', ?targetConcept) AS ?statePropertyLabel).
@@ -511,30 +516,30 @@ WHERE {
    BIND (concat(?c1, '_', ?statePropertyLabel) AS ?c2).
    BIND (uri( ?c1) AS ?statePropertyClassUri).
    BIND (uri(?c2) AS ?newStatePropertyUri).
-   # URI (for instance)
-   # -- old --- BIND (concat( ?frameURI, ?eventClass) AS ?i1).
-   # -- old --- BIND (concat(?i1, '_', ?mainInstance) AS ?i2).
-   # -- old --- BIND (uri(?i2) AS ?mainInstanceUri).
    # URI (for object property)
    fprm:System_State_Property fprm:objectProperty ?statePropertyObjectProperty.
    BIND (concat( ?frameURI, ?statePropertyObjectProperty) AS ?o1).
    BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
    BIND (uri( ?o1) AS ?statePropertyObjectPropertyUri).
    BIND (uri( ?o2) AS ?newStatePropertyObjectPropertyUri).
+   # URI (for instance)
+   # -- old --- BIND (concat( ?frameURI, ?eventClass) AS ?i1).
+   # -- old --- BIND (concat(?i1, '_', ?mainInstance) AS ?i2).
+   # -- old --- BIND (uri(?i2) AS ?mainInstanceUri).
    # URI (for Entity classes)
-   fprm:System_Ontology fprm:frameURI ?frameURI.
-   BIND (concat( ?frameURI, ?actorClass) AS ?e1a).
-   BIND (concat(?e1a, '#', ?actorConcept) AS ?e1b).
-   BIND (concat(?e1a, '_', ?actorInstance) AS ?e1c).
-   BIND (uri(?e1a) AS ?actorClassUri).
-   BIND (uri(?e1b) AS ?actorUri).
-   BIND (uri(?e1c) AS ?actorInstanceUri).
-   BIND (concat( ?frameURI, ?targetClass) AS ?e2a).
-   BIND (concat(?e2a, '#', ?targetConcept) AS ?e2b).
-   BIND (concat(?e2a, '_', ?targetInstance) AS ?e2c).
-   BIND (uri(?e2a) AS ?targetClassUri).
-   BIND (uri(?e2b) AS ?targetUri).
-   BIND (uri(?e2c) AS ?targetInstanceUri).
+   # -- old --- fprm:System_Ontology fprm:frameURI ?frameURI.
+   # -- old --- BIND (concat( ?frameURI, ?actorClass) AS ?e1a).
+   # -- old --- BIND (concat(?e1a, '#', ?actorConcept) AS ?e1b).
+   # -- old --- BIND (concat(?e1a, '_', ?actorInstance) AS ?e1c).
+   # -- old --- BIND (uri(?e1a) AS ?actorClassUri).
+   # -- old --- BIND (uri(?e1b) AS ?actorUri).
+   # -- old --- BIND (uri(?e1c) AS ?actorInstanceUri).
+   # -- old --- BIND (concat( ?frameURI, ?targetClass) AS ?e2a).
+   # -- old --- BIND (concat(?e2a, '#', ?targetConcept) AS ?e2b).
+   # -- old --- BIND (concat(?e2a, '_', ?targetInstance) AS ?e2c).
+   # -- old --- BIND (uri(?e2a) AS ?targetClassUri).
+   # -- old --- BIND (uri(?e2b) AS ?targetUri).
+   # -- old --- BIND (uri(?e2c) AS ?targetInstanceUri).
 }""" ;
   sh:order 3.1 ;
 .
@@ -610,6 +615,10 @@ 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-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:create-abstraction-net ;
   sh:rule cts:create-entity-net ;
   sh:rule cts:create-feature-net ;
@@ -1146,6 +1155,186 @@ WHERE {
 }""" ;
   sh:order 2.6 ;
 .
+cts:compute-class-uri-of-entity-net-object
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "compute-class-uri-of-entity-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#>
+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#>
+
+# -- Compute useful URI
+CONSTRUCT { 
+   # Net Object URI
+   ?object net:parentClassUri ?parentClassUri.
+   ?object net:classUri ?objectClassUri.
+}
+WHERE {
+   # net1: entity
+   ?object a net:Object.
+   ?object net:entityClass ?objectClass.	
+   ?object net:concept ?objectConcept.
+   # URI (for classes and instance)
+   fprm:System_Ontology fprm:frameURI ?frameURI.
+   BIND (concat( ?frameURI, ?objectClass) AS ?s1).
+   BIND (concat(?s1, '#', ?objectConcept) AS ?s2).
+   BIND (uri( ?s1) AS ?parentClassUri).
+   BIND (uri(?s2) AS ?objectClassUri).
+}""" ;
+  sh:order 3.01 ;
+.
+cts:compute-domain-range-of-event-object-properties
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "compute-domain-range-of-object-properties" ;
+  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#>
+
+# -- Compute domain/range of object properties
+CONSTRUCT { 
+   # Object Property: domain, range and relation between domain/range classes
+   ?newEventObjectPropertyUri rdfs:domain ?domainClass.
+   ?newEventObjectPropertyUri rdfs:range ?rangeClass.
+   ?domainClass ?newEventObjectPropertyUri ?rangeClass. # relation between domain/range classes
+}
+WHERE {
+   # net1: event
+   ?net1 a net:Instance.
+   ?net1 net:type net:event.
+   ?net1 net:has_structure ?req.
+   ?net1 net:has_verb ?verbObject1.	
+   ?verbObject1 net:concept ?verbConcept.
+   # domain  
+   ?net1 net:has_possible_domain ?possibleDomainLabel1.
+	?domainClass rdfs:label ?possibleDomainLabel1 .
+   FILTER (
+		NOT EXISTS {
+			?net2 net:has_possible_domain ?possibleDomainLabel2 .
+	        ?anotherDomainClass rdfs:label ?possibleDomainLabel2 .
+			?anotherDomainClass rdfs:subClassOf ?domainClass.
+		}
+	)
+   # range  
+   ?net1 net:has_possible_range ?possibleRangeLabel1.
+   ?rangeClass rdfs:label ?possibleRangeLabel1 .
+   FILTER (
+		NOT EXISTS {
+			?net2 net:has_possible_domain ?possibleRangeLabel2 .
+	       ?anotherRangeClass rdfs:label ?possibleRangeLabel2 .
+			?anotherRangeClass rdfs:subClassOf ?rangeClass.
+		}
+   )
+   # URI (for object property)
+   fprm:System_Ontology fprm:frameURI ?frameURI.
+   fprm:System_Event fprm:objectProperty ?eventObjectProperty.
+   BIND (concat( ?frameURI, ?eventObjectProperty) AS ?o1).
+   BIND (concat(?o1, '#', ?verbConcept) AS ?o2).
+   BIND (uri( ?o2) AS ?newEventObjectPropertyUri).
+}""" ;
+  sh:order 3.5 ;
+.
+cts:compute-domain-range-of-state-property-object-properties
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "compute-domain-range-of-object-properties" ;
+  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#>
+
+# -- Compute domain/range of object properties
+CONSTRUCT { 
+   # Object Property: domain, range and relation between domain/range classes
+   ?objectPropertyUri rdfs:domain ?domainClass.
+   ?objectPropertyUri rdfs:range ?rangeClass.
+   ?domainClass ?objectPropertyUri ?rangeClass. # relation between domain/range classes
+}
+WHERE {
+   # net1: event
+   ?net1 a net:Instance.
+   ?net1 net:type net:state_property.
+   ?net1 net:has_structure ?req.
+   ?net1 net:has_verb ?verbObject1.	
+   ?verbObject1 net:concept ?verbConcept.
+   # domain  
+   ?net1 net:has_possible_domain ?possibleDomainLabel1.
+	?domainClass rdfs:label ?possibleDomainLabel1 .
+   FILTER (
+		NOT EXISTS {
+			?net2 net:has_possible_domain ?possibleDomainLabel2 .
+	        ?anotherDomainClass rdfs:label ?possibleDomainLabel2 .
+			?anotherDomainClass rdfs:subClassOf ?domainClass.
+		}
+	)
+   # range  
+   ?net1 net:has_possible_range ?possibleRangeLabel1.
+   ?rangeClass rdfs:label ?possibleRangeLabel1 .
+   FILTER (
+		NOT EXISTS {
+			?net2 net:has_possible_domain ?possibleRangeLabel2 .
+	       ?anotherRangeClass rdfs:label ?possibleRangeLabel2 .
+			?anotherRangeClass rdfs:subClassOf ?rangeClass.
+		}
+   )
+   # URI (for object property)
+   fprm:System_Ontology fprm:frameURI ?frameURI.
+   fprm:System_State_Property fprm:objectProperty ?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
+  rdf:type sh:SPARQLRule ;
+  rdfs:label "compute-instance-uri-of-entity-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#>
+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#>
+
+# -- Compute useful URI
+CONSTRUCT { 
+   # Net Object URI
+   ?object net:instanceUri ?objectInstanceUri.
+}
+WHERE {
+   # net1: entity
+   ?object a net:Object.
+   ?object net:entityClass ?objectClass.	
+   ?object net:entityInstance ?objectInstance. 
+   # URI (for classes and instance)
+   fprm:System_Ontology fprm:frameURI ?frameURI.
+   BIND (concat( ?frameURI, ?objectClass) AS ?s1).
+   BIND (concat(?s1, '_', ?objectInstance) AS ?s3).
+   BIND (uri(?s3) AS ?objectInstanceUri).
+}""" ;
+  sh:order 3.02 ;
+.
 cts:create-abstraction-net
   rdf:type sh:SPARQLRule ;
   sh:construct """PREFIX owl: <http://www.w3.org/2002/07/owl#>
@@ -1468,6 +1657,10 @@ cts:generation
   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-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 ;
 .
 cts:init-mod-list
   rdf:type sh:SPARQLRule ;
-- 
GitLab