Commit 6cc5aedc authored by Helen Rawsthorne's avatar Helen Rawsthorne
Browse files

improved some functions to deal with domains and ranges that are a unionOf,...

improved some functions to deal with domains and ranges that are a unionOf, and added functions to print categories of saref:Function and of saref:Task
parent 9c93711b
Loading
Loading
Loading
Loading
+166 −27
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ from docx import Document
from docx.shared import Inches , Pt, Cm

dir_local = 'ts/debug/'
dir_win = 'C:\\Users\\maxime.lefrancois\\Seafile\\ETSI_SmartM2M_SAREF\\rep\\saref4envi\\ts\\debug\\'
dir_win = '/home/rawsthorne/Seafile/Travail/dechets/saref4envi/ts/debug/'

SAREF4ABCD = "SAREF4ENVI"
LANG="en"
@@ -59,7 +59,7 @@ def add_runs(s, p:docx.text.paragraph.Paragraph=None, style=code, header = None)
        s = ", ".join(s)
    if not isinstance(s, str):
        s = str(s)
    s = re.sub(r"((xsd|geo|foaf|vcard|org|saref|s4[a-z]{4}):[a-zA-Z0-9_-]+)",r"`\1`", s)
    s = re.sub(r"((xsd|owl|geo|time|foaf|vcard|org|saref|s4[a-z]{4}):[a-zA-Z0-9_-]+)",r"`\1`", s)
    s = re.sub(r"``",r"`", s)
    for s1, _, s2 in re.findall(r"([^`]*)(`([^`]+)`)?", s):
        if s1:
@@ -113,6 +113,8 @@ def print_for_query(query, func, title=None):
    queryResults = list(g.query(query))
    if not queryResults:
        return
    # for queryResult in queryResults:
        # print("queryResult: ",queryResult)
    if title and len(queryResults)>1:
        add_heading(title)
        n.append(0)
@@ -142,8 +144,35 @@ def print_op_or_dp(subject):
    visited.add(subject)
    add_heading("Property " + nm.qname(subject))
    add_note_for_query("Is a: ", f"""SELECT ?type WHERE {{ {subject.n3()} rdf:type ?type }} ORDER BY ?type """)
    add_note_for_query("Domain: ", f"""SELECT ?domain WHERE {{ {subject.n3() } rdfs:domain ?domain }} ORDER BY ?domain """)
    add_note_for_query("Range: ", f"""SELECT ?range WHERE {{ {subject.n3() } rdfs:range ?range }} ORDER BY ?range """)
    
    # for domain with only one class:
    add_note_for_query("Domain: ", f"""SELECT ?domain WHERE {{ {subject.n3()} rdfs:domain ?domain . FILTER isIri(?domain)}} ORDER BY ?domain """)

    # for domain a unionOf multiple classes:
    add_note_for_query("Domain: ", f"""SELECT ?domain WHERE {{ {subject.n3()} rdfs:domain ?unionOf . ?unionOf rdf:type owl:Class ; owl:unionOf/(rdf:rest*/rdf:first)* ?domain . FILTER isIri(?domain)}} ORDER BY ?domain """)

    # for range with only one class:
    # add_note_for_query("Range: ", f"""SELECT ?range WHERE {{ {subject.n3() } rdfs:range ?range }} ORDER BY ?range """)
    
    # for range a single class or a unionOf multiple classes:
    # Query to get the range or unionOf the range
    range_query = f"""SELECT ?range WHERE {{ {subject.n3()} rdfs:range ?range }} ORDER BY ?range """    
    range_results = g.query(range_query)
    ranges = []
    for result in range_results:
        range_node = result['range']     
        if isinstance(range_node, BNode):  # Check if it's a blank node indicating a unionOf
            # Extract classes specifically from the unionOf of this blank node
            union_query = f"""SELECT ?class WHERE {{ {subject.n3()} rdfs:range {range_node.n3()} . {range_node.n3()} rdf:type owl:Class ; owl:unionOf/(rdf:rest*/rdf:first)* ?class . FILTER isIri(?class) }} """
            union_classes = g.query(union_query)
            ranges.extend(nm.qname(cls['class']) for cls in union_classes if cls['class'])
        else:
            ranges.append(nm.qname(range_node))
    # Format the ranges and add the note
    range_output = ", ".join(ranges)
    if range_output:
        add_runs([range_output], header="Range: ")
    
    add_comment(subject)
        
def print_inst(subject):
@@ -177,7 +206,6 @@ def print_property_category(subject):
    if has_subsections:
        n.pop()
    
    
def print_property(subject):
    if subject in visited:
        return
@@ -281,7 +309,6 @@ def print_feature_kind(subject):
    if has_subsections:
        n.pop()


def print_feature_kind_category(subject):
    if subject in visited:
        return
@@ -338,11 +365,17 @@ def print_feature_category(subject):
    
    add_comment(subject)

    # print("Subject: ",subject.n3())
    
    # for single class in domain
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:domain {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_op_or_dp)
    
    # for domain a unionOf multiple classes
    print_for_query(f"""SELECT ?other WHERE {{ ?other rdfs:domain ?domain . ?domain rdf:type owl:Class ; owl:unionOf/(rdf:rest*/rdf:first)* {subject.n3()} . FILTER isIri({subject.n3()})}} ORDER BY ?other """, print_op_or_dp)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:subClassOf {subject.n3()} ;
          rdfs:label ?label }}   
@@ -382,20 +415,106 @@ def print_device_class(subject):
    if subject in visited:
        return
    visited.add(subject)
    add_heading("Device class " + nm.qname(subject))
    add_note_for_query("Super class: ", f"""SELECT ?super WHERE {{
    add_heading("Category of Device " + nm.qname(subject))
    has_subsections = start_subsection_if_needed(f"""ASK{{ 
                          {{ ?p rdfs:domain {subject.n3()} }} 
                          UNION 
                          {{ ?other rdfs:subClassOf {subject.n3()} }}
                          }}""")
    
    add_note_for_query("Sub-class of: ", f"""SELECT ?super WHERE {{
            {subject.n3()} rdfs:subClassOf ?super .    
            FILTER (ISURI(?super))                   
            FILTER( isuri(?super) )                
        }} ORDER BY ?super """)
    
    add_comment(subject)
    
    # next sections
    print_for_query(f"""SELECT ?subject WHERE {{
        ?subject a owl:Class ;
        rdfs:label ?label ;
        rdfs:comment ?comment ;
        rdfs:subClassOf {subject.n3()}                    
    }} ORDER BY ?subject""", print_device_class)
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:domain {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_op_or_dp)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:subClassOf {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_device_class)
    
    if has_subsections:
        n.pop()

def print_task_category(subject):
    if subject in visited:
        return
    visited.add(subject)
    add_heading("Category of Task " + nm.qname(subject))
    
    has_subsections = start_subsection_if_needed(f"""ASK{{ 
                          {{ ?other a {subject.n3()} }}
                          UNION
                          {{ ?other rdfs:subClassOf {subject.n3()} }}
                          }}""")
    
    add_note_for_query("Sub-class of: ", f"""SELECT ?super WHERE {{
            {subject.n3()} rdfs:subClassOf ?super .    
            FILTER( isuri(?super) )                
        }} ORDER BY ?super """)
    
    add_comment(subject)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:domain {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_op_or_dp)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:subClassOf {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_task_category)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other a {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_inst)
    
    if has_subsections:
        n.pop()

def print_function_category(subject):
    if subject in visited:
        return
    visited.add(subject)
    add_heading("Category of Function " + nm.qname(subject))
    
    has_subsections = start_subsection_if_needed(f"""ASK{{ 
                          {{ ?other a {subject.n3()} }}
                          UNION
                          {{ ?other rdfs:subClassOf {subject.n3()} }}
                          }}""")
    
    add_note_for_query("Sub-class of: ", f"""SELECT ?super WHERE {{
            {subject.n3()} rdfs:subClassOf ?super .    
            FILTER( isuri(?super) )                
        }} ORDER BY ?super """)
    
    add_comment(subject)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:domain {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_op_or_dp)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other rdfs:subClassOf {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_function_category)
    
    print_for_query(f"""SELECT ?other WHERE {{
        ?other a {subject.n3()} ;
          rdfs:label ?label }}   
     ORDER BY ?other""", print_inst)
    
    if has_subsections:
        n.pop()

def print_sensor(subject):
    if subject in visited:
@@ -486,7 +605,10 @@ for chunk in chunks:

# sous-classes de feaeture of interest
# sous-classes de feature kind
# isntances de faeture kind si il en reeste 
# instances de feature kind si il en reste
# sous-classes de device
# sous-classes de task
# sous-classes de function
# properties


@@ -511,6 +633,30 @@ for chunk in chunks:
            FILTER NOT EXISTS { ?subject skos:broader ?p . ?p rdfs:label ?l }
        } ORDER BY ?subject""", print_feature_kind, "Instances of saref:FeatureKind")
    
    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subClassOf saref:Device ;
            rdfs:label ?label .
            FILTER NOT EXISTS { ?subject rdfs:subClassOf ?other . ?other rdfs:label ?l }
        } ORDER BY ?subject""", print_feature_category, "Sub-classes of saref:Device")
    
    print_for_query("""SELECT ?subject WHERE {
            ?subject a saref:DeviceKind ;
            rdfs:label ?label .
            FILTER NOT EXISTS { ?subject skos:broader ?p . ?p rdfs:label ?l }
        } ORDER BY ?subject""", print_device_kind, "Instances of saref:DeviceKind")
    
    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subClassOf saref:Task ;
            rdfs:label ?label .
            FILTER NOT EXISTS { ?subject rdfs:subClassOf ?other . ?other rdfs:label ?l }
        } ORDER BY ?subject""", print_task_category, "Sub-classes of saref:Task")
    
    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subClassOf saref:Function ;
            rdfs:label ?label .
            FILTER NOT EXISTS { ?subject rdfs:subClassOf ?other . ?other rdfs:label ?l }
        } ORDER BY ?subject""", print_function_category, "Sub-classes of saref:Function")

    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subClassOf saref:Property ;
            rdfs:label ?label .
@@ -524,12 +670,6 @@ for chunk in chunks:
            FILTER NOT EXISTS { ?subject skos:broader ?p . ?p rdfs:label ?l }
        } ORDER BY ?subject""", print_property, "Instances of saref:Property")
        
    print_for_query("""SELECT ?subject WHERE {
            ?subject a saref:DeviceKind ;
            rdfs:label ?label .
            FILTER NOT EXISTS { ?subject skos:broader ?p . ?p rdfs:label ?l }
        } ORDER BY ?subject""", print_device_kind, "Instances of saref:DeviceKind")
        
    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subPropertyOf saref:hasIdentifier ;
            rdfs:label ?label .
@@ -540,7 +680,6 @@ for chunk in chunks:
            rdfs:label ?label .
        } ORDER BY ?subject""", print_procedure_execution)#, "Categories of Procedure Executions")
    

    print_for_query("""SELECT ?subject WHERE {
            ?subject rdfs:subClassOf saref:Observation ;
            rdfs:label ?label .
@@ -579,4 +718,4 @@ for chunk in chunks:

file = f'demo_{datetime.now().isoformat()}.docx'.replace(":","-")
document.save(f"{dir_local}{file}")
os.system(f'cmd.exe /C start "{dir_win}{file}"')
 No newline at end of file
# os.system(f'cmd.exe /C start "{dir_win}{file}"')