-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmtc2rdf.py
More file actions
84 lines (65 loc) · 2.76 KB
/
Copy pathmtc2rdf.py
File metadata and controls
84 lines (65 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import sys
import owlready2 as owl
from ontologies import BFO, Core, MTConnect, Construct
from mtconnect_to_iof import MTConnectToIOF
from generate_diagram import GenerateDiagram
from iof_render import dl_render_terminology, dl_render_class, Namespaces
import re
from indented_logger import setup_logging, increase_indent, decrease_indent
from indented_logger.decorator import log_indent
import logging
import logger
from generate_html import render_vendor, render_terminology
logger = logging.getLogger(__name__)
MTConnect.load(only_local=True)
render_terminology("MTConnect", MTConnect)
if len(sys.argv) < 2:
print("Usage: python mtc2rdf.py <file>")
sys.exit(1)
file_name = sys.argv[1]
trans = None
with open(file_name, 'r') as file:
print("Gettig MTConnect XML from:", file_name)
xml = file.read()
trans = MTConnectToIOF(xml)
trans.convert()
trans.write()
Vendor = trans.Vendor
Namespaces[Vendor.base_iri] = Vendor.name
#owl.sync_reasoner_pellet(infer_property_values = True, infer_data_property_values = True, debug = 10)
#print(Vendor.classes)
entities = [x[0] for x in owl.default_world.sparql("""select ?p { ?p a ?c . ?c rdfs:subClassOf* ?? . }""", \
[BFO.material_entity]) if x[0].namespace == trans.Data]
GenerateDiagram.linked_terms = set(entities)
render_vendor(Vendor.name, Vendor, entities)
all_data = list(owl.default_world.sparql(f"""select ?s ?p ?o {{ ?s ?p ?o . FILTER(LIKE(STR(?s), "{trans.Data.base_iri}%")) }}"""))
full = GenerateDiagram(f"{Vendor.name}Full", all_data, Vendor)
logger.info("Generating full diagram")
full.generate()
logger.info("Generating topology")
statements = [[x[0], MTConnect.connectedTo, x[1]] \
for x in owl.default_world.sparql("select distinct ?s ?o { ?s ?? ?o .}", [MTConnect.connectedTo])]
gen = GenerateDiagram(f"{Vendor.name}Topo", statements, Vendor)
gen.generate()
logger.info("Generating mereology")
statements = [[x[0], MTConnect.hasComponent, x[1]] \
for x in owl.default_world.sparql("select distinct ?s ?o { ?s ?? ?o .}", [MTConnect.hasComponent])]
gen = GenerateDiagram(f"{Vendor.name}Mere", statements, Vendor)
gen.generate()
for part in entities:
logger.info(f"Generating diagram for {part}")
raw = owl.default_world.sparql("""select distinct ?p ?o ?p2 ?o2 { ?? ?p ?o . ?o ?p2 ?o2 . }""", [part])
statements = []
for x in raw:
l1 = [part, x[0], x[1]]
if l1 not in statements:
statements.append(l1)
if x[1].namespace != Vendor:
l2 = [x[1], x[2], x[3]]
if l2 not in statements:
statements.append(l2)
pre = owl.default_world.sparql("select distinct ?s ?p { ?s ?p ?? .}", [part])
for x in pre:
statements.append([x[0], x[1], part])
gen = GenerateDiagram(f"{part.name}", statements, Vendor)
gen.generate()