Loading scripts/ts_maker.py +166 −27 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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: Loading Loading @@ -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) Loading Loading @@ -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): Loading Loading @@ -177,7 +206,6 @@ def print_property_category(subject): if has_subsections: n.pop() def print_property(subject): if subject in visited: return Loading Loading @@ -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 Loading Loading @@ -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 }} Loading Loading @@ -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: Loading Loading @@ -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 Loading @@ -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 . Loading @@ -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 . Loading @@ -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 . Loading Loading @@ -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}"') Loading
scripts/ts_maker.py +166 −27 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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: Loading Loading @@ -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) Loading Loading @@ -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): Loading Loading @@ -177,7 +206,6 @@ def print_property_category(subject): if has_subsections: n.pop() def print_property(subject): if subject in visited: return Loading Loading @@ -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 Loading Loading @@ -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 }} Loading Loading @@ -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: Loading Loading @@ -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 Loading @@ -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 . Loading @@ -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 . Loading @@ -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 . Loading Loading @@ -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}"')