diff --git a/semantic-model/datamodel/tools/getSubcomponents.js b/semantic-model/datamodel/tools/getSubcomponents.js index fe98f858..838a174a 100644 --- a/semantic-model/datamodel/tools/getSubcomponents.js +++ b/semantic-model/datamodel/tools/getSubcomponents.js @@ -44,6 +44,11 @@ const argv = yargs description: 'Entity Files containing description of attributes', type: 'array' }) + .option('shacl', { + alias: 's', + description: 'SHACL File for the object model', + type: 'string' + }) .option('token', { alias: 't', description: 'Token for rest call', @@ -60,16 +65,16 @@ function namespace (baseIRI) { const NGSILD = namespace('https://uri.etsi.org/ngsi-ld/'); // Read in all the entity files -const entitiesstore = new N3.Store(); +const ontstore = new N3.Store(); -const loadEntities = async (entities) => { - if (entities && entities.length > 0) { - for (const entity of entities) { +const loadOntologies = async (ont) => { + if (ont && ont.length > 0) { + for (const entity of ont) { const parser = new N3.Parser(); const ttlContent = fs.readFileSync(entity, 'utf8'); parser.parse(ttlContent, (error, quad) => { if (quad) { - entitiesstore.addQuad(quad); + ontstore.addQuad(quad); } else if (error) { console.error('Parsing error:', error); } @@ -157,38 +162,47 @@ const analyseNgsildObject = async (id, brokerUrl, token) => { return; } - const quadsFromEntitiesStore = entitiesstore.getQuads(null, null, null, null); + const quadsFromEntitiesStore = ontstore.getQuads(null, null, null, null); store.addQuads(quadsFromEntitiesStore); const bindingsStream = await myEngine.queryBindings(` - PREFIX base: - PREFIX ngsild: - SELECT ?s ?id + PREFIX base: + PREFIX ngsild: + PREFIX sh: + SELECT ?id ?type ?attribute WHERE { - ?b a ngsild:Relationship . - ?s a base:SubComponentRelationship . - ?id ?s ?b . + ?id a ?type . + ?id ?attribute ?blank . + ?blank a ngsild:Relationship . + ?shape a sh:NodeShape . + ?shape sh:property ?property . + ?property sh:path ?attribute . + ?property a base:SubComponentRelationship . }`, { sources: [store] } ); const bindings = await bindingsStream.toArray(); for (const binding of bindings) { - const s = binding.get('s').value; + const s = binding.get('attribute').value; const triples = store.getQuads(null, s, null, null); for (const quad of triples) { const ngsildObjects = store.getQuads(quad.object, NGSILD('hasObject'), null, null); for (const ngsildObject of ngsildObjects) { const subId = ngsildObject.object.value; - subids.push(subId); - await analyseNgsildObject(subId, brokerUrl, token); + if (!subids.includes(subId)) { + subids.push(subId); + await analyseNgsildObject(subId, brokerUrl, token); + } } } } }; (async () => { - await loadEntities(argv.entities); + const ontologies = argv.entities; + ontologies.push(argv.shacl); + await loadOntologies(ontologies); await analyseNgsildObject(argv._[0], argv['broker-url'], argv.token); let cmdlineargs = ''; diff --git a/semantic-model/datamodel/tools/lib/owlUtils.js b/semantic-model/datamodel/tools/lib/owlUtils.js index 0f90a7de..34966e1b 100644 --- a/semantic-model/datamodel/tools/lib/owlUtils.js +++ b/semantic-model/datamodel/tools/lib/owlUtils.js @@ -21,7 +21,6 @@ const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); const RDFS = $rdf.Namespace('http://www.w3.org/2000/01/rdf-schema#'); const OWL = $rdf.Namespace('http://www.w3.org/2002/07/owl#'); const NGSILD = $rdf.Namespace('https://uri.etsi.org/ngsi-ld/'); -const BASE = $rdf.Namespace('https://industryfusion.github.io/contexts/ontology/v0/base/'); const globalAttributes = []; const globalEntities = []; @@ -81,11 +80,6 @@ function dumpAttribute (attribute, entity, store) { store.add($rdf.sym(attribute.attributeName), RDFS('range'), NGSILD('Property')); } else { store.add($rdf.sym(attribute.attributeName), RDFS('range'), NGSILD('Relationship')); - if (attribute.isSubcomponent) { - store.add($rdf.sym(attribute.attributeName), RDF('type'), BASE('SubComponentRelationship')); - } else { - store.add($rdf.sym(attribute.attributeName), RDF('type'), BASE('PeerRelationship')); - } } } } diff --git a/semantic-model/datamodel/tools/lib/shaclUtils.js b/semantic-model/datamodel/tools/lib/shaclUtils.js index 755dc5f0..950b52d7 100644 --- a/semantic-model/datamodel/tools/lib/shaclUtils.js +++ b/semantic-model/datamodel/tools/lib/shaclUtils.js @@ -25,6 +25,7 @@ const myParser = new ContextParser(); const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); const SHACL = $rdf.Namespace('http://www.w3.org/ns/shacl#'); const IFFK = $rdf.Namespace('https://industry-fusion.org/knowledge/v0.1/'); +const BASE = $rdf.Namespace('https://industryfusion.github.io/contexts/ontology/v0/base/'); let globalContext; let globalPrefixHash; @@ -49,13 +50,14 @@ class NodeShape { } class PropertyShape { - constructor (mincount, maxcount, nodeKind, path, isProperty) { + constructor (mincount, maxcount, nodeKind, path, isProperty, isSubComponent) { this.mincount = mincount; this.maxcount = maxcount; this.nodeKind = nodeKind; this.path = path; this.constraints = []; this.isProperty = isProperty; + this.isSubComponent = isSubComponent; } addConstraint (constraint) { @@ -83,6 +85,13 @@ function dumpPropertyShape (propertyShape, store) { store.add(propNode, SHACL('minCount'), propertyShape.mincount); store.add(propNode, SHACL('maxCount'), propertyShape.maxcount); store.add(propNode, SHACL('nodeKind'), SHACL('BlankNode')); + if (propertyShape.isSubComponent && !propertyShape.isProperty) { + store.add(propNode, RDF('type'), BASE('SubComponentRelationship')); + } else if (!propertyShape.isSubComponent && !propertyShape.isProperty) { + store.add(propNode, RDF('type'), BASE('PeerRelationship')); + } else { + store.add(propNode, RDF('type'), BASE('Property')); + } store.add(propNode, SHACL('path'), propertyShape.path); const attributeNode = $rdf.blankNode(); store.add(propNode, SHACL('property'), attributeNode); @@ -143,12 +152,16 @@ function scanProperties (nodeShape, typeschema) { let nodeKind = SHACL('Literal'); let klass = null; let isProperty = true; + let isSubComponent = false; if ('relationship' in typeschema.properties[property]) { nodeKind = SHACL('IRI'); klass = typeschema.properties[property].relationship; klass = globalContext.expandTerm(klass, true); isProperty = false; } + if ('relationship_type' in typeschema.properties[property] && typeschema.properties[property].relationship_type === 'subcomponent') { + isSubComponent = true; + } let mincount = 0; const maxcount = 1; if (required.includes(property)) { @@ -158,7 +171,7 @@ function scanProperties (nodeShape, typeschema) { if (!ContextUtil.isValidIri(path)) { path = globalContext.expandTerm(path, true); } - const propertyShape = new PropertyShape(mincount, maxcount, nodeKind, $rdf.sym(path), isProperty); + const propertyShape = new PropertyShape(mincount, maxcount, nodeKind, $rdf.sym(path), isProperty, isSubComponent); nodeShape.addPropertyShape(propertyShape); if (klass !== null) { propertyShape.addConstraint(new Constraint(SHACL('class'), $rdf.sym(klass))); diff --git a/semantic-model/datamodel/tools/tests/schema2owl/schema3_c0.json_result b/semantic-model/datamodel/tools/tests/schema2owl/schema3_c0.json_result index db62cd49..eabb3a7d 100644 --- a/semantic-model/datamodel/tools/tests/schema2owl/schema3_c0.json_result +++ b/semantic-model/datamodel/tools/tests/schema2owl/schema3_c0.json_result @@ -1,11 +1,10 @@ @prefix owl: . @prefix iffb: . @prefix rdfs: . -@prefix base: . @prefix ngsi-ld: . iffb:hasFilter - a owl:Property, base:PeerRelationship; + a owl:Property; rdfs:domain ; rdfs:range ngsi-ld:Relationship. iffb:machine_state diff --git a/semantic-model/datamodel/tools/tests/schema2owl/schema4_c0.json_result b/semantic-model/datamodel/tools/tests/schema2owl/schema4_c0.json_result index 439d1a67..5f378f64 100644 --- a/semantic-model/datamodel/tools/tests/schema2owl/schema4_c0.json_result +++ b/semantic-model/datamodel/tools/tests/schema2owl/schema4_c0.json_result @@ -1,11 +1,10 @@ @prefix owl: . @prefix iffb: . @prefix rdfs: . -@prefix base: . @prefix ngsi-ld: . iffb:hasCartridge - a owl:Property, base:SubComponentRelationship; + a owl:Property; rdfs:domain ; rdfs:range ngsi-ld:Relationship. iffb:machine_state diff --git a/semantic-model/datamodel/tools/tests/schema2shacl/c0 b/semantic-model/datamodel/tools/tests/schema2shacl/c0 index 6d7e122e..b21818d9 100644 --- a/semantic-model/datamodel/tools/tests/schema2shacl/c0 +++ b/semantic-model/datamodel/tools/tests/schema2shacl/c0 @@ -33,6 +33,10 @@ "sh": { "@id": "http://www.w3.org/ns/shacl#", "@prefix": true + }, + "base": { + "@id": "https://industryfusion.github.io/contexts/ontology/v0/base/", + "@prefix": true } } ] diff --git a/semantic-model/datamodel/tools/tests/schema2shacl/schema3_c0.json_result b/semantic-model/datamodel/tools/tests/schema2shacl/schema3_c0.json_result index 4e5cf580..2486ac72 100644 --- a/semantic-model/datamodel/tools/tests/schema2shacl/schema3_c0.json_result +++ b/semantic-model/datamodel/tools/tests/schema2shacl/schema3_c0.json_result @@ -1,11 +1,13 @@ @prefix iffb: . @prefix sh: . +@prefix base: . @prefix ngsi-ld: . a sh:NodeShape; sh:property [ + a base:PeerRelationship; sh:maxCount 1; sh:minCount 0; sh:nodeKind sh:BlankNode; @@ -21,6 +23,7 @@ ] ], [ + a base:Property; sh:maxCount 1; sh:minCount 1; sh:nodeKind sh:BlankNode; diff --git a/semantic-model/datamodel/tools/tests/schema2shacl/schema4_c0.json_result b/semantic-model/datamodel/tools/tests/schema2shacl/schema4_c0.json_result index 1c610ff3..0a336567 100644 --- a/semantic-model/datamodel/tools/tests/schema2shacl/schema4_c0.json_result +++ b/semantic-model/datamodel/tools/tests/schema2shacl/schema4_c0.json_result @@ -1,37 +1,40 @@ @prefix iffb: . @prefix sh: . +@prefix base: . @prefix ngsi-ld: . a sh:NodeShape; sh:property [ + a base:Property; sh:maxCount 1; - sh:minCount 0; + sh:minCount 1; sh:nodeKind sh:BlankNode; - sh:path iffb:hasIdentification; + sh:path iffb:waste_class; sh:property [ - sh:class - ; + sh:in ( "WC0" "WC1" "WC2" "WC3" ); sh:maxCount 1; sh:minCount 1; - sh:nodeKind sh:IRI; - sh:path ngsi-ld:hasObject + sh:nodeKind sh:Literal; + sh:path ngsi-ld:hasValue ] ], [ + a base:SubComponentRelationship; sh:maxCount 1; - sh:minCount 1; + sh:minCount 0; sh:nodeKind sh:BlankNode; - sh:path iffb:waste_class; + sh:path iffb:hasIdentification; sh:property [ - sh:in ( "WC0" "WC1" "WC2" "WC3" ); + sh:class + ; sh:maxCount 1; sh:minCount 1; - sh:nodeKind sh:Literal; - sh:path ngsi-ld:hasValue + sh:nodeKind sh:IRI; + sh:path ngsi-ld:hasObject ] ]; sh:targetClass . diff --git a/semantic-model/datamodel/tools/tests/schema2shacl/schema5_c0.json_result b/semantic-model/datamodel/tools/tests/schema2shacl/schema5_c0.json_result index 68840a6b..4b9da72b 100644 --- a/semantic-model/datamodel/tools/tests/schema2shacl/schema5_c0.json_result +++ b/semantic-model/datamodel/tools/tests/schema2shacl/schema5_c0.json_result @@ -1,10 +1,12 @@ @prefix sh: . +@prefix base: . @prefix ngsi-ld: . a sh:NodeShape; sh:property [ + a base:Property; sh:maxCount 1; sh:minCount 0; sh:nodeKind sh:BlankNode; @@ -19,6 +21,7 @@ ] ], [ + a base:Property; sh:maxCount 1; sh:minCount 1; sh:nodeKind sh:BlankNode; diff --git a/semantic-model/datamodel/tools/tests/testOwlUtils.js b/semantic-model/datamodel/tools/tests/testOwlUtils.js index 20d3afd3..ea469727 100644 --- a/semantic-model/datamodel/tools/tests/testOwlUtils.js +++ b/semantic-model/datamodel/tools/tests/testOwlUtils.js @@ -26,7 +26,6 @@ const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); const RDFS = $rdf.Namespace('http://www.w3.org/2000/01/rdf-schema#'); const OWL = $rdf.Namespace('http://www.w3.org/2002/07/owl#'); const NGSILD = $rdf.Namespace('https://uri.etsi.org/ngsi-ld/'); -const BASE = $rdf.Namespace('https://industryfusion.github.io/contexts/ontology/v0/base/'); describe('Test class Entity', function () { it('Should create Entity with IRI', function () { @@ -76,8 +75,7 @@ describe('Test dumpAttribute', function () { const expected = [ [$rdf.namedNode(attributeName), RDF('type'), OWL('Property')], [$rdf.namedNode(attributeName), RDFS('domain'), $rdf.namedNode(entityName)], - [$rdf.namedNode(attributeName), RDFS('range'), NGSILD('Relationship')], - [$rdf.namedNode(attributeName), RDF('type'), BASE('PeerRelationship')] + [$rdf.namedNode(attributeName), RDFS('range'), NGSILD('Relationship')] ]; const store = { add: (s, p, o) => { added.push([s, p, o]); } diff --git a/semantic-model/datamodel/tools/tests/testShaclUtils.js b/semantic-model/datamodel/tools/tests/testShaclUtils.js index 5a600aa1..14e127ab 100644 --- a/semantic-model/datamodel/tools/tests/testShaclUtils.js +++ b/semantic-model/datamodel/tools/tests/testShaclUtils.js @@ -71,8 +71,12 @@ describe('Test dumpPropertyShape', function () { Namespace: () => (x) => 'ngsild:' + x }; const SHACL = (x) => 'shacl:' + x; + const BASE = (x) => 'base:' + x; + const RDF = (x) => 'rdf:' + x; const revert = ToTest.__set__('$rdf', $rdf); ToTest.__set__('SHACL', SHACL); + ToTest.__set__('BASE', BASE); + ToTest.__set__('RDF', RDF); ToTest.__set__('globalPrefixHash', { 'ngsi-ld': 'ngsi-ld' }); const dumpPropertyShape = ToTest.__get__('dumpPropertyShape'); dumpPropertyShape(propertyShape, store); @@ -80,6 +84,7 @@ describe('Test dumpPropertyShape', function () { ['propertyNode', 'shacl:minCount', 1], ['propertyNode', 'shacl:maxCount', 2], ['propertyNode', 'shacl:nodeKind', 'shacl:BlankNode'], + ['propertyNode', 'rdf:type', 'base:Property'], ['propertyNode', 'shacl:path', 'path'], ['propertyNode', 'shacl:property', {}], [{}, 'shacl:path', 'ngsild:hasValue'], @@ -102,8 +107,12 @@ describe('Test dumpPropertyShape', function () { Namespace: () => (x) => 'ngsild:' + x }; const SHACL = (x) => 'shacl:' + x; + const BASE = (x) => 'base:' + x; + const RDF = (x) => 'rdf:' + x; const revert = ToTest.__set__('$rdf', $rdf); ToTest.__set__('SHACL', SHACL); + ToTest.__set__('BASE', BASE); + ToTest.__set__('RDF', RDF); ToTest.__set__('globalPrefixHash', { 'ngsi-ld': 'ngsi-ld' }); const dumpPropertyShape = ToTest.__get__('dumpPropertyShape'); dumpPropertyShape(propertyShape, store); @@ -111,6 +120,7 @@ describe('Test dumpPropertyShape', function () { ['propertyNode', 'shacl:minCount', 0], ['propertyNode', 'shacl:maxCount', 2], ['propertyNode', 'shacl:nodeKind', 'shacl:BlankNode'], + ['propertyNode', 'rdf:type', 'base:Property'], ['propertyNode', 'shacl:path', 'path'], ['propertyNode', 'shacl:property', {}], [{}, 'shacl:path', 'ngsild:hasValue'], @@ -122,7 +132,7 @@ describe('Test dumpPropertyShape', function () { revert(); }); it('Should dump relationship without constraints', function () { - const propertyShape = new ToTest.PropertyShape(1, 1, 'nodeKind', 'relationship', false); + const propertyShape = new ToTest.PropertyShape(1, 1, 'nodeKind', 'relationship', false, true); propertyShape.propertyNode = 'propertyNode'; const storeAdds = []; const store = { @@ -142,6 +152,7 @@ describe('Test dumpPropertyShape', function () { ['propertyNode', 'shacl:minCount', 1], ['propertyNode', 'shacl:maxCount', 1], ['propertyNode', 'shacl:nodeKind', 'shacl:BlankNode'], + ['propertyNode', 'rdf:type', 'base:SubComponentRelationship'], ['propertyNode', 'shacl:path', 'relationship'], ['propertyNode', 'shacl:property', {}], [{}, 'shacl:path', 'ngsild:hasObject'], @@ -313,7 +324,8 @@ describe('Test scanProperties', function () { params: [ 'Testing'] }], - isProperty: true + isProperty: true, + isSubComponent: false } ] }; @@ -327,6 +339,7 @@ describe('Test scanProperties', function () { properties: { hasFilter: { relationship: 'eclass:0173-1#01-ACK991#016', + relationship_type: 'subcomponent', $ref: 'https://industry-fusion.org/base-objects/v0.1/link' } } @@ -345,7 +358,8 @@ describe('Test scanProperties', function () { params: 'sym:eclass:0173-1#01-ACK991#016' } ], - isProperty: false + isProperty: false, + isSubComponent: true }] }; const nodeShape = new ToTest.NodeShape('targetClass'); @@ -389,7 +403,8 @@ describe('Test scanProperties', function () { ] } ], - isProperty: true + isProperty: true, + isSubComponent: false } ] }; diff --git a/semantic-model/dataservice/README.md b/semantic-model/dataservice/README.md index 11cd54ef..4f6c9a33 100644 --- a/semantic-model/dataservice/README.md +++ b/semantic-model/dataservice/README.md @@ -26,6 +26,7 @@ direction TB: `#colon;BoundMap` "1" -- "1" `rdfs#colon;Datatype` : #colon;bindsMapDatatype `#colon;Binding` "1" -- "1" `#colon;BoundMap` : #colon;bindsMap `#colon;Binding` "1" -- "1" `owl#colon;Thing` : #colon;bindsEntity + `#colon;Binding` "1" -- "1" `ngsi-ld#colon;AttributeType` : #colon;bindsAttributeType `#colon;Binding`: bindingVersion xsd#colon;string `#colon;Binding`: bindsContext xsd#colon;string `#colon;Binding`: bindsFirmware xsd#colon;string @@ -49,7 +50,8 @@ Example: ex:myBinding :bindsMap ex:map2 . ex:myBinding :bindingVersion "0.1" ex:myBinding :bindsFirmware "myFirmware" - ex:myBinding:bindsLogic "WHERE { BIND(?var1) as ?value}" + ex:myBinding :bindsLogic "WHERE { BIND(?var1) as ?value}" + ex:myBinding :bindsAttributeType ngsi-ld:Property :BoundMap A Bound Map contains a single map to define mapping from metrics to a model property. Several maps can be used to provide metrics for model properties. For instance it provides the rules to calculate the property ex:state with two maps: @@ -90,9 +92,9 @@ Start dataservice with `startDataservice.py`: *\* is supposed to be downloadable from a directory containing different *.ttl files, *\* is the (in the ontology context) namespaced class (e.g. `ex:MyClass` if `ex:` is defined in the ontologies context) and *\* is the name of a *.ttl file in the *bindings* subdirectory of the ontoloy. -Example: +Example (note `-d` for dry-run): - python3 ./startDataservice.py https://industryfusion.github.io/contexts/example/v0.1 iffBaseEntity:Cutter base_test.ttl + python3 startDataservice.py -d -e filter_and_cartridge_subcomponent_entities.ttl examples/ urn:iff:filter1 examples/bindings.ttl ## Example Setup diff --git a/semantic-model/dataservice/examples/bindings.ttl b/semantic-model/dataservice/examples/bindings.ttl index 9849f6b8..2b4b7bc2 100644 --- a/semantic-model/dataservice/examples/bindings.ttl +++ b/semantic-model/dataservice/examples/bindings.ttl @@ -7,8 +7,10 @@ @prefix rdfs: . @prefix binding: . @prefix entities: . +@prefix ngsi-ld: . @base . + [ rdf:type owl:Ontology ; owl:imports ] . @@ -37,6 +39,7 @@ iffb:wasteClass rdf:type owl:ObjectProperty . binding:binding_cartridge_wasteClass rdf:type owl:NamedIndividual , base:Binding ; base:bindsEntity ; + base:bindsAttributeType ngsi-ld:Property ; base:bindsMap binding:map_wasteclass ; base:bindingVersion "0.9" ; base:bindsFirmware "abc.1" ; @@ -55,6 +58,7 @@ binding:binding_cartridge_wasteClass rdf:type owl:NamedIndividual , binding:binding_filter_machineState rdf:type owl:NamedIndividual , base:Binding ; base:bindsEntity ; + base:bindsAttributeType ngsi-ld:Property ; base:bindsMap binding:map_machineState ; base:bindingVersion "0.9" ; base:bindsFirmware "abc.1" ; @@ -74,6 +78,7 @@ binding:binding_filter_machineState rdf:type owl:NamedIndividual , binding:binding_filter_strength rdf:type owl:NamedIndividual , base:Binding ; base:bindsEntity ; + base:bindsAttributeType ngsi-ld:Property ; base:bindsMap binding:map_strength ; base:bindingVersion "0.9" ; base:bindsFirmware "abc.1" . diff --git a/semantic-model/dataservice/external_services/opcuaConnector.py b/semantic-model/dataservice/external_services/opcuaConnector.py index 80bc9b66..71d9c1ad 100644 --- a/semantic-model/dataservice/external_services/opcuaConnector.py +++ b/semantic-model/dataservice/external_services/opcuaConnector.py @@ -28,12 +28,11 @@ asyncua_client = None print("The 'asyncua' library is not installed. Please install it separately to use this functionality.") - url = os.environ.get('OPCUA_TCP_CONNECT') or "opc.tcp://localhost:4840/" -async def update_namespace_parameter(client, connector_attribute_dict): - nodeid = connector_attribute_dict['connectorAttribute'] +async def get_node(client, map): + nodeid = map['connectorAttribute'] if 'nsu=' not in nodeid: return nodeid try: @@ -44,8 +43,11 @@ async def update_namespace_parameter(client, connector_attribute_dict): if ns_part is not None: namespace = ns_part.split('=')[1] nsidx = await client.get_namespace_index(namespace) + print(f"Retrieved namespace idx {nsidx}") nodeid = f'ns={nsidx};{i_part}' - return nodeid + print(f"Requesting {nodeid}") + var = client.get_node(nodeid) + return var ########################################################################################## @@ -53,18 +55,24 @@ async def update_namespace_parameter(client, connector_attribute_dict): # to read out data from machines or databases. # It will update the values in regular intervals ########################################################################################## -async def subscribe(connector_attribute_dict, firmware, sleeptime=5): +async def subscribe(map, firmware, sleeptime=5): if asyncua_client is None: raise ImportError("The 'asyncua' library is required for this function. Please install it separately.") async with asyncua_client(url=url) as client: - # first resolve explicit namespace when given - connector_attribute_dict['connectorAttribute'] = \ - await update_namespace_parameter(client, connector_attribute_dict) + try: + var = await get_node(client, map) + except: + print(f"Warning. Namespace or node in {map['connectorAttribute']} not found. Not providing values for \ +this attribute.") + return while True: - nodeset = connector_attribute_dict['connectorAttribute'] - var = client.get_node(nodeset) - value = await var.get_value() - print(f'In OPCUA Connector with parameters {nodeset} and value {value}') - connector_attribute_dict['value'] = Literal(value) - connector_attribute_dict['updated'] = True + print(f"Get value for {map['connectorAttribute']}") + try: + value = await var.get_value() + except: + print(f"Warning Could not retrieve data for nodeid {map['connectorAttribute']}.") + value = None + print(f"Value {value} received") + map['value'] = Literal(value) + map['updated'] = True await asyncio.sleep(sleeptime) diff --git a/semantic-model/dataservice/services/testConnector.py b/semantic-model/dataservice/services/testConnector.py index 365b909d..1bedb110 100644 --- a/semantic-model/dataservice/services/testConnector.py +++ b/semantic-model/dataservice/services/testConnector.py @@ -38,23 +38,22 @@ def split_params(param): # to read out data from machines or databases. # It will update the values in regular intervals ########################################################################################## -async def subscribe(connector_attribute_dict, firmware): +async def subscribe(map, firmware): while True: - logic_var_type = connector_attribute_dict['logicVarType'] + logic_var_type = map['logicVarType'] try: - connector_attr = connector_attribute_dict['connectorAttribute'] + connector_attr = map['connectorAttribute'] except: pass - if logic_var_type == XSD.boolean: - connector_attribute_dict['value'] = Literal(random.choice([True, False])) + map['value'] = Literal(random.choice([True, False])) elif logic_var_type == XSD.integer: lower, upper = split_params(connector_attr) - connector_attribute_dict['value'] = Literal(randint(lower, upper)) + map['value'] = Literal(randint(lower, upper)) elif logic_var_type == XSD.decimal or logic_var_type == XSD.float or logic_var_type == XSD.double: lower, upper = split_params(connector_attr) - connector_attribute_dict['value'] = Literal(float(randint(lower, upper)) / 100.0) - connector_attribute_dict['updated'] = True - connector_attribute_dict['firmware'] = firmware + map['value'] = Literal(float(randint(lower, upper)) / 100.0) + map['updated'] = True + map['firmware'] = firmware await asyncio.sleep(1) diff --git a/semantic-model/dataservice/startDataservice.py b/semantic-model/dataservice/startDataservice.py index dc8934e9..6cf1e37f 100644 --- a/semantic-model/dataservice/startDataservice.py +++ b/semantic-model/dataservice/startDataservice.py @@ -29,7 +29,7 @@ opcuaConnector = None get_maps_query = """ -SELECT ?map ?attribute ?connectorAttribute ?logicVar ?logicVarType ?connector ?firmwareVersion WHERE { +SELECT ?map ?binding ?attribute ?connectorAttribute ?logicVar ?logicVarType ?connector ?firmwareVersion WHERE { ?attribute base:boundBy ?binding . ?binding base:bindsEntity ?entityId . ?binding base:bindsMap ?map . @@ -39,25 +39,26 @@ ?map base:bindsConnector ?connector . ?map base:bindsMapDatatype ?logicVarType . } + """ get_attributes_query = """ -SELECT ?attribute ?attributeType ?entityId ?apiVersion ?firmwareVersion ?logic WHERE { +SELECT ?attribute ?binding ?attributeType ?entityId ?apiVersion ?firmwareVersion ?logic WHERE { ?attribute base:boundBy ?binding . ?binding base:bindsEntity ?entityId . ?binding base:bindsMap ?map . OPTIONAL {?binding base:bindsLogic ?logic . } . ?binding base:bindingVersion ?apiVersion . ?binding base:bindsFirmware ?firmwareVersion . - ?attribute rdfs:range ?attributeType . + ?binding base:bindsAttributeType ?attributeType . } """ def parse_args(args=sys.argv[1:]): parser = argparse.ArgumentParser(description='Start a Dataservice based on ontology and binding information.') - parser.add_argument('ontdir', - help='Directory containing the context.jsonld, entities.ttl, and knowledge.ttl files.') + parser.add_argument('ontdir', help='Directory containing the context.jsonld, entities.ttl, and knowledge.ttl \ +files.') parser.add_argument('entityId', help='ID of entity to start service for, e.g. urn:iff:cutter:1 .') parser.add_argument('binding', help='Resources which describe the contex binding to the type.') parser.add_argument('-r', '--resources', help='List of additional knowledge resources from the ontdir directory, \ @@ -67,8 +68,7 @@ def parse_args(args=sys.argv[1:]): parser.add_argument('-p', '--port', help='TCP port to forward data to device agent', default=7070, type=int) parser.add_argument('-e', '--entities', help='Name of the entities file', default='entities.ttl', type=str) parser.add_argument('-d', '--dryrun', help='Do not send data.', action='store_true') - parser.add_argument('-b', '--baseOntology', - help='Name of base ontology. Default: \ + parser.add_argument('-b', '--baseOntology', help='Name of base ontology. Default: \ "https://industryfusion.github.io/contexts/ontology/v0/base/"', default='https://industryfusion.github.io/contexts/ontology/v0/base/') parsed_args = parser.parse_args(args) @@ -81,10 +81,11 @@ def parse_args(args=sys.argv[1:]): query_prefixes = '' g = rdflib.Graph() supported_versions = ["0.1", "0.9"] +owl_bindings = {} -async def main(entityId, ontdir, entitiesfile, binding_name, entity_id, resources, - baseOntology, requestedFirmwareVersion, port, dryrun): +async def main(entityId, ontdir, entitiesfile, binding_name, entity_id, resources, baseOntology, + requestedFirmwareVersion, port, dryrun): global attributes global prefixes global query_prefixes @@ -150,22 +151,24 @@ async def main(entityId, ontdir, entitiesfile, binding_name, entity_id, resource apiVersion = row.apiVersion.toPython() firmwareVersion = row.firmwareVersion.toPython() entityId = row.entityId.toPython() - if attribute not in attributes.keys(): - attributes[attribute] = {} - if firmwareVersion not in attributes[attribute]: - attributes[attribute][firmwareVersion] = {} - current_attribute = attributes[attribute][firmwareVersion] - if 'maps' not in current_attribute.keys(): - current_attribute['maps'] = {} - current_attribute['apiVersion'] = apiVersion - current_attribute['attributeType'] = attributeType - current_attribute['logic'] = logic - current_attribute['entityId'] = entityId + binding = str(row.binding) + if binding not in owl_bindings.keys(): + owl_bindings[binding] = {} + if firmwareVersion not in owl_bindings[binding]: + owl_bindings[binding][firmwareVersion] = {} + current_binding = owl_bindings[binding][firmwareVersion] + if 'maps' not in current_binding.keys(): + current_binding['maps'] = {} + current_binding['apiVersion'] = apiVersion + current_binding['attributeType'] = attributeType + current_binding['logic'] = logic + current_binding['entityId'] = entityId + current_binding['attribute'] = attribute # Basic checks if apiVersion not in supported_versions: - print(f"Error: found binding API version {apiVersion} not in list of \ -supported API versions {supported_versions}") + print(f"Error: found binding API version {apiVersion} not in list of supported API versions \ +{supported_versions}") exit(1) # Add official Context to mapping query and try to find bindings @@ -179,41 +182,43 @@ async def main(entityId, ontdir, entitiesfile, binding_name, entity_id, resource tasks = [] for row in qres: attribute = row.attribute.toPython() + binding = str(row.binding) connectorAttribute = row.connectorAttribute.toPython() map = str(row.map) logicVar = row.logicVar.toPython() connector = row.connector.toPython() logicVarType = row.logicVarType firmwareVersion = row.firmwareVersion.toPython() - current_maps = attributes[attribute][firmwareVersion]['maps'] - if map not in current_maps: + current_maps = owl_bindings[binding][firmwareVersion]['maps'] + if map not in current_maps.keys(): current_maps[map] = {} current_maps[map]['logicVar'] = logicVar + current_maps[map]['updated'] = False current_maps[map]['connector'] = connector current_maps[map]['logicVarType'] = logicVarType current_maps[map]['connectorAttribute'] = connectorAttribute # Start a service for every Attribute - for attribute in attributes.keys(): + for binding in owl_bindings.keys(): firmwareVersion = None - print(f'Start dataservice for attribute {attribute}') # Determine exact attribute or look for legicographically maximum - if requestedFirmwareVersion in attributes[attribute].keys(): + if requestedFirmwareVersion in owl_bindings[binding].keys(): firmwareVersion = requestedFirmwareVersion else: - firmwareVersion = sorted(list(attributes[attribute].keys()))[0] - - attribute_dict = attributes[attribute][firmwareVersion]['maps'] - for map in attribute_dict: - print(f"Requesting map {map} from {connector}") - firmware_data = attributes[attribute][firmwareVersion] - maps = firmware_data['maps'][map] - connector = maps['connector'] + firmwareVersion = sorted(list(owl_bindings[binding].keys()))[0] + + attribute = owl_bindings[binding][firmwareVersion]['attribute'] + print(f'Start dataservice for attribute {attribute}') + binding_dict = owl_bindings[binding][firmwareVersion] + for map in binding_dict['maps'].keys(): + print(f"Requesting map {map} from {binding}") + maps = binding_dict['maps'] + connector = maps[map]['connector'] if connector == prefixes['base'].TestConnector.toPython(): - task = asyncio.create_task(testConnector.subscribe(maps, firmwareVersion)) + task = asyncio.create_task(testConnector.subscribe(maps[map], firmwareVersion)) tasks.append(task) - elif opcuaConnector is not None and connector == prefixes['base'].OPCUAConnector.toPython(): - task = asyncio.create_task(opcuaConnector.subscribe(maps, firmwareVersion)) + elif connector == prefixes['base'].OPCUAConnector.toPython(): + task = asyncio.create_task(opcuaConnector.subscribe(maps[map], firmwareVersion)) tasks.append(task) else: print(f"Error: No connector found for {connector}") @@ -222,7 +227,7 @@ async def main(entityId, ontdir, entitiesfile, binding_name, entity_id, resource attribute_trust_level = 1.0 if requestedFirmwareVersion != firmwareVersion: attribute_trust_level = 0.0 - task = asyncio.create_task(calculate_attribute(attribute, firmwareVersion, + task = asyncio.create_task(calculate_attribute(attribute, binding, firmwareVersion, attribute_trust_level, 5, port, dryrun)) tasks.append(task) try: @@ -253,21 +258,21 @@ async def attribute_service(attribute, firmwareVersion, r): exit(1) -async def calculate_attribute(attribute, firmwareVersion, attribute_trust_level, sleep, port, dryrun): +async def calculate_attribute(attribute, binding, firmwareVersion, attribute_trust_level, sleep, port, dryrun): # Bind retrieved values while True: - bindings = {} + querybindings = {} connector_attribute_trust_level = 1.0 - attribute_dict = attributes[attribute][firmwareVersion] - for map in attribute_dict['maps']: - logic_var = attribute_dict['maps'][map]['logicVar'] + binding_dict = owl_bindings[binding][firmwareVersion] + for map in binding_dict['maps']: + logic_var = binding_dict['maps'][map]['logicVar'] value = None try: - value = attribute_dict['maps'][map]['value'] + value = binding_dict['maps'][map]['value'] + binding_dict['maps'][map]['updated'] = False except: pass - attribute_dict['maps'][map]['updated'] = False - bindings[Variable(logic_var)] = value + querybindings[Variable(logic_var)] = value if value is None: connector_attribute_trust_level = 0.0 @@ -275,19 +280,19 @@ async def calculate_attribute(attribute, firmwareVersion, attribute_trust_level, overallTrust = min(attribute_trust_level, connector_attribute_trust_level) # Remove all (forbidden) pre-defined contexts - if attribute_dict['logic'] is not None: - query = 'SELECT ?type ?value ?object ?datasetId ?trustLevel ' + attribute_dict['logic'] + if binding_dict['logic'] is not None: + query = 'SELECT ?type ?value ?object ?datasetId ?trustLevel ' + binding_dict['logic'] query = re.sub(r'^PREFIX .*\n', '', query) - qres = g.query(query, initBindings=bindings, initNs=prefixes) + qres = g.query(query, initBindings=querybindings, initNs=prefixes) if len(qres) == 0: print("Warning: Could not derive any value binding from connector data.") return else: # if there is only one map, take this over directly - if len(attribute_dict['maps']) == 1: - map = next(iter(attribute_dict['maps'].values())) + if len(binding_dict['maps']) == 1: + map = next(iter(binding_dict['maps'].values())) if 'value' in map: - qres = [{'value': map['value'], 'type': URIRef(attribute_dict['attributeType'])}] + qres = [{'value': map['value'], 'type': map['logicVarType']}] else: qres = [] for row in qres: @@ -301,11 +306,13 @@ async def calculate_attribute(attribute, firmwareVersion, attribute_trust_level, results[datasetId] = {} if row.get('type') is not None: type = row.get('type') + results[datasetId]['type'] = row.get('type') else: - type = URIRef(attribute_dict['attributeType']) - results[datasetId]['type'] = type + overallTrust = 0.0 if row.get('value') is not None: results[datasetId]['value'] = row.get('value') + if type is None: + results[datasetId]['type'] = prefixes['ngsi-ld'].Property else: if type == prefixes['ngsi-ld'].Property: overallTrust = 0.0 @@ -323,12 +330,13 @@ async def calculate_attribute(attribute, firmwareVersion, attribute_trust_level, results[result]['trustLevel'] = min(overallTrust, results[result] ['trustLevel']) if len(results) > 0: - send(results, attribute, attribute_dict['entityId'], dryrun, port) + send(results, attribute, binding_dict['entityId'], dryrun, port) update_found = False while not update_found: await asyncio.sleep(0) - for map in attribute_dict['maps']: - update_found = attribute_dict['maps'][map]['updated'] or update_found + update_found = True + for map in binding_dict['maps']: + update_found = binding_dict['maps'][map]['updated'] and update_found def send(results, attribute, entityId, dryrun, port): @@ -336,7 +344,7 @@ def send(results, attribute, entityId, dryrun, port): for datasetId in results.keys(): result = results[datasetId] value = result['value'] - type = result.get('type') + type = result['type'] datasetId = result prefix = "Property" if type == prefixes['ngsi-ld'].Relationship: @@ -349,15 +357,11 @@ def send(results, attribute, entityId, dryrun, port): "v": "{value.toPython()}", "t": "{prefix}", "i": "{entityId}"}}') payloads = f'[{",".join(payload)}]' if not dryrun: - try: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket: - client_socket.connect(("127.0.0.1", port)) - client_socket.sendall(payloads.encode('ascii')) - print(f"sent {payloads}") - except Exception as e: - print(f'Warning: Error while sending data: {e}') - else: - print(f"Dryrun: sent {payloads}") + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client_socket.connect(("127.0.0.1", port)) + client_socket.sendall(payloads.encode('ascii')) + client_socket.close() + print(f"sent {payloads}") if __name__ == '__main__': diff --git a/semantic-model/dataservice/tests/ontdirs/testConnector/bindings.ttl b/semantic-model/dataservice/tests/ontdirs/testConnector/bindings.ttl new file mode 100644 index 00000000..b03269a9 --- /dev/null +++ b/semantic-model/dataservice/tests/ontdirs/testConnector/bindings.ttl @@ -0,0 +1,46 @@ +@prefix base: . +@prefix binding: . +@prefix entities: . + +entities:hasDifferentialPressure base:boundBy binding:binding_LRLLYKV8IG8PAIUP . + +entities:hasEnergyConsumption base:boundBy binding:binding_JKEXWUZG5YC9S3YG . + +entities:hasMotorTemperature base:boundBy binding:binding_RLZG83N97DJZMYTQ . + +binding:binding_JKEXWUZG5YC9S3YG a base:Binding ; + base:bindingVersion "0.1" ; + base:bindsEntity ; + base:bindsFirmware "firmware" ; + base:bindsMap binding:map_JKEXWUZG5YC9S3YG . + +binding:binding_LRLLYKV8IG8PAIUP a base:Binding ; + base:bindingVersion "0.1" ; + base:bindsEntity ; + base:bindsFirmware "firmware" ; + base:bindsMap binding:map_LRLLYKV8IG8PAIUP . + +binding:binding_RLZG83N97DJZMYTQ a base:Binding ; + base:bindingVersion "0.1" ; + base:bindsEntity ; + base:bindsFirmware "firmware" ; + base:bindsMap binding:map_RLZG83N97DJZMYTQ . + +binding:map_JKEXWUZG5YC9S3YG a base:BoundMap ; + base:bindsConnector base:OPCUAConnector ; + base:bindsConnectorParameter "nsu=http://yourorganisation.org/InstanceExample/;i=6017" ; + base:bindsLogicVar "var1" ; + base:bindsMapDatatype . + +binding:map_LRLLYKV8IG8PAIUP a base:BoundMap ; + base:bindsConnector base:OPCUAConnector ; + base:bindsConnectorParameter "nsu=http://yourorganisation.org/InstanceExample/;i=6117" ; + base:bindsLogicVar "var1" ; + base:bindsMapDatatype . + +binding:map_RLZG83N97DJZMYTQ a base:BoundMap ; + base:bindsConnector base:OPCUAConnector ; + base:bindsConnectorParameter "nsu=http://yourorganisation.org/InstanceExample/;i=6020" ; + base:bindsLogicVar "var1" ; + base:bindsMapDatatype . + diff --git a/semantic-model/dataservice/tests/server/binding_server.py b/semantic-model/dataservice/tests/server/binding_server.py new file mode 100644 index 00000000..cb2fb185 --- /dev/null +++ b/semantic-model/dataservice/tests/server/binding_server.py @@ -0,0 +1,177 @@ +import asyncio +import argparse +from asyncua import ua, Server +from rdflib import Graph, Namespace +from rdflib.namespace import RDF +import re +import sys +import random + +opcua_ns = Namespace('http://opcfoundation.org/UA/') + + +async def setup_opcua_server(mapping_data): + server = Server() + await server.init() + server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/") + + # Register base namespace + base_uri = "http://example.com/opcua" + base_idx = await server.register_namespace(base_uri) + + # Register additional namespaces from mapping data + namespaces = {} + for namespace_uri in set(data['namespace'] for data in mapping_data.values()): + idx = await server.register_namespace(namespace_uri) + namespaces[namespace_uri] = idx + print(f"Registration: Namespace {namespace_uri} with id {idx}.") + + # Create an OPC UA object node + objects = server.get_objects_node() + device = await objects.add_object(base_idx, "Device") + + # Add variables based on the mapping data + for nodeid, data in mapping_data.items(): + idx = namespaces.get(data['namespace'], base_idx) + if nodeid.startswith('i='): + numeric_id = int(nodeid[2:]) # Convert the "i=xxxx" part to an integer + else: + numeric_id = int(nodeid) # Handle cases where nodeid is already numeric + print(f"Provide nodeid {numeric_id} with datatype {data['datatype']} in namespace {data['namespace']} \ +with namespace idx {idx}") + node_id = ua.NodeId(numeric_id, idx) + node = await device.add_variable(node_id, f"Node_{numeric_id}", data['datatype']()) + await node.set_writable() + + # Set initial random value based on data type + if data['datatype'] == float: + value = random.uniform(0, 100) + elif data['datatype'] == bool: + value = random.choice([True, False]) + elif data['datatype'] == int: + value = random.randint(0, 100) + else: + value = "RandomString" + + await node.write_value(value) + + # Start the server + async with server: + print("OPC UA Server is running...") + while True: + await asyncio.sleep(1) + + +async def setup_opcua_server_backup(mapping_data): + server = Server() + await server.init() + server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/") + + # Register base namespace + base_uri = "http://example.com/opcua" + base_idx = await server.register_namespace(base_uri) + + # Register additional namespaces from mapping data + namespaces = {} + for namespace_uri in set(data['namespace'] for data in mapping_data.values()): + idx = await server.register_namespace(namespace_uri) + namespaces[namespace_uri] = idx + print(f"Registration: Namespace {namespace_uri} with id {idx}.") + + # Create an OPC UA object node + objects = server.get_objects_node() + device = await objects.add_object(base_idx, "Device") + + # Add variables based on the mapping data + for nodeid, data in mapping_data.items(): + print(f"Provide nodeid {nodeid} with datatype {data['datatype']} in namespace {data['namespace']}") + idx = namespaces.get(data['namespace'], base_idx) + node = await device.add_variable(idx, f"Node_{nodeid}", data['datatype']()) + await node.set_writable() + + # Start the server + async with server: + print("OPC UA Server is running...") + while True: + await asyncio.sleep(1) + + +def parse_rdf_to_mapping(rdf_file, base_ns, binding_ns=None, uaentity_ns=None): + g = Graph() + g.parse(rdf_file, format="turtle") + + # Define the base namespace for the vocabulary + BASE = Namespace(base_ns) + + # Check for binding and UA entity namespaces in RDF + found_binding_ns = g.namespace_manager.store.namespace("binding") + found_uaentity_ns = g.namespace_manager.store.namespace("uaentity") + + if not binding_ns and not found_binding_ns: + print("Error: Binding namespace not found in RDF data, and no binding namespace provided.") + sys.exit(1) + if not uaentity_ns and not found_uaentity_ns: + print("Error: UA entity namespace not found in RDF data, and no UA entity namespace provided.") + sys.exit(1) + + # Use the found namespaces if not provided + binding_ns = binding_ns or found_binding_ns + uaentity_ns = uaentity_ns or found_uaentity_ns + + nsu_pattern = re.compile(r'nsu=(.*?);i=(\d+)') + + mapping_data = {} + for s, p, o in g.triples((None, RDF.type, BASE.BoundMap)): + connector_attribute = g.value(s, BASE.bindsConnectorAttribute) + datatype_uri = g.value(s, BASE.bindsMapDatatype) + + if connector_attribute and datatype_uri: + # Parse namespace and identifier from connector_attribute + match = nsu_pattern.match(str(connector_attribute)) + if match: + namespace_uri = match.group(1) + node_id = f"i={match.group(2)}" + else: + namespace_uri = None + node_id = str(connector_attribute) + + # Translate RDF Datatype to Python Type + if datatype_uri == opcua_ns.Double: + datatype = float + elif datatype_uri == opcua_ns.Boolean: + datatype = bool + elif datatype_uri == opcua_ns.String: + datatype = str + elif datatype_uri == opcua_ns.LocalizedText: + datatype = str + else: + print(f"Warning, could not determine python type for {datatype_uri}. Using default: str.") + datatype = str # Default to string if not recognized + + mapping_data[node_id] = { + 'namespace': namespace_uri, + 'datatype': datatype + } + + return mapping_data + + +async def main(rdf_file, base_ns, binding_ns=None, uaentity_ns=None): + # Parse the RDF to extract the mapping + mapping_data = parse_rdf_to_mapping(rdf_file, base_ns, binding_ns, uaentity_ns) + + # Setup OPC UA server based on extracted mapping + await setup_opcua_server(mapping_data) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Start an OPC UA server based on an RDF binding description.") + parser.add_argument("rdf_file", type=str, help="Path to the bindings.ttl RDF file") + parser.add_argument("--base-ns", type=str, default="https://industryfusion.github.io/contexts/ontology/v0/base/", + help="Base namespace for the vocabulary (default: \ +https://industryfusion.github.io/contexts/ontology/v0/base/)") + parser.add_argument("--binding-ns", type=str, help="Optional: Binding namespace") + parser.add_argument("--uaentity-ns", type=str, help="Optional: UA entity namespace") + + args = parser.parse_args() + + asyncio.run(main(args.rdf_file, args.base_ns, args.binding_ns, args.uaentity_ns)) diff --git a/semantic-model/dataservice/validation/bindings-validation-shacl.ttl b/semantic-model/dataservice/validation/bindings-validation-shacl.ttl index c9b1d54a..8a760339 100644 --- a/semantic-model/dataservice/validation/bindings-validation-shacl.ttl +++ b/semantic-model/dataservice/validation/bindings-validation-shacl.ttl @@ -3,6 +3,7 @@ @prefix ns1: . @prefix owl: . @prefix sh: . +@prefix ngsi-ld: . ex:ns1_Binding a sh:NodeShape ; sh:nodeKind sh:BlankNodeOrIRI ; @@ -10,6 +11,7 @@ ex:ns1_Binding a sh:NodeShape ; ex:ns1_bindsEntity, ex:ns1_bindsFirmware, ex:ns1_bindsLogic, + ex:ns1_bindsAttributeType, ex:ns1_bindsMap ; sh:targetClass ns1:Binding . @@ -77,6 +79,13 @@ ex:ns1_bindsMapDatatype a sh:PropertyShape ; sh:minCount 1 ; sh:maxCount 1 . +ex:ns1_bindsAttributeType a sh:PropertyShape ; + sh:nodeKind sh:IRI ; + sh:path ns1:bindsAttributeType ; + sh:in (ngsi-ld:Property ngsi-ld:Relationship); + sh:minCount 1 ; + sh:maxCount 1 . + ex:ns1_allbound a sh:NodeShape ; sh:targetClass ns1:Binding ; sh:property [ @@ -103,7 +112,7 @@ ex:BindingShape $this ns1:bindsMap ?map . ?map a ns1:BoundMap ; ns1:bindsLogicVar ?var . - FILTER(!CONTAINS(?logic, CONCAT('?', ?var, 'x '))) + FILTER(!CONTAINS(?logic, CONCAT('?', ?var, ' '))) } """ ; ] . diff --git a/semantic-model/opcua/.coveragerc b/semantic-model/opcua/.coveragerc new file mode 100644 index 00000000..36d13d80 --- /dev/null +++ b/semantic-model/opcua/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = extractType.py,nodeset2owl.py \ No newline at end of file diff --git a/semantic-model/opcua/Makefile b/semantic-model/opcua/Makefile index 16e479f6..919ed9f3 100644 --- a/semantic-model/opcua/Makefile +++ b/semantic-model/opcua/Makefile @@ -19,7 +19,7 @@ LINTER := python3 -m flake8 PIP := pip HELM_DIR := ../../helm/charts/shacl NAMESPACE := iff -TOLINT := nodeset2owl.py lib/nodesetparser.py lib/utils.py +TOLINT := nodeset2owl.py extractType.py lib/nodesetparser.py lib/utils.py lib/shacl.py lib/entity.py lib/jsonld.py lib/bindings.py PYTEST := python3 -m pytest @@ -33,5 +33,6 @@ setup-dev: requirements-dev.txt $(PIP) install -r requirements-dev.txt test: - ${PYTEST} tests - (cd tests/nodeset2owl; bash ./test.bash) \ No newline at end of file + ${PYTEST} tests --cov . --cov-fail-under=80 + (cd tests/nodeset2owl; bash ./test.bash) + (cd tests/extractType; bash ./test.bash) \ No newline at end of file diff --git a/semantic-model/opcua/README.md b/semantic-model/opcua/README.md index f0f31422..dec233b1 100644 --- a/semantic-model/opcua/README.md +++ b/semantic-model/opcua/README.md @@ -69,5 +69,49 @@ create pumpexample.ttl: ## extractType.py -Coming soon - \ No newline at end of file +Create SHACL, entities.ttl, json-ld and bindings.ttl from an OPCUA instance model. + +```console +usage: extractType.py [-h] -t TYPE [-j JSONLD] [-e ENTITIES] [-s SHACL] [-k KNOWLEDGE] [-b BINDINGS] [-c CONTEXT] [-d] [-m] -n NAMESPACE [-i ID] [-xe ENTITY_NAMESPACE] [-xc CONTEXT_URL] [-xp ENTITY_PREFIX] instance + +parse nodeset instance and create ngsi-ld model + +positional arguments: + instance Path to the instance nodeset2 file. + +optional arguments: + -h, --help show this help message and exit + -t TYPE, --type TYPE Type of root object, e.g. http://opcfoundation.org/UA/Pumps/ + -j JSONLD, --jsonld JSONLD + Filename of jsonld output file + -e ENTITIES, --entities ENTITIES + Filename of entities output file + -s SHACL, --shacl SHACL + Filename of SHACL output file + -k KNOWLEDGE, --knowledge KNOWLEDGE + Filename of SHACL output file + -b BINDINGS, --bindings BINDINGS + Filename of bindings output file + -c CONTEXT, --context CONTEXT + Filename of JSONLD context output file + -d, --debug Add additional debug info to structure (e.g. for better SHACL debug) + -m, --minimalshacl Remove all not monitored/updated shacl nodes + -n NAMESPACE, --namespace NAMESPACE + Namespace prefix for entities, SHACL and JSON-LD + -i ID, --id ID ID prefix of object. The ID for every object is generated by "urn::nodeId" + -xe ENTITY_NAMESPACE, --entity-namespace ENTITY_NAMESPACE + Overwrite Namespace for entities (which is otherwise derived from /entity) + -xc CONTEXT_URL, --context-url CONTEXT_URL + Context URL + -xp ENTITY_PREFIX, --entity-prefix ENTITY_PREFIX + prefix in context for entities +``` + +Extract ngsi-ld prototype: + + python3 ./extractType.py -t http://opcfoundation.org/UA/Pumps/PumpType -n http://yourorganisation.org/InstanceExample/ pumpexample.ttl + + +Check the SHACL compliance: + + pyshacl -df json-ld entities.jsonld -s shacl.ttl -e knowledge.ttl \ No newline at end of file diff --git a/semantic-model/opcua/extractType.py b/semantic-model/opcua/extractType.py new file mode 100644 index 00000000..b74e4f43 --- /dev/null +++ b/semantic-model/opcua/extractType.py @@ -0,0 +1,529 @@ +# +# Copyright (c) 2024 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import sys +import urllib +from rdflib import Graph, Namespace, URIRef +from rdflib.namespace import OWL, RDF, SH +import argparse +import lib.utils as utils +from lib.utils import RdfUtils +from lib.bindings import Bindings +from lib.jsonld import JsonLd +from lib.entity import Entity +from lib.shacl import Shacl + + +query_namespaces = """ +PREFIX rdfs: +PREFIX rdf: +SELECT ?uri ?prefix ?ns WHERE { + ?ns rdf:type base:Namespace . + ?ns base:hasUri ?uri . + ?ns base:hasPrefix ?prefix . +} +""" + +query_subclasses = """ +PREFIX rdfs: +PREFIX owl: + +CONSTRUCT { + ?subclass rdfs:subClassOf ?superclass . + ?subclass a owl:Class . + ?superclass a owl:Class . +} +WHERE { + ?subclass rdfs:subClassOf* . + ?subclass rdfs:subClassOf ?superclass . + + # Ensure both subclasses and superclasses are marked as owl:Class + { + ?subclass a owl:Class . + } UNION { + ?superclass a owl:Class . + } +} +""" + + +randnamelength = 16 +modelling_nodeid_optional = 80 +modelling_nodeid_mandatory = 78 +modelling_nodeid_optional_array = 11508 +entity_ontology_prefix = 'uaentity' +basic_types = [ + 'String', + 'Boolean', + 'Byte', + 'SByte', + 'Int16', + 'UInt16', + 'Int32', + 'UInt32', + 'Uin64', + 'Int64', + 'Float', + 'DateTime', + 'Guid', + 'ByteString', + 'Double' +] +workaround_instances = ['http://opcfoundation.org/UA/DI/FunctionalGroupType', 'http://opcfoundation.org/UA/FolderType'] +datasetid_urn = 'urn:iff:datasetId' + + +def parse_args(args=sys.argv[1:]): + parser = argparse.ArgumentParser(description='\ +parse nodeset instance and create ngsi-ld model') + + parser.add_argument('instance', help='Path to the instance nodeset2 file.') + parser.add_argument('-t', '--type', + help='Type of root object, e.g. http://opcfoundation.org/UA/Pumps/', + required=True) + parser.add_argument('-j', '--jsonld', + help='Filename of jsonld output file', + required=False, + default='instances.jsonld') + parser.add_argument('-e', '--entities', + help='Filename of entities output file', + required=False, + default='entities.ttl') + parser.add_argument('-s', '--shacl', + help='Filename of SHACL output file', + required=False, + default='shacl.ttl') + parser.add_argument('-b', '--bindings', + help='Filename of bindings output file', + required=False, + default='bindings.ttl') + parser.add_argument('-c', '--context', + help='Filename of JSONLD context output file', + required=False, + default='context.jsonld') + parser.add_argument('-d', '--debug', + help='Add additional debug info to structure (e.g. for better SHACL debug)', + required=False, + action='store_true') + parser.add_argument('-m', '--minimalshacl', + help='Remove all not monitored/updated shacl nodes', + required=False, + action='store_true') + parser.add_argument('-n', '--namespace', help='Namespace prefix for entities, SHACL and JSON-LD', required=True) + parser.add_argument('-i', '--id', + help='ID prefix of object. The ID for every object is generated by "urn::nodeId"', + required=False, + default="testid") + parser.add_argument('-xe', '--entity-namespace', + help='Overwrite Namespace for entities (which is otherwise derived from /entity)', + required=False) + parser.add_argument('-xc', '--context-url', help='Context URL', + default="https://industryfusion.github.io/contexts/staging/opcua/v0.1/context.jsonld", + required=False) + parser.add_argument('-xp', '--entity-prefix', + help='prefix in context for entities', + default="uaentity", + required=False) + parsed_args = parser.parse_args(args) + return parsed_args + + +basens = None # Will be defined by the imported ontologies +opcuans = None # dito +ngsildns = Namespace('https://uri.etsi.org/ngsi-ld/') + + +def check_object_consistency(instancetype, attribute_path, classtype): + needed_superclass = None + property = shaclg._get_property(instancetype, attribute_path) + if property is None: + e.add_instancetype(instancetype, attribute_path) + e.add_type(classtype) + return False, None + shclass = shaclg._get_shclass_from_property(property) + if shclass != classtype: + print(f"Warning: Potential inconsistency: {instancetype} => {attribute_path} => \ +{shclass} vs {instancetype} => {attribute_path} => {classtype}.") + common_superclass = utils.get_common_supertype(g, shclass, classtype) + print(f"Warning: Replacing both classes by common supertype {common_superclass}. This is typcially an \ +artefact of using FolderType and \ +FunctionalGroupTypes in many places but having same attribute name with different types. TODO: Check whether \ +{classtype} or {shclass} SHAPES can be removed.") + shaclg.update_shclass_in_property(property, common_superclass) + if common_superclass != classtype and common_superclass != shclass: + print(f"Warning: common_superclass is neither of {classtype} and {shclass}. This is not yet implemented.") + needed_superclass = common_superclass + return True, needed_superclass + + +def check_variable_consistency(instancetype, attribute_path, classtype): + if shaclg.attribute_is_indomain(instancetype, attribute_path): + return True + e.add_instancetype(instancetype, attribute_path) + e.add_type(classtype) + return False + + +def scan_type(node, instancetype): + + generic_references = rdfutils.get_generic_references(g, node) + # Loop through all supertypes + supertypes = rdfutils.get_all_supertypes(g, instancetype, node) + + # Loop through all components + shapename = shaclg.create_shacl_type(instancetype) + has_components = False + for (curtype, curnode) in supertypes: + components = g.triples((curnode, basens['hasComponent'], None)) + for (_, _, o) in components: + has_components = scan_type_recursive(o, curnode, instancetype, shapename) or has_components + addins = g.triples((curnode, basens['hasAddIn'], None)) + for (_, _, o) in addins: + has_components = scan_type_recursive(o, curnode, instancetype, shapename) or has_components + organizes = g.triples((curnode, basens['organizes'], None)) + for (_, _, o) in organizes: + scan_type_nonrecursive(o, curnode, instancetype, shapename) + has_components = True + for generic_reference, o in generic_references: + if generic_reference not in ignored_references: + has_components = scan_type_nonrecursive(o, curnode, instancetype, shapename, + generic_reference) or has_components + return has_components + + +def scan_type_recursive(o, node, instancetype, shapename): + has_components = False + shacl_rule = {} + browse_name = next(g.objects(o, basens['hasBrowseName'])) + nodeclass, classtype = rdfutils.get_type(g, o) + if nodeclass == opcuans['MethodNodeClass']: + return False + + # If defnition is self referential, stop recursion + if str(instancetype) == str(classtype): + return False + + attributename = urllib.parse.quote(f'has{browse_name}') + rdfutils.get_modelling_rule(g, o, shacl_rule, instancetype) + + decoded_attributename = urllib.parse.unquote(attributename) + if utils.contains_both_angle_brackets(decoded_attributename): + decoded_attributename = utils.normalize_angle_bracket_name(decoded_attributename) + attributename = urllib.parse.quote(decoded_attributename) + if attributename == 'has': # full template, ignore it + return False + shacl_rule['path'] = entity_namespace[attributename] + + if rdfutils.isObjectNodeClass(nodeclass): + stop_scan, _ = check_object_consistency(instancetype, entity_namespace[attributename], classtype) + if stop_scan: + return True + shacl_rule['is_property'] = False + _, use_instance_declaration = rdfutils.get_modelling_rule(g, o, None, instancetype) + if use_instance_declaration: + # This information mixes two details + # 1. Use the instance declaration and not the object for instantiation + # 2. It could be zero or more instances (i.e. and array) + shacl_rule['array'] = True + _, typeiri = rdfutils.get_type(g, o) + try: + typenode = next(g.subjects(basens['definesType'], typeiri)) + o = typenode + except: + pass + components_found = scan_type(o, classtype) + if components_found: + has_components = True + shacl_rule['contentclass'] = classtype + shaclg.create_shacl_property(shapename, shacl_rule['path'], shacl_rule['optional'], shacl_rule['array'], + False, True, shacl_rule['contentclass'], None, is_subcomponent=True) + elif rdfutils.isVariableNodeClass(nodeclass): + stop_scan = check_variable_consistency(instancetype, entity_namespace[attributename], classtype) + if stop_scan: + return True + has_components = True + try: + isAbstract = next(g.objects(classtype, basens['isAbstract'])) + except: + isAbstract = False + if isAbstract: + return False + shacl_rule['is_property'] = True + shaclg.get_shacl_iri_and_contentclass(g, o, shacl_rule) + shaclg.create_shacl_property(shapename, shacl_rule['path'], shacl_rule['optional'], shacl_rule['array'], + True, shacl_rule['is_iri'], shacl_rule['contentclass'], shacl_rule['datatype']) + e.add_enum_class(g, shacl_rule['contentclass']) + return has_components + + +def scan_type_nonrecursive(o, node, instancetype, shapename, generic_reference=None): + shacl_rule = {} + browse_name = next(g.objects(o, basens['hasBrowseName'])) + nodeclass, classtype = rdfutils.get_type(g, o) + attributename = urllib.parse.quote(f'has{browse_name}') + + full_attribute_name = entity_namespace[attributename] + if generic_reference is not None: + full_attribute_name = generic_reference + shacl_rule['path'] = full_attribute_name + if shaclg.attribute_is_indomain(instancetype, full_attribute_name): + return False + rdfutils.get_modelling_rule(g, node, shacl_rule, instancetype) + e.add_instancetype(instancetype, full_attribute_name) + e.add_type(classtype) + + if rdfutils.isObjectNodeClass(nodeclass) or rdfutils.isObjectTypeNodeClass(nodeclass): + shacl_rule['is_property'] = False + shacl_rule['contentclass'] = classtype + shaclg.create_shacl_property(shapename, shacl_rule['path'], shacl_rule['optional'], False, False, + True, shacl_rule['contentclass'], None) + elif rdfutils.isVariableNodeClass(nodeclass): + print(f"Warning: Variable node {o} is target of non-owning reference {full_attribute_name}. \ +This will be ignored.") + return + + +def scan_entity(node, instancetype, id, optional=False): + generic_references = rdfutils.get_generic_references(g, node) + node_id = jsonld.generate_node_id(g, rootentity, node, id) + instance = {} + instance['type'] = instancetype + instance['id'] = node_id + instance['@context'] = [ + context_url + ] + + # Loop through all components + has_components = False + components = g.triples((node, basens['hasComponent'], None)) + for (_, _, o) in components: + has_components = scan_entitiy_recursive(node, id, instance, node_id, o) or has_components + addins = g.triples((node, basens['hasAddIn'], None)) + for (_, _, o) in addins: + has_components = scan_entitiy_recursive(node, id, instance, node_id, o) or has_components + organizes = g.triples((node, basens['organizes'], None)) + for (_, _, o) in organizes: + has_components = scan_entitiy_nonrecursive(node, id, instance, node_id, o) or has_components + for generic_reference, o in generic_references: + if generic_reference not in ignored_references: + has_components = scan_entitiy_nonrecursive(node, id, instance, node_id, o, + generic_reference) or has_components + if has_components or not optional: + jsonld.add_instance(instance) + return node_id + else: + return None + + +def scan_entitiy_recursive(node, id, instance, node_id, o): + has_components = False + shacl_rule = {} + browse_name = next(g.objects(o, basens['hasBrowseName'])) + nodeclass, classtype = rdfutils.get_type(g, o) + attributename = urllib.parse.quote(f'has{browse_name}') + + decoded_attributename = utils.normalize_angle_bracket_name(urllib.parse.unquote(attributename)) + optional, array = shaclg.get_modelling_rule(entity_namespace[decoded_attributename], URIRef(instance['type'])) + shacl_rule['optional'] = optional + shacl_rule['array'] = array + datasetId = None + try: + is_placeholder = shaclg.is_placeholder(URIRef(instance['type']), entity_namespace[decoded_attributename]) + except: + is_placeholder = False + if is_placeholder: + datasetId = f'{datasetid_urn}:{attributename}' + attributename = urllib.parse.quote(decoded_attributename) + shacl_rule['path'] = entity_namespace[attributename] + + if rdfutils.isObjectNodeClass(nodeclass): + shacl_rule['is_property'] = False + relid = scan_entity(o, classtype, id, shacl_rule['optional']) + if relid is not None: + has_components = True + instance[f'{entity_ontology_prefix}:{attributename}'] = { + 'type': 'Relationship', + 'object': relid + } + if is_placeholder and datasetId is not None: + instance[f'{entity_ontology_prefix}:{attributename}']['datasetId'] = datasetId + if debug: + instance[f'{entity_ontology_prefix}:{attributename}']['debug'] = \ + f'{entity_ontology_prefix}:{attributename}' + shacl_rule['contentclass'] = classtype + if not shacl_rule['optional']: + has_components = True + shacl_rule['contentclass'] = classtype + elif rdfutils.isVariableNodeClass(nodeclass): + shacl_rule['is_property'] = True + shaclg.get_shacl_iri_and_contentclass(g, o, shacl_rule) + try: + value = next(g.objects(o, basens['hasValue'])) + if not shacl_rule['is_iri']: + value = value.toPython() + else: + value = e.get_contentclass(shacl_rule['contentclass'], value) + + value = value.toPython() + except StopIteration: + if not shacl_rule['is_iri']: + value = utils.get_default_value(shacl_rule['datatype']) + else: + value = e.get_default_contentclass(shacl_rule['contentclass']) + has_components = True + if not shacl_rule['is_iri']: + instance[f'{entity_ontology_prefix}:{attributename}'] = { + 'type': 'Property', + 'value': value + } + else: + instance[f'{entity_ontology_prefix}:{attributename}'] = { + 'type': 'Property', + 'value': { + '@id': str(value) + } + } + if debug: + instance[f'{entity_ontology_prefix}:{attributename}']['debug'] = f'{entity_ontology_prefix}:{attributename}' + try: + is_updating = bool(next(g.objects(o, basens['isUpdating']))) + except: + is_updating = False + if is_updating or not minimal_shacl: + bindingsg.create_binding(g, URIRef(node_id), o, entity_namespace[attributename]) + return has_components + + +def scan_entitiy_nonrecursive(node, id, instance, node_id, o, generic_reference=None): + has_components = False + shacl_rule = {} + browse_name = next(g.objects(o, basens['hasBrowseName'])) + nodeclass, classtype = rdfutils.get_type(g, o) + attributename = urllib.parse.quote(f'has{browse_name}') + shacl_rule['path'] = entity_namespace[attributename] + full_attribute_name = f'{entity_ontology_prefix}:{attributename}' + if generic_reference is not None: + full_attribute_name = g.qname(generic_reference) + if rdfutils.isObjectNodeClass(nodeclass): + shacl_rule['is_property'] = False + relid = jsonld.generate_node_id(g, rootentity, o, id) + if relid is not None: + has_components = True + instance[full_attribute_name] = { + 'type': 'Relationship', + 'object': relid + } + if debug: + instance[full_attribute_name]['debug'] = full_attribute_name + shacl_rule['contentclass'] = classtype + elif rdfutils.isVariableNodeClass(nodeclass): + print(f"Warning: Variable node {o} is target of non-owning reference {full_attribute_name}. \ +This will be ignored.") + return has_components + + +if __name__ == '__main__': + + args = parse_args() + instancename = args.instance + rootinstancetype = args.type + jsonldname = args.jsonld + entitiesname = args.entities + shaclname = args.shacl + bindingsname = args.bindings + contextname = args.context + debug = args.debug + namespace_prefix = args.namespace + entity_id = args.id + minimal_shacl = args.minimalshacl + context_url = args.context_url + entity_namespace = args.entity_namespace + entity_prefix = args.entity_prefix + + entity_namespace = Namespace(f'{namespace_prefix}entity/') if entity_namespace is None else entity_namespace + shacl_namespace = Namespace(f'{namespace_prefix}shacl/') + binding_namespace = Namespace(f'{namespace_prefix}bindings/') + entity_ontology_prefix = entity_prefix + g = Graph(store='Oxigraph') + g.parse(instancename) + # get all owl imports + mainontology = next(g.subjects(RDF.type, OWL.Ontology)) + imports = g.objects(mainontology, OWL.imports) + for imprt in imports: + h = Graph(store="Oxigraph") + print(f'Importing ontology {imprt}') + h.parse(imprt) + g += h + for k, v in list(h.namespaces()): + g.bind(k, v) + + types = [] + basens = next(Namespace(uri) for prefix, uri in list(g.namespaces()) if prefix == 'base') + opcuans = next(Namespace(uri) for prefix, uri in list(g.namespaces()) if prefix == 'opcua') + bindingsg = Bindings(namespace_prefix, basens) + bindingsg.bind(f'{entity_ontology_prefix}', entity_namespace) + bindingsg.bind('base', basens) + bindingsg.bind('binding', binding_namespace) + shaclg = Shacl(namespace_prefix, basens, opcuans) + shaclg.bind('shacl', shacl_namespace) + shaclg.bind('ngsi-ld', ngsildns) + shaclg.bind('sh', SH) + shaclg.bind('base', basens) + e = Entity(namespace_prefix, basens, opcuans) + e.bind('base', basens) + e.bind(f'{entity_ontology_prefix}', entity_namespace) + e.bind('ngsi-ld', ngsildns) + rdfutils = RdfUtils(basens, opcuans) + e.create_ontolgoy_header(entity_namespace) + for k, v in list(g.namespaces()): + e.bind(k, v) + shaclg.bind(k, v) + + jsonld = JsonLd(basens, opcuans) + result = g.query(query_namespaces, initNs={'base': basens, 'opcua': opcuans}) + for uri, prefix, _ in result: + e.bind(prefix, Namespace(uri)) + ignored_references = rdfutils.get_ignored_references(g) + + # First scan the templates to create the rules + try: + root = next(g.subjects(basens['definesType'], URIRef(rootinstancetype))) + except: + print(f"Error: root-instance with type {rootinstancetype} not found. Please review the type parameter.") + exit(1) + scan_type(root, rootinstancetype) + # Then scan the entity with the real values + rootentity = next(g.subjects(RDF.type, URIRef(rootinstancetype))) + scan_entity(rootentity, rootinstancetype, entity_id) + # Add types to entities + for type in types: + e.add_subclass(type) + jsonld.serialize(jsonldname) + # Add all subclassing to entities + if entitiesname is not None: + result = g.query(query_subclasses) + e.add_subclasses(result) + e.serialize(destination=entitiesname) + if shaclname is not None: + shaclg.serialize(destination=shaclname) + entities_ns = utils.extract_namespaces(e.get_graph()) + shacl_ns = utils.extract_namespaces(shaclg.get_graph()) + combined_namespaces = {**entities_ns, **shacl_ns} + final_namespaces = {} + for key, value in combined_namespaces.items(): + final_namespaces[key] = value + jsonld.dump_context(contextname, final_namespaces) + if bindingsg.len() > 0: + bindingsg.serialize(destination=bindingsname) diff --git a/semantic-model/opcua/lib/bindings.py b/semantic-model/opcua/lib/bindings.py new file mode 100644 index 00000000..a797d307 --- /dev/null +++ b/semantic-model/opcua/lib/bindings.py @@ -0,0 +1,64 @@ +# +# Copyright (c) 2024 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import random +import string +from rdflib import Graph, Namespace, Literal +from rdflib.namespace import RDF +import lib.utils as utils + +randnamelength = 16 + + +class Bindings: + def __init__(self, namespace_prefix, basens): + self.bindingsg = Graph() + self.basens = basens + self.binding_namespace = Namespace(f'{namespace_prefix}bindings/') + self.bindingsg.bind('binding', self.binding_namespace) + + def create_binding(self, g, parent_node_id, var_node, attribute_iri, version='0.1', firmware='firmware'): + randname = ''.join(random.choices(string.ascii_uppercase + string.digits, k=randnamelength)) + bindingiri = self.binding_namespace['binding_' + randname] + mapiri = self.binding_namespace['map_' + randname] + dtype = next(g.objects(var_node, self.basens['hasDatatype'])) + node_id = next(g.objects(var_node, self.basens['hasNodeId'])) + idtype = next(g.objects(var_node, self.basens['hasIdentifierType'])) + ns = next(g.objects(var_node, self.basens['hasNamespace'])) + nsuri = next(g.objects(ns, self.basens['hasUri'])) + self.bindingsg.add((bindingiri, RDF['type'], self.basens['Binding'])) + self.bindingsg.add((bindingiri, self.basens['bindsEntity'], parent_node_id)) + self.bindingsg.add((bindingiri, self.basens['bindingVersion'], Literal(version))) + self.bindingsg.add((bindingiri, self.basens['bindsFirmware'], Literal(firmware))) + self.bindingsg.add((bindingiri, self.basens['bindsMap'], mapiri)) + self.bindingsg.add((bindingiri, self.basens['bindsAttributeType'], utils.NGSILD['Property'])) + self.bindingsg.add((attribute_iri, self.basens['boundBy'], bindingiri)) + self.bindingsg.add((mapiri, RDF['type'], self.basens['BoundMap'])) + self.bindingsg.add((mapiri, self.basens['bindsConnector'], self.basens['OPCUAConnector'])) + self.bindingsg.add((mapiri, self.basens['bindsMapDatatype'], dtype)) + self.bindingsg.add((mapiri, self.basens['bindsLogicVar'], Literal('var1'))) + self.bindingsg.add((mapiri, + self.basens['bindsConnectorAttribute'], + Literal(f'nsu={nsuri};{utils.idtype2String(idtype, self.basens)}={node_id}'))) + + def bind(self, prefix, namespace): + self.bindingsg.bind(prefix, namespace) + + def len(self): + return len(self.bindingsg) + + def serialize(self, destination): + self.bindingsg.serialize(destination) diff --git a/semantic-model/opcua/lib/entity.py b/semantic-model/opcua/lib/entity.py new file mode 100644 index 00000000..ea549400 --- /dev/null +++ b/semantic-model/opcua/lib/entity.py @@ -0,0 +1,193 @@ +# +# Copyright (c) 2024 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from rdflib import Graph, Namespace, Literal, URIRef +from rdflib.namespace import OWL, RDF, RDFS + +ngsildns = Namespace('https://uri.etsi.org/ngsi-ld/') + +query_enumclass = """ +PREFIX owl: +PREFIX rdfs: +PREFIX rdf: + +CONSTRUCT { ?s ?p ?o . + ?c ?classpred ?classobj . + ?o2 base:hasEnumValue ?value . + ?o2 base:hasValueClass ?class . +} +WHERE + { + ?s ?p ?o . + ?s rdf:type ?c . + ?c ?classpred ?classobj . + ?s ?p2 ?o2 . + ?o2 a base:ValueNode . + ?o2 base:hasEnumValue ?value . + ?o2 base:hasValueClass ?class . +} +""" + +query_instance = """ +PREFIX owl: +PREFIX rdfs: +PREFIX rdf: +SELECT ?instance WHERE { + ?instance a ?c . + ?instance base:hasValueNode ?valueNode . + ?valueNode base:hasEnumValue ?value . +} +""" + +query_default_instance = """ +PREFIX owl: +PREFIX rdfs: +PREFIX rdf: +SELECT ?instance WHERE { + ?instance a ?c . + ?instance base:hasValueNode ?valueNode . + ?valueNode base:hasEnumValue ?value . +} order by ?value limit 1 +""" + + +class Entity: + def __init__(self, namespace_prefix, basens, opcuans): + self.e = Graph() + self.basens = basens + self.opcuans = opcuans + self.entity_namespace = Namespace(f'{namespace_prefix}entity/') + self.e.bind('uaentity', self.entity_namespace) + self.ngsildns = Namespace('https://uri.etsi.org/ngsi-ld/') + self.e.bind('ngsi-ld', self.ngsildns) + self.types = [] + + # def scan_type(self, g, node, instancetype): + # # Implementation of the scan_type logic + # pass + + # def scan_entity(self, g, node, instancetype, id, optional=False): + # # Implementation of the scan_entity logic + # pass + + # def generate_node_id(self, g, node, id, instancetype): + # # Implementation for generating node ID + # pass + + def bind(self, prefix, namespace): + self.e.bind(prefix, namespace) + + def add_type(self, type): + self.types.append(type) + + def add_instancetype(self, instancetype, attributename): + if not isinstance(attributename, URIRef): + iri = self.entity_namespace[attributename] + else: + iri = attributename + self.e.add((iri, RDF.type, OWL.ObjectProperty)) + self.e.add((iri, RDFS.domain, URIRef(instancetype))) + self.e.add((iri, RDF.type, OWL.NamedIndividual)) + + # def add_relationship(self, attributename): + # if isinstance(attributename, URIRef): + # self.e.add((attributename, RDFS.range, ngsildns['Relationship'])) + # else: + # self.e.add((self.entity_namespace[attributename], RDFS.range, ngsildns['Relationship'])) + + # def add_subcomponent(self, attributename): + # self.e.add((self.entity_namespace[attributename], RDF.type, self.basens['SubComponentRelationship'])) + + # def add_placeholder(self, attributename): + # self.e.add((self.entity_namespace[attributename], self.basens['isPlaceHolder'], Literal(True))) + + # def add_property(self, attributename): + # if isinstance(attributename, URIRef): + # self.e.add((attributename, RDFS.range, ngsildns['Property'])) + # else: + # self.e.add((self.entity_namespace[attributename], RDFS.range, ngsildns['Property'])) + + # def is_typematch(self, full_attribute_name, type): + # try: + # if len(list(self.e.triples((full_attribute_name, RDFS.domain, type)))) > 0: + # return True + # except: + # return False + + def add_subclass(self, type): + self.e.add((type, RDF.type, OWL.Class)) + self.e.add((type, RDF.type, OWL.NamedIndividual)) + self.e.add((type, RDFS.subClassOf, self.opcuans['BaseObjectType'])) + + def add_subclasses(self, classes): + self.e += classes + + def serialize(self, destination): + self.e.serialize(destination) + + def add(self, triple): + self.e.add(triple) + + # def attritube_instance_exists(self, attributename): + # return len(list(self.e.objects(attributename, RDF.type))) > 0 + + def get_graph(self): + return self.e + + # def add_opcdatatype(self, attribute_name, data_type): + # self.e.add((attribute_name, self.basens['hasOPCUADatatype'], data_type)) + + # def add_datatype(self, g, node, attribute_name): + # data_type = utils.get_datatype(g, node, self.basens) + # if data_type is not None: + # self.e.add((self.entity_namespace[attribute_name], self.basens['hasOPCUADatatype'], data_type)) + + def create_ontolgoy_header(self, entity_namespace, version=0.1, versionIRI=None): + self.e.add((URIRef(entity_namespace), RDF.type, OWL.Ontology)) + if versionIRI is not None: + self.e.add((URIRef(entity_namespace), OWL.versionIRI, versionIRI)) + self.e.add((URIRef(entity_namespace), OWL.versionInfo, Literal(0.1))) + + def add_enum_class(self, graph, contentclass): + if contentclass is None or not isinstance(contentclass, URIRef): + return + bindings = {'c': contentclass} + print(f'Adding type {contentclass} to knowledge.') + result = graph.query(query_enumclass, initBindings=bindings, + initNs={'base': self.basens, 'opcua': self.opcuans}) + self.e += result + + def get_contentclass(self, contentclass, value): + bindings = {'c': contentclass, 'value': value} + result = self.e.query(query_instance, initBindings=bindings, + initNs={'base': self.basens, 'opcua': self.opcuans}) + foundclass = None + if len(result) > 0: + foundclass = list(result)[0].instance + if foundclass is None: + print(f'Warning: no instance found for class {contentclass} with value {value}') + return foundclass + + def get_default_contentclass(self, contentclass): + bindings = {'c': contentclass} + result = self.e.query(query_default_instance, initBindings=bindings, + initNs={'base': self.basens, 'opcua': self.opcuans}) + foundclass = None + if len(result) > 0: + foundclass = list(result)[0].instance + if foundclass is None: + print(f'Warning: no default instance found for class {contentclass}') + return foundclass diff --git a/semantic-model/opcua/lib/jsonld.py b/semantic-model/opcua/lib/jsonld.py new file mode 100644 index 00000000..cd6c0ae9 --- /dev/null +++ b/semantic-model/opcua/lib/jsonld.py @@ -0,0 +1,94 @@ +# +# Copyright (c) 2024 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import json +from rdflib.namespace import XSD +import lib.utils as utils + +ngsild_context = "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld" + + +class JsonLd: + def __init__(self, basens, opcuans): + self.instances = [] + self.opcuans = opcuans + self.basens = basens + + def add_instance(self, instance): + self.instances.append(instance) + + def serialize(self, filename): + with open(filename, 'w') as f: + json.dump(self.instances, f, ensure_ascii=False, indent=4) + + # def extract_namespaces(self, graph): + # return { + # str(prefix): { + # '@id': str(namespace), + # '@prefix': True + # } for prefix, namespace in graph.namespaces() + # } + + # def append(self, instance): + # self.instances.append(instance) + + def dump_context(self, filename, namespaces): + jsonld_context = { + "@context": [ + namespaces, + ngsild_context + ] + } + with open(filename, "w") as f: + json.dump(jsonld_context, f, indent=2) + + @staticmethod + def map_datatype_to_jsonld(data_type, opcuans): + boolean_types = [opcuans['Boolean']] + integer_types = [opcuans['Integer'], + opcuans['Int16'], + opcuans['Int32'], + opcuans['Int64'], + opcuans['SByte'], + opcuans['UInteger'], + opcuans['UInt16'], + opcuans['UInt32'], + opcuans['UInt64'], + opcuans['Byte']] + number_types = [opcuans['Decimal'], + opcuans['Double'], + opcuans['Duration'], + opcuans['Float']] + if data_type in boolean_types: + return XSD.boolean + if data_type in integer_types: + return XSD.integer + if data_type in number_types: + return XSD.double + return XSD.string + + def generate_node_id(self, graph, rootentity, node, id): + try: + node_id = next(graph.objects(node, self.basens['hasNodeId'])) + idtype = next(graph.objects(node, self.basens['hasIdentifierType'])) + bn = next(graph.objects(rootentity, self.basens['hasBrowseName'])) + except: + node_id = 'unknown' + idt = utils.idtype2String(idtype, self.basens) + if str(node) == str(rootentity): + return f'{id}:{bn}' + else: + return f'{id}:{bn}:sub:{idt}{node_id}' diff --git a/semantic-model/opcua/lib/nodesetparser.py b/semantic-model/opcua/lib/nodesetparser.py index 7737ed16..bcf71e11 100644 --- a/semantic-model/opcua/lib/nodesetparser.py +++ b/semantic-model/opcua/lib/nodesetparser.py @@ -154,7 +154,7 @@ def __init__(self, args, opcua_nodeset, opcua_inputs, version_iri, data_schema, if args.namespace is None: models = self.root.find('opcua:Models', self.xml_ns) if models is None: - print("Error: Namespace cannot be retrieved, plase set it explicitly.") + print("Error: Namespace cannot be retrieved, please set it explicitly.") exit(1) model = models.find('opcua:Model', self.xml_ns) self.ontology_name = URIRef(model.get('ModelUri')) @@ -446,6 +446,7 @@ def add_uadatatype(self, node): self.g.add((typeIri, self.rdf_ns['base']['hasField'], itemname)) else: # Enumtype is considered as instance of class self.g.add((itemname, RDF.type, typeIri)) + self.g.add((itemname, RDF.type, OWL.NamedIndividual)) if value is not None: bnode = BNode() bbnode = self.rdf_ns['base']['_' + str(bnode)] diff --git a/semantic-model/opcua/lib/shacl.py b/semantic-model/opcua/lib/shacl.py new file mode 100644 index 00000000..e67025ab --- /dev/null +++ b/semantic-model/opcua/lib/shacl.py @@ -0,0 +1,191 @@ +# +# Copyright (c) 2024 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +from urllib.parse import urlparse +from rdflib import Graph, Namespace, Literal, URIRef, BNode +from rdflib.namespace import RDF, RDFS, SH +import lib.utils as utils +from lib.jsonld import JsonLd + + +query_minmax = """ +SELECT ?mincount ?maxcount WHERE { + ?shape sh:targetClass ?targetclass . + OPTIONAL{ + ?shape sh:property [ + sh:path ?path; + sh:maxCount ?maxcount + ] + } + OPTIONAL{ + ?shape sh:property [ + sh:path ?path; + sh:minCount ?mincount + ] + } +} +""" + + +class Shacl: + def __init__(self, namespace_prefix, basens, opcuans): + self.shaclg = Graph() + self.shacl_namespace = Namespace(f'{namespace_prefix}shacl/') + self.shaclg.bind('shacl', self.shacl_namespace) + self.shaclg.bind('sh', SH) + self.ngsildns = Namespace('https://uri.etsi.org/ngsi-ld/') + self.shaclg.bind('ngsi-ld', self.ngsildns) + self.basens = basens + self.opcuans = opcuans + + def create_shacl_type(self, targetclass): + name = self.get_typename(targetclass) + 'Shape' + shapename = self.shacl_namespace[name] + self.shaclg.add((shapename, RDF.type, SH.NodeShape)) + self.shaclg.add((shapename, SH.targetClass, URIRef(targetclass))) + return shapename + + def create_shacl_property(self, shapename, path, optional, is_array, is_property, is_iri, contentclass, datatype, + is_subcomponent=False): + innerproperty = BNode() + property = BNode() + maxCount = 1 + minCount = 1 + if optional: + minCount = 0 + self.shaclg.add((shapename, SH.property, property)) + self.shaclg.add((property, SH.path, path)) + self.shaclg.add((property, SH.nodeKind, SH.BlankNode)) + self.shaclg.add((property, SH.minCount, Literal(minCount))) + if not is_array: + self.shaclg.add((property, SH.maxCount, Literal(maxCount))) + self.shaclg.add((property, SH.property, innerproperty)) + if is_property: + self.shaclg.add((innerproperty, SH.path, self.ngsildns['hasValue'])) + else: + self.shaclg.add((innerproperty, SH.path, self.ngsildns['hasObject'])) + if is_array: + self.shaclg.add((property, self.basens['isPlaceHolder'], Literal(True))) + if is_subcomponent: + self.shaclg.add((property, RDF.type, self.basens['SubComponentRelationship'])) + else: + self.shaclg.add((property, RDF.type, self.basens['PeerRelationship'])) + if is_iri: + self.shaclg.add((innerproperty, SH.nodeKind, SH.IRI)) + if contentclass is not None: + self.shaclg.add((innerproperty, SH['class'], contentclass)) + elif is_property: + self.shaclg.add((innerproperty, SH.nodeKind, SH.Literal)) + if datatype is not None: + self.shaclg.add((innerproperty, SH.datatype, datatype)) + + self.shaclg.add((innerproperty, SH.minCount, Literal(1))) + self.shaclg.add((innerproperty, SH.maxCount, Literal(1))) + + def get_typename(self, url): + result = urlparse(url) + if result.fragment != '': + return result.fragment + else: + basename = os.path.basename(result.path) + return basename + + def bind(self, prefix, namespace): + self.shaclg.bind(prefix, namespace) + + def serialize(self, destination): + self.shaclg.serialize(destination) + + def get_graph(self): + return self.shaclg + + def get_shacl_iri_and_contentclass(self, g, node, shacl_rule): + try: + data_type = utils.get_datatype(g, node, self.basens) + if data_type is not None: + shacl_rule['datatype'] = JsonLd.map_datatype_to_jsonld(data_type, self.opcuans) + base_data_type = next(g.objects(data_type, RDFS.subClassOf)) + if base_data_type != self.opcuans['Enumeration']: + shacl_rule['is_iri'] = False + shacl_rule['contentclass'] = None + else: + shacl_rule['is_iri'] = True + shacl_rule['contentclass'] = data_type + else: + shacl_rule['is_iri'] = False + shacl_rule['contentclass'] = None + except: + shacl_rule['is_iri'] = False + shacl_rule['contentclass'] = None + + def get_modelling_rule(self, path, target_class): + bindings = {'targetclass': target_class, 'path': path} + optional = True + array = True + try: + results = list(self.shaclg.query(query_minmax, initBindings=bindings, initNs={'sh': SH})) + if len(results) > 0: + if int(results[0][0]) > 0: + optional = False + if int(results[0][1]) <= 1: + array = False + except: + pass + return optional, array + + def attribute_is_indomain(self, targetclass, attributename): + property = self._get_property(targetclass, attributename) + return property is not None + + def _get_property(self, targetclass, propertypath): + result = None + try: + # First find the right nodeshape + shape = next(self.shaclg.subjects(SH.targetClass, targetclass)) + properties = self.shaclg.objects(shape, SH.property) + for property in properties: + path = next(self.shaclg.objects(property, SH.path)) + if str(path) == str(propertypath): + result = property + break + except: + pass + return result + + def is_placeholder(self, targetclass, attributename): + property = self._get_property(targetclass, attributename) + try: + return bool(next(self.shaclg.objects(property, self.basens['isPlaceHolder']))) + except: + return False + + def _get_shclass_from_property(self, property): + result = None + try: + subproperty = next(self.shaclg.objects(property, SH.property)) + result = next(self.shaclg.objects(subproperty, SH['class'])) + except: + pass + return result + + def update_shclass_in_property(self, property, shclass): + try: + subproperty = next(self.shaclg.objects(property, SH.property)) + self.shaclg.remove((subproperty, SH['class'], None)) + self.shaclg.add((subproperty, SH['class'], shclass)) + except: + pass diff --git a/semantic-model/opcua/lib/utils.py b/semantic-model/opcua/lib/utils.py index b4211579..57a56314 100644 --- a/semantic-model/opcua/lib/utils.py +++ b/semantic-model/opcua/lib/utils.py @@ -14,6 +14,68 @@ # limitations under the License. # +from urllib.parse import urlparse +from rdflib.namespace import RDFS, XSD +from rdflib import URIRef, Namespace +import re +import os + +query_realtype = """ +PREFIX owl: + +SELECT ?nodeclass ?realtype WHERE { + { + ?node a ?nodeclass . + FILTER(?nodeclass != owl:NamedIndividual + && STRENDS(STR(?nodeclass), "NodeClass") + && STRSTARTS(STR(?nodeclass), STR(opcua:)) + ) + } + UNION + { + { + ?node a ?realtype . + FILTER ((!STRENDS(STR(?realtype), "NodeClass") || !STRSTARTS(STR(?realtype), STR(opcua:))) && + ?realtype != owl:NamedIndividual + ) + } + UNION + { + ?node base:definesType ?realtype . + ?node a opcua:ObjectTypeNodeClass . + } + } +} +""" + +query_generic_references = """ +PREFIX rdfs: + +select ?reference ?target where { + ?node ?reference ?target . + ?reference rdfs:subClassOf* opcua:References +} +""" + +query_ignored_references = """ +PREFIX rdfs: + +SELECT ?subclass WHERE { + VALUES ?reference { + opcua:GeneratesEvent + opcua:HasEventSource + } + ?subclass rdfs:subClassOf* ?reference . +} +""" + +modelling_nodeid_optional = 80 +modelling_nodeid_mandatory = 78 +modelling_nodeid_optional_array = 11508 +workaround_instances = ['http://opcfoundation.org/UA/DI/FunctionalGroupType', 'http://opcfoundation.org/UA/FolderType'] +NGSILD = Namespace('https://uri.etsi.org/ngsi-ld/') + + def dump_graph(g): for s, p, o in g: print(s, p, o) @@ -36,3 +98,222 @@ def convert_to_json_type(result, basic_json_type): return int(result) if basic_json_type == 'number': return float(result) + + +def idtype2String(idtype, basens): + if idtype == basens['numericID']: + idt = 'i' + elif idtype == basens['stringID']: + idt = 's' + elif idtype == basens['guidID']: + idt = 'g' + elif idtype == basens['opaqueID']: + idt = 'b' + else: + idt = 'x' + print('Warning no idtype found.') + return idt + + +def extract_namespaces(graph): + return { + str(prefix): { + '@id': str(namespace), + '@prefix': True + } for prefix, namespace in graph.namespaces()} + + +def get_datatype(graph, node, basens): + try: + return next(graph.objects(node, basens['hasDatatype'])) + except: + return None + + +def attributename_from_type(type): + basename = None + url = urlparse(type) + if url.path is not None: + basename = os.path.basename(url.path) + basename = basename.removesuffix('Type') + return basename + + +def get_default_value(datatype): + if datatype == XSD.integer: + return 0 + if datatype == XSD.double: + return 0.0 + if datatype == XSD.string: + return '' + if datatype == XSD.boolean: + return False + print(f'Warning: unknown default value for datatype {datatype}') + + +def normalize_angle_bracket_name(s): + # Remove content inside angle brackets and the brackets themselves + no_brackets = re.sub(r'<[^>]*>', '', s) + # Strip trailing numbers and non-alphabetic characters + normalized = re.sub(r'[^a-zA-Z]+$', '', no_brackets) + return normalized + + +def contains_both_angle_brackets(s): + return '<' in s and '>' in s + + +def get_typename(url): + result = urlparse(url) + if result.fragment != '': + return result.fragment + else: + basename = os.path.basename(result.path) + return basename + + +def get_common_supertype(graph, class1, class2): + superclass = None + + # Prepare the query by injecting the class1 and class2 URIs into the query string + query_common_superclass = """ + PREFIX rdfs: + + SELECT ?commonSuperclass (MIN(?depth1 + ?depth2) AS ?minDepth) + WHERE {{ + + # Find all superclasses of the first class (?class1) + {{ + SELECT ?superclass1 (COUNT(?mid1) AS ?depth1) + WHERE {{ + BIND(<{class1}> AS ?class1) + ?class1 rdfs:subClassOf* ?mid1 . + ?mid1 rdfs:subClassOf* ?superclass1 . + }} + GROUP BY ?superclass1 + }} + + # Find all superclasses of the second class (?class2) + {{ + SELECT ?superclass2 (COUNT(?mid2) AS ?depth2) + WHERE {{ + BIND(<{class2}> AS ?class2) + ?class2 rdfs:subClassOf* ?mid2 . + ?mid2 rdfs:subClassOf* ?superclass2 . + }} + GROUP BY ?superclass2 + }} + + # Find the common superclasses + FILTER(?superclass1 = ?superclass2) + BIND(?superclass1 AS ?commonSuperclass) + }} + GROUP BY ?commonSuperclass + ORDER BY ?minDepth + LIMIT 1 + """.format(class1=class1, class2=class2) # Inject the URIs into the query + + try: + result = graph.query(query_common_superclass) + superclass = list(result)[0]['commonSuperclass'] + except Exception as e: + print(f"Error: {e}") + pass + return superclass + + +class RdfUtils: + def __init__(self, basens, opcuans): + self.basens = basens + self.opcuans = opcuans + + def isNodeclass(self, type): + nodeclasses = [self.opcuans['BaseNodeClass'], + self.opcuans['DataTypeNodeClass'], + self.opcuans['ObjectNodeClass'], + self.opcuans['ObjectTypeNodeClass'], + self.opcuans['ReferenceTypeNodeClass'], + self.opcuans['VariableNodeClass'], + self.opcuans['VariableNodeClass']] + result = bool([ele for ele in nodeclasses if (ele == type)]) + return result + + def isObjectNodeClass(self, type): + return type == self.opcuans['ObjectNodeClass'] + + def isObjectTypeNodeClass(self, type): + return type == self.opcuans['ObjectTypeNodeClass'] + + def isVariableNodeClass(self, type): + return type == self.opcuans['VariableNodeClass'] + + def get_type(self, g, node): + try: + bindings = {'node': node} + results = list(g.query(query_realtype, initBindings=bindings, + initNs={'opcua': self.opcuans, 'base': self.basens})) + nodeclass = None + type = None + for result in results: + if result[0] is not None: + nodeclass = result[0] + elif result[1] is not None: + type = result[1] + return (nodeclass, type) + except: + print(f"Warning: Could not find nodeclass of class node {node}. This should not happen") + return None, None + + def get_all_supertypes(self, g, instancetype, node): + supertypes = [] + + curtype = URIRef(instancetype) + curnode = node + try: + cur_typenode = next(g.objects(URIRef(node), self.basens['definesType'])) + except: + cur_typenode = None + if cur_typenode is None: + # node is not instancetype definition + cur_typenode = next(g.subjects(self.basens['definesType'], URIRef(curtype))) + supertypes.append((None, curnode)) + curnode = cur_typenode + + while curtype != self.opcuans['BaseObjectType']: + supertypes.append((curtype, curnode)) + try: + curtype = next(g.objects(curtype, RDFS.subClassOf)) + curnode = next(g.subjects(self.basens['definesType'], URIRef(curtype))) + except: + break + return supertypes + + def get_modelling_rule(self, graph, node, shacl_rule, instancetype): + use_instance_declaration = False + is_optional = True + try: + modelling_node = next(graph.objects(node, self.basens['hasModellingRule'])) + modelling_rule = next(graph.objects(modelling_node, self.basens['hasNodeId'])) + if int(modelling_rule) == modelling_nodeid_optional or str(instancetype) in workaround_instances: + is_optional = True + elif int(modelling_rule) == modelling_nodeid_mandatory: + is_optional = False + elif int(modelling_rule) == modelling_nodeid_optional_array: + is_optional = True + use_instance_declaration = True + except: + pass + if shacl_rule is not None: + shacl_rule['optional'] = is_optional + shacl_rule['array'] = use_instance_declaration + return is_optional, use_instance_declaration + + def get_generic_references(self, graph, node): + bindings = {'node': node} + result = graph.query(query_generic_references, initBindings=bindings, initNs={'opcua': self.opcuans}) + return list(result) + + def get_ignored_references(self, graph): + result = graph.query(query_ignored_references, initNs={'opcua': self.opcuans}) + first_elements = [t[0] for t in set(result)] + return first_elements diff --git a/semantic-model/opcua/requirements-dev.txt b/semantic-model/opcua/requirements-dev.txt index c1709b20..4c71ed15 100644 --- a/semantic-model/opcua/requirements-dev.txt +++ b/semantic-model/opcua/requirements-dev.txt @@ -3,3 +3,4 @@ bandit==1.7.4 black==22.8.0 pytest==7.1.3 pytest-cov==4.0.0 +pyshacl==0.26.0 \ No newline at end of file diff --git a/semantic-model/opcua/requirements.txt b/semantic-model/opcua/requirements.txt index ef3d78c9..c9551cf5 100644 --- a/semantic-model/opcua/requirements.txt +++ b/semantic-model/opcua/requirements.txt @@ -1,3 +1,3 @@ -owlrl==6.0.2 -rdflib==6.2.0 +rdflib==6.3.2 xmlschema==3.3.2 +oxrdflib==0.3.7 \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/compare_graphs.py b/semantic-model/opcua/tests/extractType/compare_graphs.py new file mode 100644 index 00000000..9f58f32c --- /dev/null +++ b/semantic-model/opcua/tests/extractType/compare_graphs.py @@ -0,0 +1,76 @@ +import argparse +from rdflib import Graph +from rdflib.compare import to_isomorphic, graph_diff + +def load_graph(filename, format=None): + """ + Load an RDF graph from a file. + + Parameters: + - filename: The path to the file containing the RDF graph. + - format: Optional format specifier for the RDF file (e.g., 'ttl', 'xml', 'n3'). + + Returns: + - An rdflib.Graph object loaded with the contents of the file. + """ + g = Graph() + g.parse(filename, format=format) + return g + +def graphs_are_isomorphic(graph1, graph2): + """ + Check if two RDF graphs are isomorphic (contain the same triples). + + Parameters: + - graph1: The first rdflib.Graph to compare. + - graph2: The second rdflib.Graph to compare. + + Returns: + - True if the graphs are isomorphic, False otherwise. + """ + return to_isomorphic(graph1) == to_isomorphic(graph2) + +def show_diff(graph1, graph2): + """ + Show the difference between two RDF graphs. + + Parameters: + - graph1: The first rdflib.Graph to compare. + - graph2: The second rdflib.Graph to compare. + """ + iso1 = to_isomorphic(graph1) + iso2 = to_isomorphic(graph2) + + in_both, in_graph1_not_graph2, in_graph2_not_graph1 = graph_diff(iso1, iso2) + + print("\nTriples in graph1 but not in graph2:") + for triple in in_graph1_not_graph2: + print(triple) + + print("\nTriples in graph2 but not in graph1:") + for triple in in_graph2_not_graph1: + print(triple) + +def main(): + # Set up argument parsing + parser = argparse.ArgumentParser(description="Compare two RDF graphs for isomorphism.") + parser.add_argument('graph1', help='Path to the first RDF graph file.') + parser.add_argument('graph2', help='Path to the second RDF graph file.') + parser.add_argument('--format', '-f', default=None, help='Format of the RDF files (e.g., ttl, xml, n3). If not provided, it will be guessed based on file extension.') + args = parser.parse_args() + + # Load the graphs + graph1 = load_graph(args.graph1, format=args.format) + graph2 = load_graph(args.graph2, format=args.format) + + # Compare the graphs + if graphs_are_isomorphic(graph1, graph2): + print("Graphs are isomorphic (identical).") + exit(0) + else: + print("Graphs are not isomorphic (different).") + show_diff(graph1, graph2) + exit(1) + +if __name__ == "__main__": + main() diff --git a/semantic-model/opcua/tests/extractType/query.py b/semantic-model/opcua/tests/extractType/query.py new file mode 100644 index 00000000..5547b50b --- /dev/null +++ b/semantic-model/opcua/tests/extractType/query.py @@ -0,0 +1,43 @@ +import rdflib +import argparse + +def load_ttl_and_query(input_file, input_format, sparql_query_file): + # Initialize an RDF graph + graph = rdflib.Graph() + contextgraph = rdflib.Graph() + + # Load the Turtle file into the graph + graph.parse(input_file, format=input_format) + contextgraph.parse("context.jsonld", format="json-ld") + # Extract namespaces from the graph + init_ns = {prefix: rdflib.Namespace(ns) for prefix, ns in contextgraph.namespaces()} + + # Load the SPARQL query from the file + with open(sparql_query_file, "r") as f: + sparql_query = f.read() + + # Execute the SPARQL query against the graph with initial namespaces + results = graph.query(sparql_query, initNs=init_ns) + + # Write the results to stdout + for row in results: + print(row) + + if not results: + print("No results found.") + +def main(): + # Set up argument parsing + parser = argparse.ArgumentParser(description="Apply a SPARQL query to a Turtle file and output the results.") + parser.add_argument("input_file", help="The path to the input file") + parser.add_argument("-f", "--input_format", help="Format of input file, e.g. ttl or json-ld", default="ttl") + parser.add_argument("sparql_query_file", help="The path to the SPARQL query file") + + # Parse the arguments + args = parser.parse_args() + + # Load the TTL and SPARQL query, and execute + load_ttl_and_query(args.input_file, args.input_format, args.sparql_query_file) + +if __name__ == "__main__": + main() diff --git a/semantic-model/opcua/tests/extractType/serve_context.py b/semantic-model/opcua/tests/extractType/serve_context.py new file mode 100644 index 00000000..8873bce3 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/serve_context.py @@ -0,0 +1,72 @@ +import http.server +import socketserver +import argparse +import os +import signal +import sys +import socket +import threading + +class SingleFileRequestHandler(http.server.SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + self.file_to_serve = kwargs.pop('file_to_serve') + super().__init__(*args, **kwargs) + + def do_GET(self): + if self.path == '/' or self.path == f'/{os.path.basename(self.file_to_serve)}': + self.path = f'/{self.file_to_serve}' + else: + self.send_error(404, "File not found") + return + + return super().do_GET() + +class GracefulTCPServer(socketserver.TCPServer): + allow_reuse_address = True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._shutdown_event = threading.Event() + + def serve_forever(self): + while not self._shutdown_event.is_set(): + self.handle_request() + + def shutdown(self): + self._shutdown_event.set() + super().shutdown() + +def run_server(port, file_to_serve): + handler = lambda *args, **kwargs: SingleFileRequestHandler(*args, file_to_serve=file_to_serve, **kwargs) + + with GracefulTCPServer(("", port), handler) as httpd: + # Set the socket option to reuse the address + httpd.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + def signal_handler(sig, frame): + print("Received shutdown signal. Shutting down the server...") + #httpd.shutdown() + sys.exit(0) + + # Register signal handlers for SIGINT (Ctrl+C) and SIGTERM + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + print(f"Serving {file_to_serve} on port {port}") + try: + httpd.serve_forever() + except KeyboardInterrupt: + httpd.shutdown() + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Minimal web server to serve a single file.") + parser.add_argument('file', help="The file to be served") + parser.add_argument('-p', '--port', type=int, default=8000, help="Port number to serve the file on (default: 8000)") + + args = parser.parse_args() + + if not os.path.isfile(args.file): + print(f"Error: {args.file} is not a valid file.") + exit(1) + + run_server(args.port, args.file) diff --git a/semantic-model/opcua/tests/extractType/test.bash b/semantic-model/opcua/tests/extractType/test.bash new file mode 100644 index 00000000..154304bc --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test.bash @@ -0,0 +1,183 @@ +NODESET_VERSION=UA-1.05.03-2023-12-15 +CORE_NODESET=https://raw.githubusercontent.com/OPCFoundation/UA-Nodeset/${NODESET_VERSION}/Schema/Opc.Ua.NodeSet2.xml +DI_NODESET=https://raw.githubusercontent.com/OPCFoundation/UA-Nodeset/${NODESET_VERSION}/DI/Opc.Ua.Di.NodeSet2.xml +MACHINERY_NODESET=https://raw.githubusercontent.com/OPCFoundation/UA-Nodeset/${NODESET_VERSION}/Machinery/Opc.Ua.Machinery.NodeSet2.xml +PUMPS_NODESET=https://raw.githubusercontent.com/OPCFoundation/UA-Nodeset/${NODESET_VERSION}/Pumps/Opc.Ua.Pumps.NodeSet2.xml +BASE_ONTOLOGY=https://industryfusion.github.io/contexts/staging/ontology/v0.1/base.ttl +CORE_ONTOLOGY=core.ttl +DEVICES_ONTOLOGY=devices.ttl +MACHINERY_ONTOLOGY=machinery.ttl +PUMPS_ONTOLOGY=pumps.ttl +RESULT=result.ttl +NODESET2OWL_RESULT=nodeset2owl_result.ttl +CORE_RESULT=core.ttl +CLEANED=cleaned.ttl +NODESET2OWL=../../nodeset2owl.py +TESTURI=http://my.test/ +DEBUG=${DEBUG:-false} +if [ "$DEBUG" = "true" ]; then + DEBUG_CMDLINE="-m debugpy --listen 5678" +fi +TESTNODESETS=( + test_object_wrong.NodeSet2,${TESTURI}AlphaType + test_object_overwrite_type.NodeSet2,${TESTURI}AlphaType + test_variable_enum.NodeSet2,${TESTURI}AlphaType + test_object_subtypes.NodeSet2,${TESTURI}AlphaType + test_object_hierarchies_no_DataValue,${TESTURI}AlphaType + test_ignore_references.NodeSet2,${TESTURI}AlphaType + test_references_to_typedefinitions.NodeSet2,${TESTURI}AlphaType + test_minimal_object.NodeSet2,http://example.org/MinimalNodeset/ObjectType + test_object_types.NodeSet2,${TESTURI}AlphaType + test_pumps_instanceexample,http://opcfoundation.org/UA/Pumps/PumpType,http://yourorganisation.org/InstanceExample/,pumps + ) +#TESTNODESETS=(test_object_types.NodeSet2,http://my.demo/AlphaType ) +CLEANGRAPH=cleangraph.py +TYPEURI=http://example.org/MinimalNodeset +TESTURN=urn:test +SHACL=shacl.ttl +ENTITIES_FILE=entities.ttl +INSTANCES=instances.jsonld +SPARQLQUERY=query.py +SERVE_CONTEXT=serve_context.py +SERVE_CONTEXT_PORT=8099 +CONTEXT_FILE=context.jsonld +LOCAL_CONTEXT=http://localhost:${SERVE_CONTEXT_PORT}/${CONTEXT_FILE} +PYSHACL_RESULT=pyshacl.ttl +EXTRACTTYPE="../../extractType.py" +COMPARE_GRAPHS="./compare_graphs.py" + + +function mydiff() { + format="$4" + echo "$1" + result="$2" + expected="$3" + echo "expected <=> result" + python3 ${COMPARE_GRAPHS} -f ${format} ${expected} ${result} || exit 1 + echo Done +} + +function ask() { + echo $1 + query=$3 + ENTITIES=$2 + FORMAT=${4:-ttl} + + result=$(python3 "${SPARQLQUERY}" -f ${FORMAT} "${ENTITIES}" "$query") + + if [ "$result" != "True" ]; then + echo "Wrong result of query: ${result}." + exit 1 + else + echo "OK" + fi +} + +function startstop_context_server() { + echo $1 + start=$2 + if [ "$start" = "true" ]; then + (python3 ${SERVE_CONTEXT} -p ${SERVE_CONTEXT_PORT} ${CONTEXT_FILE} &) + else + pkill -f ${SERVE_CONTEXT} + sleep 1 + fi + sleep 1 +} + +function checkqueries() { + echo "$1" + + # Correctly capture the list of query files into an array + queries=() + while IFS= read -r -d '' file; do + queries+=("$file") + done < <(find . -maxdepth 1 -name "$2.query[0-9]*" -print0) + + # Check if the array is empty + if [ ${#queries[@]} -eq 0 ]; then + echo "Skipping advanced sparql tests: No queries found matching pattern $2.query[0-9]*" + return 1 + fi + for query in "${queries[@]}"; do + echo "Executing query for entities $ENTITIES_FILE and query $query" + result=$(python3 "${SPARQLQUERY}" "${ENTITIES_FILE}" "$query") + + if [ "$result" != "True" ]; then + echo "Wrong result of query: ${result}." + exit 1 + fi + done + + echo "Done" +} + +if [ ! "$DEBUG" = "true" ]; then + echo Prepare core, device, machinery, pumps nodesets for testcases + echo ------------------------- + echo create core + python3 ${NODESET2OWL} ${CORE_NODESET} -i ${BASE_ONTOLOGY} -v http://example.com/v0.1/UA/ -p opcua -o ${CORE_RESULT} || exit 1 + echo create devices.ttl + python3 ${NODESET2OWL} ${DI_NODESET} -i ${BASE_ONTOLOGY} ${CORE_ONTOLOGY} -v http://example.com/v0.1/DI/ -p devices -o devices.ttl + echo create machinery.ttl + python3 ${NODESET2OWL} ${MACHINERY_NODESET} -i ${BASE_ONTOLOGY} ${CORE_ONTOLOGY} ${DEVICES_ONTOLOGY} -v http://example.com/v0.1/Machinery/ -p machinery -o machinery.ttl + echo create pumps.ttl + python3 ${NODESET2OWL} ${PUMPS_NODESET} -i ${BASE_ONTOLOGY} ${CORE_ONTOLOGY} ${DEVICES_ONTOLOGY} ${MACHINERY_ONTOLOGY} -v http://example.com/v0.1/Pumps/ -p pumps -o pumps.ttl +else + echo Skipping preparation of core, device, machinery, pumps nodesets due to DEBUG mode +fi + +echo Starting Feature Tests +echo -------------------------------- +echo -------------------------------- +startstop_context_server "Stopping context server" false +for tuple in "${TESTNODESETS[@]}"; do IFS="," + set -- $tuple; + nodeset=$1 + instancetype=$2 + instancenamespace=$3 + imports=$4 + if [ -n "$instancenamespace" ]; then + echo "Insancenamespace defined: '$instancenamespace'" + INSTANCENAMESPACE=("-n" "$instancenamespace") + else + INSTANCENAMESPACE=() + fi + if [ "$imports" = "pumps" ]; then + IMPORTS=("${BASE_ONTOLOGY}" "${CORE_ONTOLOGY}" "${DEVICES_ONTOLOGY}" "${MACHINERY_ONTOLOGY}" "${PUMPS_ONTOLOGY}") + else + IMPORTS=("${BASE_ONTOLOGY}" "${CORE_ONTOLOGY}") + fi + echo "==> test $nodeset with instancetype $instancetype" + echo -------------------------------------------------- + if [ "$DEBUG" = "true" ]; then + echo DEBUG: python3 ${NODESET2OWL} ${nodeset}.xml -i ${IMPORTS[@]} ${INSTANCENAMESPACE[@]} -v http://example.com/v0.1/UA/ -p test -o ${NODESET2OWL_RESULT} + echo DEBUG: python3 ${EXTRACTTYPE} -t ${instancetype} -n ${TESTURI} ${NODESET2OWL_RESULT} -i ${TESTURN} -xc ${LOCAL_CONTEXT} + fi + echo Create owl nodesets + echo ------------------- + python3 ${NODESET2OWL} ${nodeset}.xml -i ${IMPORTS[@]} ${INSTANCENAMESPACE[@]} -v http://example.com/v0.1/UA/ -p test -o ${NODESET2OWL_RESULT} || exit 1 + echo Extract types and instances + echo --------------------------- + python3 ${EXTRACTTYPE} -t ${instancetype} -n ${TESTURI} ${NODESET2OWL_RESULT} -i ${TESTURN} -xc ${LOCAL_CONTEXT} || exit 1 + startstop_context_server "Starting context server" true + #ask "Compare SHACL" ${SHACL} ${nodeset}.shacl + mydiff "Compare SHACL" "${nodeset}.shacl" "${SHACL}" "ttl" + mydiff "Compare instances" "${nodeset}.instances" "${INSTANCES}" "json-ld" + #ask "Compare INSTANCE" ${INSTANCES} ${nodeset}.instances json-ld + checkqueries "Check basic entities structure" ${nodeset} + echo SHACL test + echo ---------- + if [ -f ${nodeset}.pyshacl ]; then + echo "Testing custom shacl result" + pyshacl -s ${SHACL} -df json-ld -e ${ENTITIES_FILE} ${INSTANCES} -f turtle -o ${PYSHACL_RESULT} + echo "expected <=> result" + mydiff "Compare CUSTOM SHACL RESULTS" ${nodeset}.pyshacl ${PYSHACL_RESULT} "ttl" + echo OK + else + echo executing pyshacl -s ${SHACL} -df json-ld -e ${ENTITIES_FILE} ${INSTANCES} + pyshacl -s ${SHACL} -df json-ld -e ${ENTITIES_FILE} ${INSTANCES} || exit 1 + fi + startstop_context_server "Stopping context server" false + echo "Test finished successfully" +done diff --git a/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.instances new file mode 100644 index 00000000..563ca1e7 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:X": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.shacl new file mode 100644 index 00000000..71ebabd7 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.xml new file mode 100644 index 00000000..43104564 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_ignore_references.NodeSet2.xml @@ -0,0 +1,152 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + i=41 + + + + X Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=1003 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + + + + Object B + + ns=1;i=1002 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.instances new file mode 100644 index 00000000..01fe66a9 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.instances @@ -0,0 +1,13 @@ +[ + { + "type": "http://example.org/MinimalNodeset/ObjectType", + "id": "urn:test:Object", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasVariable": { + "type": "Property", + "value": 123.456 + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.query1 b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.query1 new file mode 100644 index 00000000..63a20507 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.query1 @@ -0,0 +1,4 @@ +ask where { + test:ObjectType a owl:Class . + test:ObjectType rdfs:subClassOf opcua:BaseObjectType . +} \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.shacl new file mode 100644 index 00000000..44194978 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.shacl @@ -0,0 +1,18 @@ +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:ObjectTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:ObjectType . + diff --git a/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.xml new file mode 100644 index 00000000..327c0f6c --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_minimal_object.NodeSet2.xml @@ -0,0 +1,58 @@ + + + + http://example.org/MinimalNodeset + + + + + + + + i=1 + i=11 + i=13 + i=12 + i=21 + i=47 + i=46 + i=35 + i=45 + i=40 + i=37 + i=17604 + i=256 + i=291 + i=887 + + + + ObjectType + A custom Object Type + + ns=1;i=2001 + i=58 + + + + + + Object + + ns=1;i=2001 + ns=1;i=1001 + + + + + + Variable + A variable within the object + + 123.456 + + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.instances b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.instances new file mode 100644 index 00000000..10d09ecf --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.instances @@ -0,0 +1,24 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ] + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.shacl b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.shacl new file mode 100644 index 00000000..147d5732 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.shacl @@ -0,0 +1,45 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:DType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:BType . + +shacl:DTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:DType . + diff --git a/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.xml b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.xml new file mode 100644 index 00000000..4c8a7347 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_hierarchies_no_DataValue.xml @@ -0,0 +1,164 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1011 + i=78 + + + + D Type + A custom object type D + + i=58 + ns=1;i=1004 + i=80 + + + + Object D + + ns=1;i=1010 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=2020 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + ns=1;i=2020 + + + + Object D + + ns=1;i=1010 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + + + + Object B + + ns=1;i=1002 + i=78 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.instances new file mode 100644 index 00000000..c09e0a08 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.shacl new file mode 100644 index 00000000..70e7fb90 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.xml new file mode 100644 index 00000000..b33520c8 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_overwrite_type.NodeSet2.xml @@ -0,0 +1,164 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + ns=1;i=1005 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B + + ns=1;i=1002 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.instances new file mode 100644 index 00000000..e6eda93f --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BSubType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.shacl new file mode 100644 index 00000000..167e03c5 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.xml new file mode 100644 index 00000000..517b83f1 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_subtypes.NodeSet2.xml @@ -0,0 +1,157 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + B Sub Type + A custom subobject of type B + + ns=1;i=1002 + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B subtype + + ns=1;i=1005 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.instances new file mode 100644 index 00000000..c09e0a08 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query2 b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query2 new file mode 100644 index 00000000..d4e2b702 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query2 @@ -0,0 +1,4 @@ +ask where { + test:Y a owl:ObjectProperty ; + rdfs:domain test:AlphaType . +} \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query3 b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query3 new file mode 100644 index 00000000..d16815a7 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.query3 @@ -0,0 +1,4 @@ +ask where { + test:AlphaType a owl:Class ; + rdfs:subClassOf opcua:BaseObjectType . +} \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.shacl new file mode 100644 index 00000000..000cf769 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.xml new file mode 100644 index 00000000..60075c21 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_types.NodeSet2.xml @@ -0,0 +1,157 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B + + ns=1;i=1002 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.instances new file mode 100644 index 00000000..5510dd42 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BWrongType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.pyshacl b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.pyshacl new file mode 100644 index 00000000..e79ba011 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.pyshacl @@ -0,0 +1,21 @@ +@prefix ngsi-ld: . +@prefix sh: . +@prefix test: . +@prefix xsd: . + +[] a sh:ValidationReport ; + sh:conforms false ; + sh:result [ a sh:ValidationResult ; + sh:focusNode [ a ngsi-ld:Relationship ; + ngsi-ld:hasObject ] ; + sh:resultMessage "Value does not have class test:BType" ; + sh:resultPath ngsi-ld:hasObject ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ; + sh:value ] . + diff --git a/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.shacl new file mode 100644 index 00000000..000cf769 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.xml new file mode 100644 index 00000000..d2e154b3 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_object_wrong.NodeSet2.xml @@ -0,0 +1,157 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + B Wrong Type + A custom subobject of type B + + i=58 + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B subtype + + ns=1;i=1005 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.instances b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.instances new file mode 100644 index 00000000..9f4ca07e --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.instances @@ -0,0 +1,408 @@ +[ + { + "type": "http://opcfoundation.org/UA/Pumps/DriveMeasurementsType", + "id": "urn:test:ExamplePump:sub:i5006", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasFrequency": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasMotorVoltage": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasDriverPowerInput": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasMotorCurrent": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasEnergyConsumption": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasMotorTemperature": { + "type": "Property", + "value": 0.0 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/DrivePortType", + "id": "urn:test:ExamplePump:sub:i5004", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMeasurements": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5006" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/PortsGroupType", + "id": "urn:test:ExamplePump:sub:i5003", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:has%3CDrive%3E": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5004" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/DesignType", + "id": "urn:test:ExamplePump:sub:i5021", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMaximumAllowableContinuousSpeed": { + "type": "Property", + "value": 56.67 + }, + "uaentity:hasOfferedControlModes": { + "type": "Property", + "value": "" + }, + "uaentity:hasPumpClass": { + "type": "Property", + "value": { + "@id": "http://opcfoundation.org/UA/Pumps/LiquidPump" + } + }, + "uaentity:hasMaximumPumpPowerInput": { + "type": "Property", + "value": 85.0 + }, + "uaentity:hasMaximumAllowableHead": { + "type": "Property", + "value": 6.3 + }, + "uaentity:hasClockwiseRotation": { + "type": "Property", + "value": true + }, + "uaentity:hasMinimumAllowableContinuousSpeed": { + "type": "Property", + "value": 23.33 + }, + "uaentity:hasMinimumAllowableAmbientTemperature": { + "type": "Property", + "value": 278.15 + }, + "uaentity:hasControllable": { + "type": "Property", + "value": false + }, + "uaentity:hasOfferedFieldbuses": { + "type": "Property", + "value": "" + }, + "uaentity:hasMaximumAllowableRelativeHumidity": { + "type": "Property", + "value": 80.0 + }, + "uaentity:hasMaximumAllowableAmbientTemperature": { + "type": "Property", + "value": 343.15 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/SystemRequirementsType", + "id": "urn:test:ExamplePump:sub:i5022", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasFieldbus": { + "type": "Property", + "value": { + "@id": "http://opcfoundation.org/UA/Pumps/BACnet_MSTP" + } + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/ConfigurationGroupType", + "id": "urn:test:ExamplePump:sub:i5020", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasDesign": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5021" + }, + "uaentity:hasSystemRequirements": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5022" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/SupervisionProcessFluidType", + "id": "urn:test:ExamplePump:sub:i5010", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasTemperature": { + "type": "Property", + "value": false + }, + "uaentity:hasBlockage": { + "type": "Property", + "value": false + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/SupervisionPumpOperationType", + "id": "urn:test:ExamplePump:sub:i5011", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMaximumOperationTime": { + "type": "Property", + "value": false + }, + "uaentity:hasMaximumNumberStarts": { + "type": "Property", + "value": false + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/SupervisionMechanicsType", + "id": "urn:test:ExamplePump:sub:i5009", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasRotorBlocked": { + "type": "Property", + "value": false + }, + "uaentity:hasUnbalance": { + "type": "Property", + "value": false + }, + "uaentity:hasExcessVibration": { + "type": "Property", + "value": false + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/SupervisionType", + "id": "urn:test:ExamplePump:sub:i5008", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasSupervisionProcessFluid": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5010" + }, + "uaentity:hasSupervisionPumpOperation": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5011" + }, + "uaentity:hasSupervisionMechanics": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5009" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/DocumentationType", + "id": "urn:test:ExamplePump:sub:i5005", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasTechnicalDataLink": { + "type": "Property", + "value": "www.LinkToTechnicalData.com/example" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/PreventiveMaintenanceType", + "id": "urn:test:ExamplePump:sub:i5015", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasNextInspectionDate": { + "type": "Property", + "value": "2022-05-01T10:00:00Z" + }, + "uaentity:hasNextServicingDate": { + "type": "Property", + "value": "2022-05-01T10:00:00Z" + }, + "uaentity:hasInstallationDate": { + "type": "Property", + "value": "2021-05-01T10:00:00Z" + }, + "uaentity:hasLastInspectionDate": { + "type": "Property", + "value": "2021-05-01T10:00:00Z" + }, + "uaentity:hasLastServicingDate": { + "type": "Property", + "value": "2021-05-01T10:00:00Z" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/GeneralMaintenanceType", + "id": "urn:test:ExamplePump:sub:i5014", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasActiveMaintenanceTime": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasOperatingTime": { + "type": "Property", + "value": 0.0 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/BreakdownMaintenanceType", + "id": "urn:test:ExamplePump:sub:i5013", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasFailure": { + "type": "Property", + "value": false + }, + "uaentity:hasNumberOfFailures": { + "type": "Property", + "value": 0 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/MaintenanceGroupType", + "id": "urn:test:ExamplePump:sub:i5012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasPreventiveMaintenance": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5015" + }, + "uaentity:hasGeneralMaintenance": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5014" + }, + "uaentity:hasBreakdownMaintenance": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5013" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/PumpActuationType", + "id": "urn:test:ExamplePump:sub:i5017", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasActualControlMode": { + "type": "Property", + "value": { + "@id": "http://opcfoundation.org/UA/Pumps/ConstantPressureControl" + } + }, + "uaentity:hasOnOff": { + "type": "Property", + "value": false + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/VibrationMeasurementType", + "id": "urn:test:ExamplePump:sub:i5019", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasOverallVibrationAcceleration0_P": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasOverallVibrationAccelerationP_P": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasOverallVibrationAccelerationPerG0_P": { + "type": "Property", + "value": 0.0 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/MeasurementsType", + "id": "urn:test:ExamplePump:sub:i5018", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasSensor1": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5019" + }, + "uaentity:hasSpeed": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasFluidTemperature": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasDifferentialPressure": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasPumpPowerInput": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasNumberOfStarts": { + "type": "Property", + "value": 0 + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/OperationalGroupType", + "id": "urn:test:ExamplePump:sub:i5016", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasPumpActuation": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5017" + }, + "uaentity:hasMeasurements": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5018" + } + }, + { + "type": "http://opcfoundation.org/UA/Pumps/PumpType", + "id": "urn:test:ExamplePump", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasPorts": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5003" + }, + "uaentity:hasConfiguration": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5020" + }, + "uaentity:hasEvents": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5008" + }, + "uaentity:hasDocumentation": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5005" + }, + "uaentity:hasMaintenance": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5012" + }, + "uaentity:hasOperational": { + "type": "Relationship", + "object": "urn:test:ExamplePump:sub:i5016" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.shacl b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.shacl new file mode 100644 index 00000000..656c3c55 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.shacl @@ -0,0 +1,4826 @@ +@prefix base: . +@prefix devices: . +@prefix ngsi-ld: . +@prefix opcua: . +@prefix pumps: . +@prefix sh: . +@prefix shacl: . +@prefix xsd: . + +shacl:ActuationTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:ActuationType . + +shacl:BaseObjectTypeShape a sh:NodeShape ; + sh:targetClass opcua:BaseObjectType . + +shacl:BreakdownMaintenanceTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:BreakdownMaintenanceType . + +shacl:ConditionBasedMaintenanceTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:ConditionBasedMaintenanceType . + +shacl:ConfigurationGroupTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DesignType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ImplementationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SystemRequirementsType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:ConfigurationGroupType . + +shacl:ControlTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:ControlType . + +shacl:DesignTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PumpClassEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:DesignType . + +shacl:DiscreteInputObjectTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:DiscreteInputObjectType . + +shacl:DiscreteOutputObjectTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:DiscreteOutputObjectType . + +shacl:DocumentationTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:DocumentationType . + +shacl:FileTypeShape a sh:NodeShape ; + sh:targetClass opcua:FileType . + +shacl:FunctionalGroupTypeShape a sh:NodeShape ; + sh:targetClass devices:FunctionalGroupType . + +shacl:GeneralMaintenanceTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:StateOfTheItemEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:MaintenanceLevelEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:GeneralMaintenanceType . + +shacl:ImplementationTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:ImplementationType . + +shacl:LockingServicesTypeShape a sh:NodeShape ; + sh:targetClass devices:LockingServicesType . + +shacl:MaintenanceGroupTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:BreakdownMaintenanceType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ConditionBasedMaintenanceType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PreventiveMaintenanceType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:GeneralMaintenanceType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:MaintenanceGroupType . + +shacl:MarkingsTypeShape a sh:NodeShape ; + sh:targetClass pumps:MarkingsType . + +shacl:MeasurementsTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:MeasurementsType . + +shacl:MultiPumpTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ExchangeModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:MultiPumpOperationModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PumpRoleEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DistributionTypeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:MultiPumpType . + +shacl:OperationalGroupTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ActuationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ActuationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PumpActuationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SignalsType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:MultiPumpType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:MeasurementsType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ControlType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:OperationalGroupType . + +shacl:PortsGroupTypeShape a sh:NodeShape ; + sh:targetClass pumps:PortsGroupType . + +shacl:PreventiveMaintenanceTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:PreventiveMaintenanceType . + +shacl:PumpActuationTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:OperationModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PumpKickObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ControlModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ControlModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteOutputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:OperationModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:PumpActuationType . + +shacl:PumpIdentificationTypeShape a sh:NodeShape ; + sh:targetClass pumps:PumpIdentificationType . + +shacl:PumpKickObjectTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:PumpKickModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:integer ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:PumpKickObjectType . + +shacl:PumpTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DocumentationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:MaintenanceGroupType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ConfigurationGroupType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:OperationalGroupType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:PumpType . + +shacl:SignalsTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:DiscreteInputObjectType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:SignalsType . + +shacl:SupervisionAuxiliaryDeviceTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionAuxiliaryDeviceType . + +shacl:SupervisionElectronicsTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionElectronicsType . + +shacl:SupervisionHardwareTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionHardwareType . + +shacl:SupervisionMechanicsTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionMechanicsType . + +shacl:SupervisionProcessFluidTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionProcessFluidType . + +shacl:SupervisionPumpOperationTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionPumpOperationType . + +shacl:SupervisionSoftwareTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SupervisionSoftwareType . + +shacl:SupervisionTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionProcessFluidType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionHardwareType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionPumpOperationType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionSoftwareType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionAuxiliaryDeviceType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionElectronicsType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:SupervisionMechanicsType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass pumps:SupervisionType . + +shacl:SystemRequirementsTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:OperatingModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:ControlModeEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class pumps:FieldbusEnum ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass pumps:SystemRequirementsType . + diff --git a/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.xml b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.xml new file mode 100644 index 00000000..9b895628 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_pumps_instanceexample.xml @@ -0,0 +1,2581 @@ + + + + http://yourorganisation.org/InstanceExample/ + http://opcfoundation.org/UA/Pumps/ + http://opcfoundation.org/UA/Machinery/ + http://opcfoundation.org/UA/DI/ + + + i=1 + i=3 + i=5 + i=6 + i=7 + i=9 + i=11 + i=12 + i=13 + i=21 + i=35 + i=40 + i=41 + i=46 + i=47 + i=296 + i=884 + i=887 + ns=2;i=3005 + ns=2;i=3008 + ns=2;i=3017 + ns=2;i=3018 + ns=2;i=3020 + ns=2;i=3021 + + + + + + + + ExamplePump + + ns=1;i=5020 + ns=1;i=5005 + ns=1;i=5008 + i=85 + ns=1;i=5001 + ns=1;i=5012 + ns=1;i=5016 + ns=1;i=5003 + ns=2;i=1052 + ns=3;i=1001 + + + + Configuration + Static design, system requirements, and implementation data of the pump. + + ns=1;i=5002 + ns=2;i=1024 + ns=1;i=5021 + ns=1;i=5022 + + + + Design + Static design properties for a pump. + + ns=1;i=6025 + ns=1;i=6049 + ns=1;i=5020 + ns=2;i=1020 + ns=1;i=6052 + ns=1;i=6053 + ns=1;i=6086 + ns=1;i=6087 + ns=1;i=6092 + ns=1;i=6093 + ns=1;i=6094 + ns=1;i=6095 + ns=1;i=6096 + ns=1;i=6097 + + + + ClockwiseRotation + Direction of rotation in which the shaft is seen to be turning in a clockwise direction when viewing the drive end of the shaft. A "True" status means that the rotation of pump is clockwise and a "False" status means that the rotation of pump is anticlockwise. + + ns=1;i=5021 + ns=1;i=6047 + ns=1;i=6048 + i=2373 + + + true + + + + FalseState + + ns=1;i=6025 + i=68 + + + + A FalseState means that the rotation of the pump is anticlockwise. + + + + + TrueState + + i=68 + ns=1;i=6025 + + + + A TrueState means that the rotation of pump is clockwise. + + + + + Controllable + Indicates whether the product is a controllable pump or a self-controlling pump. A "True" status means that the pump is controllable and a "False" status means that the pump is not controllable. + + ns=1;i=5021 + ns=1;i=6050 + ns=1;i=6051 + i=2373 + + + + FalseState + + ns=1;i=6049 + i=68 + + + + A FalseState means that the pump is not controllable. + + + + + TrueState + + i=68 + ns=1;i=6049 + + + + A TrueState means that the pump is controllable. + + + + + MaximumAllowableAmbientTemperature + Highest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable + + i=15318 + ns=1;i=6123 + ns=1;i=5021 + + + 343.15 + + + + EngineeringUnits + + ns=1;i=6052 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + + K + + + kelvin + + + + + + + + MaximumAllowableContinuousSpeed + Highest rotational speed for continuous operation recommended by the manufacturer + + i=15318 + ns=1;i=6127 + ns=1;i=5021 + + + 56.67 + + + + EngineeringUnits + + ns=1;i=6053 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4405559 + + s⁻¹ + + + reciprocal second + + + + + + + + MaximumAllowableHead + Maximum permissible head at which the pump can be continuously operated without suffering damage + + i=15318 + ns=1;i=6131 + ns=1;i=5021 + + + 6.3 + + + + EngineeringUnits + + ns=1;i=6086 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5067858 + + m + + + metre + + + + + + + + MaximumAllowableRelativeHumidity + Highest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable + + i=15318 + ns=1;i=6135 + ns=1;i=5021 + + + 80 + + + + EngineeringUnits + + ns=1;i=6087 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 20529 + + % + + + percent + + + + + + + + MaximumPumpPowerInput + Highest value of the pump power input at any rate of flow at any allowable operating condition + + i=15318 + ns=1;i=6139 + ns=1;i=5021 + + + 85 + + + + EngineeringUnits + + ns=1;i=6092 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5723220 + + W + + + watt + + + + + + + + MinimumAllowableAmbientTemperature + Lowest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable + + i=15318 + ns=1;i=6148 + ns=1;i=5021 + + + 278.15 + + + + EngineeringUnits + + ns=1;i=6093 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + + K + + + kelvin + + + + + + + + MinimumAllowableContinuousSpeed + Lowest speed for continuous operation recommended by the manufacturer + + i=15318 + ns=1;i=6163 + ns=1;i=5021 + + + 23.33 + + + + EngineeringUnits + + ns=1;i=6094 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4405559 + + s⁻¹ + + + reciprocal second + + + + + + + + OfferedControlModes + Control modes supported by the manufacturer for the product. + + i=2365 + ns=1;i=5021 + + + + + ns=2;i=5008 + + + + AAA= + gA8= + + + + + + + OfferedFieldbuses + Fieldbuses supported by the manufacturer for the product. + + i=2365 + ns=1;i=5021 + + + + + ns=2;i=5011 + + + + AAAAAAAAAA== + gICAgICAAw== + + + + + + + PumpClass + Pump type according to functional principle and pumped fluid + + i=2365 + ns=1;i=5021 + + + 5 + + + + SystemRequirements + Static system requirement properties for a pump. + + ns=1;i=6168 + ns=1;i=5020 + ns=2;i=1022 + + + + Fieldbus + Selected fieldbus for the product + + i=2365 + ns=1;i=5022 + + + 4 + + + + Documentation + Static documentation files of a pump. + + ns=1;i=5002 + ns=2;i=1006 + ns=1;i=5007 + ns=1;i=6023 + + + + TechnicalData + Manufacturer`s specification of the item. + + ns=1;i=7001 + i=11575 + ns=1;i=7002 + ns=1;i=6024 + ns=1;i=7003 + ns=1;i=6009 + ns=1;i=7004 + ns=1;i=7005 + ns=1;i=6013 + ns=1;i=5005 + ns=1;i=6014 + ns=1;i=6015 + ns=1;i=7006 + + + + Close + + ns=1;i=5007 + ns=1;i=6004 + + + + InputArguments + + i=68 + ns=1;i=7001 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + + GetPosition + + ns=1;i=5007 + ns=1;i=6005 + ns=1;i=6006 + + + + InputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + + MimeType + + ns=1;i=5007 + i=68 + + + + Open + + ns=1;i=6007 + ns=1;i=5007 + ns=1;i=6008 + + + + InputArguments + + i=68 + ns=1;i=7003 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7003 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + + OpenCount + + ns=1;i=5007 + i=68 + + + + Read + + ns=1;i=6010 + ns=1;i=6011 + ns=1;i=5007 + + + + InputArguments + + i=68 + ns=1;i=7004 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7004 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + + SetPosition + + ns=1;i=6012 + ns=1;i=5007 + + + + InputArguments + + i=68 + ns=1;i=7005 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + + Size + + i=68 + ns=1;i=5007 + + + + UserWritable + + i=68 + ns=1;i=5007 + + + + Writable + + i=68 + ns=1;i=5007 + + + + Write + + ns=1;i=6022 + ns=1;i=5007 + + + + InputArguments + + i=68 + ns=1;i=7006 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + + TechnicalDataLink + Manufacturer`s specification of the item. + + i=2365 + ns=1;i=5005 + + + www.LinkToTechnicalData.com/example + + + + Events + States, alarms, and conditions of a pump. + + ns=1;i=5002 + ns=1;i=5009 + ns=1;i=5010 + ns=1;i=5011 + ns=2;i=1019 + + + + SupervisionMechanics + Supervision mechanics specifies supervising information related to device mechanics. + + ns=1;i=6026 + ns=1;i=6029 + ns=1;i=5008 + ns=2;i=1012 + ns=1;i=6032 + + + + ExcessVibration + This attribute indicates unacceptable high mechanical vibration. + + ns=1;i=5009 + ns=1;i=6027 + ns=1;i=6028 + i=2373 + + + false + + + + FalseState + + ns=1;i=6026 + i=68 + + + + A FalseState means that there is no excess vibration at the pump. + + + + + TrueState + + i=68 + ns=1;i=6026 + + + + A TrueState means that there is an excess vibration at the pump. + + + + + RotorBlocked + This attribute indicates a blocked rotor. + + ns=1;i=6030 + ns=1;i=5009 + ns=1;i=6031 + i=2373 + + + false + + + + FalseState + + ns=1;i=6029 + i=68 + + + + A FalseState means that there is no blocked rotor. + + + + + TrueState + + i=68 + ns=1;i=6029 + + + + A TrueState means that there a no blocked rotor. + + + + + Unbalance + This attribute indicates an unbalance. + + ns=1;i=6033 + ns=1;i=6034 + i=2373 + ns=1;i=5009 + + + false + + + + FalseState + + ns=1;i=6032 + i=68 + + + + A FalseState means that there is no unbalance at the pump. + + + + + TrueState + + i=68 + ns=1;i=6032 + + + + A TrueState means that there is unbalance at the pump. + + + + + SupervisionProcessFluid + Supervision process fluid specifies information for monitoring the fluid of a pump. + + ns=1;i=6035 + ns=1;i=5008 + ns=2;i=1015 + ns=1;i=6038 + + + + Blockage + This attribute indicates a closed valve operation. + + ns=1;i=5010 + ns=1;i=6036 + ns=1;i=6037 + i=2373 + + + false + + + + FalseState + + ns=1;i=6035 + i=68 + + + + A FalseState means that there is no blockage at the pump. + + + + + TrueState + + i=68 + ns=1;i=6035 + + + + A TrueState means that there is a blockage at the pump. + + + + + Temperature + This attribute indicates an abnormal temperature of the pump fluid. + + ns=1;i=6039 + ns=1;i=5010 + ns=1;i=6040 + i=2373 + + + false + + + + FalseState + + ns=1;i=6038 + i=68 + + + + A FalseState means that there is no abnormal temperature at the fluid. + + + + + TrueState + + i=68 + ns=1;i=6038 + + + + A TrueState means that there is an abnormal temperature at the fluid. + + + + + SupervisionPumpOperation + Supervision pump operation specifies information for monitoring the pump operation. + + ns=1;i=6041 + ns=1;i=6044 + ns=1;i=5008 + ns=2;i=1016 + + + + MaximumNumberStarts + This attribute indicates that the maximum number of pump start cycles is exceeded. + + ns=1;i=6042 + ns=1;i=5011 + ns=1;i=6043 + i=2373 + + + false + + + + FalseState + + ns=1;i=6041 + i=68 + + + + A FalseState means that the maximum number of pump start cycles is not exceeded. + + + + + TrueState + + i=68 + ns=1;i=6041 + + + + A TrueState means that the maximum number of pump start cycles is exceeded. + + + + + MaximumOperationTime + This attribute indicates that the maximum time of pump operation is exceeded. + + ns=1;i=6045 + ns=1;i=5011 + ns=1;i=6046 + i=2373 + + + false + + + + FalseState + + ns=1;i=6044 + i=68 + + + + A FalseState means that the maximum time of pump operation is not exceeded. + + + + + TrueState + + i=68 + ns=1;i=6044 + + + + A TrueState means that the maximum time of pump operation is exceeded. + + + + + Identification + Identification information of a pump. + + ns=1;i=6154 + ns=1;i=6155 + ns=1;i=6156 + ns=1;i=6157 + ns=1;i=6158 + ns=1;i=6159 + ns=1;i=6001 + ns=1;i=6160 + ns=1;i=6161 + ns=1;i=6162 + ns=1;i=6002 + ns=2;i=1005 + ns=1;i=6003 + ns=1;i=6164 + ns=1;i=5002 + + + + ArticleNumber + Alphanumeric character sequence identifying a manufactured, non-configurable product. + + ns=1;i=5001 + i=68 + + + 1234567890 + + + + ComponentName + To be used by end users to store a human-readable localized text for the MachineryItem. The minimum number of locales supported for this property shall be two. Servers shall support at least 40 Unicode characters for the clients writing the text part of each locale, this means clients can expect to be able to write texts with a length of 40 Unicode characters into that field. + + ns=1;i=5001 + i=68 + + + + ExampleComponentName + + + + + CountryOfOrigin + Country in which the product is manufactured. + + ns=1;i=5001 + i=68 + + + Germany + + + + DayOfConstruction + The optional DayOfConstrucition provides the day of the month in which the manufacturing process of the machine has been completed. It shall be a number and never change during the life-cycle of a machine. + + ns=1;i=5001 + i=68 + + + 1 + + + + InitialOperationDate + The date, when the MachineryItem was switched on the first time after it has left the manufacturer plant. + + ns=1;i=5001 + i=68 + + + 2021-05-01T09:00:00Z + + + + Location + To be used by end users to store the location of the machine in a scheme specific to the end user. Servers shall support at least 60 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 60 Unicode characters into that field. + + ns=1;i=5001 + i=68 + + + ExampleLocation + + + + Manufacturer + A human-readable, localized name of the manufacturer of the MachineryItem. + + ns=1;i=5001 + i=68 + + + + ExampleManufacturer + + + + + ManufacturerUri + A globally unique identifier of the manufacturer of the MachineryItem. + + ns=1;i=5001 + i=68 + + + www.exampleManufacturer.com + + + + MonthOfConstruction + The month in which the manufacturing process of the MachineryItem has been completed. It shall be a number between 1 and 12, representing the month from January to December. + + ns=1;i=5001 + i=68 + + + 1 + + + + PhysicalAddress + Physical address of the manufacturer. + + ns=1;i=5001 + i=68 + + + + + ns=2;i=5017 + + + + 63 + + GE + Lyoner Str. + + + GE + 18 + + + GE + Frankfurt + + + GE + 60528 + + + GE + Hessen + + + GE + Deutschland + + + + + + + + ProductInstanceUri + A globally unique resource identifier provided by the manufacturer of the machine + + ns=1;i=5001 + i=68 + + + www.exampleManufacturer.com/Pump123xyz + + + + SerialNumber + A string containing a unique production number of the manufacturer of the MachineryItem. The global uniqueness of the serial number is only given in the context of the manufacturer, and potentially the model. The value shall not change during the life-cycle of the MachineryItem. + + i=68 + ns=1;i=5001 + + + 1234567890 + + + + YearOfConstruction + The year (Gregorian calendar) in which the manufacturing process of the MachineryItem has been completed. It shall be a four-digit number and never change during the life-cycle of a MachineryItem. + + i=68 + ns=1;i=5001 + + + 2021 + + + + Maintenance + Maintenance data of a pump. + + ns=1;i=5013 + ns=1;i=5014 + ns=1;i=5002 + ns=2;i=1011 + ns=1;i=5015 + + + + BreakdownMaintenance + Properties for breakdown maintenance. + + ns=1;i=5012 + ns=2;i=1010 + ns=1;i=6078 + ns=1;i=6081 + + + + Failure + Termination of the ability of an item to perform a required function. A "True" status means that the pump has a failure and a "False" status means that the pump has no failure. + + ns=1;i=6082 + ns=1;i=5013 + ns=1;i=6079 + ns=1;i=6080 + i=2373 + + + + Definition + + ns=1;i=6078 + i=68 + + + + FalseState + + ns=1;i=6078 + i=68 + + + + TrueState + + i=68 + ns=1;i=6078 + + + + NumberOfFailures + Number of failures of an object + + i=15318 + ns=1;i=6083 + ns=1;i=6084 + ns=1;i=5013 + + + + Definition + + ns=1;i=6081 + i=68 + + + + EURange + + ns=1;i=6081 + i=68 + + + + GeneralMaintenance + General maintenance properties. + + ns=1;i=6085 + ns=1;i=5012 + ns=2;i=1007 + ns=1;i=6088 + + + + ActiveMaintenanceTime + Part of the maintenance time when active maintenance is carried out on an item. + + ns=1;i=5014 + i=15318 + ns=1;i=6089 + ns=1;i=6091 + ns=1;i=6090 + + + + Definition + + ns=1;i=6085 + i=68 + + + + EngineeringUnits + + ns=1;i=6085 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4740434 + + h + + + hour + + + + + + + + EURange + + ns=1;i=6085 + i=68 + + + + OperatingTime + Measured time interval throughout which an item is in operating state + + i=15318 + ns=1;i=6098 + ns=1;i=6100 + ns=1;i=6099 + ns=1;i=5014 + + + + Definition + + ns=1;i=6088 + i=68 + + + + EngineeringUnits + + ns=1;i=6088 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4740434 + + h + + + hour + + + + + + + + EURange + + ns=1;i=6088 + i=68 + + + + PreventiveMaintenance + Properties for preventive maintenance. + + ns=1;i=6101 + ns=1;i=6102 + ns=1;i=6103 + ns=1;i=6104 + ns=1;i=6105 + ns=1;i=5012 + ns=2;i=1009 + + + + InstallationDate + This attribute identifies the date when the device was last inspected. + + i=2365 + ns=1;i=6106 + ns=1;i=5015 + + + 2021-05-01T10:00:00Z + + + + Definition + + ns=1;i=6101 + i=68 + + + + LastInspectionDate + This attribute identifies the date when the device is scheduled for the next inspection. + + i=2365 + ns=1;i=6107 + ns=1;i=5015 + + + 2021-05-01T10:00:00Z + + + + Definition + + ns=1;i=6102 + i=68 + + + + LastServicingDate + This attribute identifies the date when the device is scheduled for the next servicing. + + i=2365 + ns=1;i=6108 + ns=1;i=5015 + + + 2021-05-01T10:00:00Z + + + + Definition + + ns=1;i=6103 + i=68 + + + + NextInspectionDate + This attribute identifies the date when the device was last serviced. + + i=2365 + ns=1;i=6109 + ns=1;i=5015 + + + 2022-05-01T10:00:00Z + + + + Definition + + ns=1;i=6104 + i=68 + + + + NextServicingDate + Part of maintenance time when preventive maintenance is carried out on an item, including technical, logistic and internal administrative delays + + i=2365 + ns=1;i=6110 + ns=1;i=5015 + + + 2022-05-01T10:00:00Z + + + + Definition + + ns=1;i=6105 + i=68 + + + + Operational + Process data for control, actuation, signals, and measurements of the pump. + + ns=1;i=5018 + ns=1;i=5002 + ns=2;i=1053 + ns=1;i=5017 + + + + Measurements + Measurements at a pump. + + ns=1;i=6117 + ns=1;i=6118 + ns=1;i=5016 + ns=2;i=1054 + ns=1;i=6119 + ns=1;i=6120 + ns=1;i=5019 + ns=1;i=6121 + + + + DifferentialPressure + Determined (actual) gain in total pressure between the pump inlet and pump outlet + + i=15318 + ns=1;i=5018 + ns=1;i=6124 + ns=1;i=6125 + + + 0 + + + + EngineeringUnits + + ns=1;i=6117 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5259596 + + Pa + + + pascal + + + + + + + + KindOfQuantity + Quotient of the component of a force normal to a surface and its area + + ns=1;i=6117 + i=68 + + + pressure + + + + FluidTemperature + Measured internal temperature of pump fluid. + + i=15318 + ns=1;i=6128 + ns=1;i=5018 + ns=1;i=6129 + + + 0 + + + + EngineeringUnits + + ns=1;i=6118 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + + K + + + kelvin + + + + + + + + KindOfQuantity + Quantity representing a temperature value + + ns=1;i=6118 + i=68 + + + temperature + + + + NumberOfStarts + Total number of starts + + i=15318 + ns=1;i=6132 + ns=1;i=6133 + ns=1;i=5018 + + + 0 + + + + EngineeringUnits + + ns=1;i=6119 + i=68 + + + + KindOfQuantity + Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor + + ns=1;i=6119 + i=68 + + + rational number + + + + PumpPowerInput + Measured power transmitted to the pump by its driver + + i=15318 + ns=1;i=6136 + ns=1;i=6137 + ns=1;i=5018 + + + 0 + + + + EngineeringUnits + + ns=1;i=6120 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5723220 + + W + + + watt + + + + + + + + KindOfQuantity + Scalar product of force acting to a body and its velocity + + ns=1;i=6120 + i=68 + + + mechanical power + + + + Sensor1 + + ns=1;i=6142 + ns=1;i=6143 + ns=1;i=6144 + ns=1;i=5018 + ns=2;i=1055 + + + + OverallVibrationAcceleration0_P + Maximum oscillation amplitude, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration. + + i=15318 + ns=1;i=6147 + ns=1;i=6146 + i=2955 + ns=1;i=5019 + + + 0 + + + + EngineeringUnits + + ns=1;i=6142 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5067595 + + m/s² + + + metre per second squared + + + + + + + + EURange + + ns=1;i=6142 + i=68 + + + + OverallVibrationAccelerationP_P + Oscillation range, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration. + + i=15318 + ns=1;i=6150 + ns=1;i=6149 + i=2955 + ns=1;i=5019 + + + 0 + + + + EngineeringUnits + + ns=1;i=6143 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5067595 + + m/s² + + + metre per second squared + + + + + + + + EURange + + ns=1;i=6143 + i=68 + + + + OverallVibrationAccelerationPerG0_P + Maximum oscillation amplitude, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration. + + i=15318 + ns=1;i=6153 + ns=1;i=6152 + i=2955 + ns=1;i=5019 + + + 0 + + + + EngineeringUnits + + ns=1;i=6144 + i=68 + + + + EURange + + ns=1;i=6144 + i=68 + + + + Speed + Measured number of rotations or movements made by the shaft, coupling or impeller in a given time + + i=15318 + ns=1;i=6140 + ns=1;i=6141 + ns=1;i=5018 + + + 0 + + + + EngineeringUnits + + ns=1;i=6121 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4405559 + + s⁻¹ + + + reciprocal second + + + + + + + + KindOfQuantity + Inverse of one cycle of a periodic event + + ns=1;i=6121 + i=68 + + + frequency + + + + PumpActuation + Actuation parameters for a pump. + + ns=1;i=6111 + ns=1;i=6112 + ns=1;i=5016 + ns=2;i=1028 + + + + ActualControlMode + This property describes the actual control mode of the pump. + + ns=1;i=5017 + i=2365 + + + 0 + + + + OnOff + This property enables the operation. + + ns=1;i=6113 + ns=1;i=5017 + ns=1;i=6114 + i=2373 + + + + FalseState + + ns=1;i=6112 + i=68 + + + + A FalseState means that it is not possible to actuate the pump. + + + + + TrueState + + i=68 + ns=1;i=6112 + + + + A TrueState means that it is possible to actuate the pump. + + + + + Ports + Connection points of the pump. + + ns=1;i=5004 + ns=1;i=5002 + ns=2;i=1034 + + + + <Drive> + Port for the connection of the drive. + + ns=1;i=5003 + ns=2;i=1038 + ns=1;i=5006 + + + + Measurements + All operation measurements that describe the drive. + + ns=2;i=1051 + ns=1;i=6016 + ns=1;i=6017 + ns=1;i=6018 + ns=1;i=5004 + ns=1;i=6019 + ns=1;i=6020 + ns=1;i=6021 + + + + DriverPowerInput + Measured power absorbed by the motor. + + i=15318 + ns=1;i=6054 + ns=1;i=5006 + ns=1;i=6056 + ns=1;i=6055 + ns=1;i=6057 + i=2955 + + + 0 + + + + Definition + + ns=1;i=6016 + i=68 + + + + EngineeringUnits + + ns=1;i=6016 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5723220 + + W + + + watt + + + + + + + + EURange + + ns=1;i=6016 + i=68 + + + + KindOfQuantity + Derivative with respect to time t of energy E being transferred or transformed + + ns=1;i=6016 + i=68 + + + power + + + + EnergyConsumption + Measured energy consumption of the unit of the motor. + + i=15318 + ns=1;i=6058 + ns=1;i=5006 + ns=1;i=6060 + ns=1;i=6059 + ns=1;i=6061 + i=2955 + + + 0 + + + + Definition + + ns=1;i=6017 + i=68 + + + + EngineeringUnits + + ns=1;i=6017 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4869973 + + J + + + joule + + + + + + + + EURange + + ns=1;i=6017 + i=68 + + + + KindOfQuantity + Ability of a system to do work + + ns=1;i=6017 + i=68 + + + energy + + + + Frequency + Measured output frequency of the frequency converter. + + i=15318 + ns=1;i=6062 + ns=1;i=6064 + ns=1;i=6063 + ns=1;i=5006 + ns=1;i=6065 + i=2955 + + + 0 + + + + Definition + + ns=1;i=6018 + i=68 + + + + EngineeringUnits + + ns=1;i=6018 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4740186 + + Hz + + + hertz + + + + + + + + EURange + + ns=1;i=6018 + i=68 + + + + KindOfQuantity + Inverse of one cycle of a periodic event + + ns=1;i=6018 + i=68 + + + frequency + + + + MotorCurrent + Measured actual motor current. + + i=15318 + ns=1;i=6066 + ns=1;i=6068 + ns=1;i=6067 + ns=1;i=6069 + i=2955 + ns=1;i=5006 + + + 0 + + + + Definition + + ns=1;i=6019 + i=68 + + + + EngineeringUnits + + ns=1;i=6019 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4279632 + + A + + + ampere + + + + + + + + EURange + + ns=1;i=6019 + i=68 + + + + KindOfQuantity + Scalar quantity equal to the flux of the electric current density J through a given directed surface S + + ns=1;i=6019 + i=68 + + + electric current + + + + MotorTemperature + Measured temperature of the motor. + + i=15318 + ns=1;i=6070 + ns=1;i=6072 + ns=1;i=6071 + ns=1;i=6073 + i=2955 + ns=1;i=5006 + + + 0 + + + + Definition + + ns=1;i=6020 + i=68 + + + + EngineeringUnits + + ns=1;i=6020 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + + K + + + kelvin + + + + + + + + EURange + + ns=1;i=6020 + i=68 + + + + KindOfQuantity + Quantity representing a temperature value + + ns=1;i=6020 + i=68 + + + temperature + + + + MotorVoltage + Measured actual motor voltage. + + i=15318 + ns=1;i=6074 + ns=1;i=6076 + ns=1;i=6075 + ns=1;i=6077 + i=2955 + ns=1;i=5006 + + + 0 + + + + Definition + + ns=1;i=6021 + i=68 + + + + EngineeringUnits + + ns=1;i=6021 + i=68 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 5655636 + + V + + + volt + + + + + + + + EURange + + ns=1;i=6021 + i=68 + + + + KindOfQuantity + Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b + + ns=1;i=6021 + i=68 + + + voltage + + + diff --git a/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.instances new file mode 100644 index 00000000..cc920fbf --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.instances @@ -0,0 +1,32 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": false + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance" + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.shacl new file mode 100644 index 00000000..35cdc0c3 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.shacl @@ -0,0 +1,51 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:AlphaType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.xml new file mode 100644 index 00000000..56405836 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_references_to_typedefinitions.NodeSet2.xml @@ -0,0 +1,157 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B + + ns=1;i=1002 + ns=1;i=2013 + + + + Variable of B-object + + i=63 + + + diff --git a/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.instances b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.instances new file mode 100644 index 00000000..2e97e464 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.instances @@ -0,0 +1,34 @@ +[ + { + "type": "http://my.test/BType", + "id": "urn:test:AlphaInstance:sub:i2012", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasMyVariable": { + "type": "Property", + "value": { + "@id": "http://opcfoundation.org/UA/Full" + } + } + }, + { + "type": "http://my.test/AlphaType", + "id": "urn:test:AlphaInstance", + "@context": [ + "http://localhost:8099/context.jsonld" + ], + "uaentity:hasC": { + "type": "Property", + "value": 0.0 + }, + "uaentity:hasB": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + }, + "test:Y": { + "type": "Relationship", + "object": "urn:test:AlphaInstance:sub:i2012" + } + } +] \ No newline at end of file diff --git a/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.shacl b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.shacl new file mode 100644 index 00000000..870ca295 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.shacl @@ -0,0 +1,52 @@ +@prefix base: . +@prefix ngsi-ld: . +@prefix opcua: . +@prefix sh: . +@prefix shacl: . +@prefix test: . +@prefix xsd: . + +shacl:AlphaTypeShape a sh:NodeShape ; + sh:property [ a base:PeerRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path test:X ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ], + [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:datatype xsd:double ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path ngsi-ld:hasValue ] ], + [ a base:SubComponentRelationship ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class test:BType ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasObject ] ] ; + sh:targetClass test:AlphaType . + +shacl:BTypeShape a sh:NodeShape ; + sh:property [ sh:maxCount 1 ; + sh:minCount 0 ; + sh:nodeKind sh:BlankNode ; + sh:path ; + sh:property [ sh:class opcua:Duplex ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path ngsi-ld:hasValue ] ] ; + sh:targetClass test:BType . + diff --git a/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.xml b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.xml new file mode 100644 index 00000000..a0c91cb8 --- /dev/null +++ b/semantic-model/opcua/tests/extractType/test_variable_enum.NodeSet2.xml @@ -0,0 +1,161 @@ + + + + + + + + + http://my.test/ + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + + X Reference + + i=32 + + + + Y Reference + + i=32 + + + + AlphaType + A custom object type Alpha + + i=58 + ns=1;i=2001 + ns=1;i=1003 + ns=1;i=1003 + + + + B Type + A custom object type B + + i=58 + + + + Object B + + ns=1;i=1002 + ns=1;i=1004 + + + + Variable of B-object + + i=63 + + + + + + + Variable of AlphaType + + i=63 + ns=1;i=1001 + + + + Variable of Variable C + + i=63 + ns=1;i=2001 + + + + Object B + + ns=1;i=1002 + + + + Alpha Instance + + ns=1;i=2011 + ns=1;i=2012 + ns=1;i=1001 + ns=1;i=2012 + + + + C Variable of AlphaType + + i=63 + ns=1;i=2010 + ns=1;i=2011 + + + + Object B + + ns=1;i=1002 + ns=1;i=2013 + + + + Enum Variable + + i=63 + + + 0 + + + + diff --git a/semantic-model/opcua/tests/nodeset2owl/core_cleaned.ttl b/semantic-model/opcua/tests/nodeset2owl/core_cleaned.ttl index ce1306b6..18cde3b6 100644 --- a/semantic-model/opcua/tests/nodeset2owl/core_cleaned.ttl +++ b/semantic-model/opcua/tests/nodeset2owl/core_cleaned.ttl @@ -8,426 +8,558 @@ opcua: a owl:Ontology ; owl:versionIRI ; owl:versionInfo 1e-01 . -opcua:AbsoluteValue a opcua:ExceptionDeviationFormat ; +opcua:AbsoluteValue a opcua:ExceptionDeviationFormat, + owl:NamedIndividual ; base:hasFieldName "AbsoluteValue" . opcua:AccessLevel a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "AccessLevel" . -opcua:AccessLevelEx a opcua:AttributeWriteMask ; +opcua:AccessLevelEx a opcua:AttributeWriteMask, + owl:NamedIndividual ; base:hasFieldName "AccessLevelEx" . opcua:AccessRestrictions a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "AccessRestrictions" . -opcua:Active a opcua:AlarmMask ; +opcua:Active a opcua:AlarmMask, + owl:NamedIndividual ; base:hasFieldName "Active" . -opcua:AddNode a opcua:PermissionType ; +opcua:AddNode a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "AddNode" . -opcua:AddReference a opcua:PermissionType ; +opcua:AddReference a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "AddReference" . -opcua:Advanced a opcua:DiagnosticsLevel ; +opcua:Advanced a opcua:DiagnosticsLevel, + owl:NamedIndividual ; base:hasFieldName "Advanced" . opcua:All a opcua:NodeAttributesMask, - opcua:TrustListMasks ; + opcua:TrustListMasks, + owl:NamedIndividual ; base:hasFieldName "All" . -opcua:And a opcua:FilterOperator ; +opcua:And a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "And" . opcua:Anonymous a opcua:IdentityCriteriaType, - opcua:UserTokenType ; + opcua:UserTokenType, + owl:NamedIndividual ; base:hasFieldName "Anonymous" . -opcua:Append a opcua:OpenFileMode ; +opcua:Append a opcua:OpenFileMode, + owl:NamedIndividual ; base:hasFieldName "Append" . -opcua:Application a opcua:IdentityCriteriaType ; +opcua:Application a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "Application" . -opcua:ApplyRestrictionsToBrowse a opcua:AccessRestrictionType ; +opcua:ApplyRestrictionsToBrowse a opcua:AccessRestrictionType, + owl:NamedIndividual ; base:hasFieldName "ApplyRestrictionsToBrowse" . -opcua:AscendingWriterId a opcua:DataSetOrderingType ; +opcua:AscendingWriterId a opcua:DataSetOrderingType, + owl:NamedIndividual ; base:hasFieldName "AscendingWriterId" . -opcua:AscendingWriterIdSingle a opcua:DataSetOrderingType ; +opcua:AscendingWriterIdSingle a opcua:DataSetOrderingType, + owl:NamedIndividual ; base:hasFieldName "AscendingWriterIdSingle" . -opcua:AtLeastOnce a opcua:BrokerTransportQualityOfService ; +opcua:AtLeastOnce a opcua:BrokerTransportQualityOfService, + owl:NamedIndividual ; base:hasFieldName "AtLeastOnce" . -opcua:AtMostOnce a opcua:BrokerTransportQualityOfService ; +opcua:AtMostOnce a opcua:BrokerTransportQualityOfService, + owl:NamedIndividual ; base:hasFieldName "AtMostOnce" . -opcua:AuthenticatedUser a opcua:IdentityCriteriaType ; +opcua:AuthenticatedUser a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "AuthenticatedUser" . -opcua:BackupNotReady a opcua:RedundantServerMode ; +opcua:BackupNotReady a opcua:RedundantServerMode, + owl:NamedIndividual ; base:hasFieldName "BackupNotReady" . -opcua:BackupReady a opcua:RedundantServerMode ; +opcua:BackupReady a opcua:RedundantServerMode, + owl:NamedIndividual ; base:hasFieldName "BackupReady" . -opcua:BaseNode a opcua:NodeAttributesMask ; +opcua:BaseNode a opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "BaseNode" . -opcua:Basic a opcua:DiagnosticsLevel ; +opcua:Basic a opcua:DiagnosticsLevel, + owl:NamedIndividual ; base:hasFieldName "Basic" . -opcua:BestEffort a opcua:BrokerTransportQualityOfService ; +opcua:BestEffort a opcua:BrokerTransportQualityOfService, + owl:NamedIndividual ; base:hasFieldName "BestEffort" . -opcua:Between a opcua:FilterOperator ; +opcua:Between a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Between" . -opcua:BitwiseAnd a opcua:FilterOperator ; +opcua:BitwiseAnd a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "BitwiseAnd" . -opcua:BitwiseOr a opcua:FilterOperator ; +opcua:BitwiseOr a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "BitwiseOr" . -opcua:Body a opcua:UABinaryFileDataType ; +opcua:Body a opcua:UABinaryFileDataType, + owl:NamedIndividual ; base:hasFieldName "Body" . -opcua:BridgeDoesNotProvideNetworkId a opcua:TsnFailureCode ; +opcua:BridgeDoesNotProvideNetworkId a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "BridgeDoesNotProvideNetworkId" . -opcua:Browse a opcua:PermissionType ; +opcua:Browse a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "Browse" . -opcua:Call a opcua:PermissionType ; +opcua:Call a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "Call" . -opcua:CannotStoreDestinationAddress a opcua:TsnFailureCode ; +opcua:CannotStoreDestinationAddress a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "CannotStoreDestinationAddress" . -opcua:Cast a opcua:FilterOperator ; +opcua:Cast a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Cast" . -opcua:Certificate a opcua:UserTokenType ; +opcua:Certificate a opcua:UserTokenType, + owl:NamedIndividual ; base:hasFieldName "Certificate" . -opcua:CheckRevocationStatusOffline a opcua:TrustListValidationOptions ; +opcua:CheckRevocationStatusOffline a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "CheckRevocationStatusOffline" . -opcua:CheckRevocationStatusOnline a opcua:TrustListValidationOptions ; +opcua:CheckRevocationStatusOnline a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "CheckRevocationStatusOnline" . -opcua:Client a opcua:ApplicationType ; +opcua:Client a opcua:ApplicationType, + owl:NamedIndividual ; base:hasFieldName "Client" . -opcua:ClientAndServer a opcua:ApplicationType ; +opcua:ClientAndServer a opcua:ApplicationType, + owl:NamedIndividual ; base:hasFieldName "ClientAndServer" . -opcua:Cold a opcua:RedundancySupport ; +opcua:Cold a opcua:RedundancySupport, + owl:NamedIndividual ; base:hasFieldName "Cold" . -opcua:CommunicationFault a opcua:ServerState ; +opcua:CommunicationFault a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "CommunicationFault" . -opcua:Complete a opcua:NegotiationStatus ; +opcua:Complete a opcua:NegotiationStatus, + owl:NamedIndividual ; base:hasFieldName "Complete" . -opcua:Configuring a opcua:TsnStreamState ; +opcua:Configuring a opcua:TsnStreamState, + owl:NamedIndividual ; base:hasFieldName "Configuring" . -opcua:Constant a opcua:AccessLevelExType ; +opcua:Constant a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "Constant" . -opcua:Constraint a opcua:NamingRuleType ; +opcua:Constraint a opcua:NamingRuleType, + owl:NamedIndividual ; base:hasFieldName "Constraint" . opcua:ContainsNoLoops a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "ContainsNoLoops" . opcua:CurrentRead a opcua:AccessLevelExType, - opcua:AccessLevelType ; + opcua:AccessLevelType, + owl:NamedIndividual ; base:hasFieldName "CurrentRead" . opcua:CurrentWrite a opcua:AccessLevelExType, - opcua:AccessLevelType ; + opcua:AccessLevelType, + owl:NamedIndividual ; base:hasFieldName "CurrentWrite" . -opcua:DataSetMessageHeader a opcua:JsonNetworkMessageContentMask ; +opcua:DataSetMessageHeader a opcua:JsonNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "DataSetMessageHeader" . -opcua:DataSetWriterName a opcua:JsonDataSetMessageContentMask ; +opcua:DataSetWriterName a opcua:JsonDataSetMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "DataSetWriterName" . -opcua:Debug a opcua:DiagnosticsLevel ; +opcua:Debug a opcua:DiagnosticsLevel, + owl:NamedIndividual ; base:hasFieldName "Debug" . -opcua:Delete a opcua:HistoryUpdateType ; +opcua:Delete a opcua:HistoryUpdateType, + owl:NamedIndividual ; base:hasFieldName "Delete" . -opcua:DeleteHistory a opcua:PermissionType ; +opcua:DeleteHistory a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "DeleteHistory" . -opcua:DeleteNode a opcua:PermissionType ; +opcua:DeleteNode a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "DeleteNode" . opcua:Disabled a opcua:OverrideValueHandling, opcua:PubSubState, opcua:TsnStreamState, - opcua:UserConfigurationMask ; + opcua:UserConfigurationMask, + owl:NamedIndividual ; base:hasFieldName "Disabled" . -opcua:DiscoveryServer a opcua:ApplicationType ; +opcua:DiscoveryServer a opcua:ApplicationType, + owl:NamedIndividual ; base:hasFieldName "DiscoveryServer" . -opcua:Dormant a opcua:InterfaceOperStatus ; +opcua:Dormant a opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "Dormant" . opcua:Down a opcua:InterfaceAdminStatus, - opcua:InterfaceOperStatus ; + opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "Down" . -opcua:EgressPortNotAvbCapable a opcua:TsnFailureCode ; +opcua:EgressPortNotAvbCapable a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "EgressPortNotAvbCapable" . -opcua:ElementAdd a opcua:PubSubConfigurationRefMask ; +opcua:ElementAdd a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ElementAdd" . -opcua:ElementMatch a opcua:PubSubConfigurationRefMask ; +opcua:ElementMatch a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ElementMatch" . -opcua:ElementModify a opcua:PubSubConfigurationRefMask ; +opcua:ElementModify a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ElementModify" . -opcua:ElementRemove a opcua:PubSubConfigurationRefMask ; +opcua:ElementRemove a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ElementRemove" . -opcua:EncryptionRequired a opcua:AccessRestrictionType ; +opcua:EncryptionRequired a opcua:AccessRestrictionType, + owl:NamedIndividual ; base:hasFieldName "EncryptionRequired" . -opcua:Equals a opcua:FilterOperator ; +opcua:Equals a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Equals" . -opcua:EraseExisting a opcua:OpenFileMode ; +opcua:EraseExisting a opcua:OpenFileMode, + owl:NamedIndividual ; base:hasFieldName "EraseExisting" . -opcua:EventFields a opcua:HistoryEventFieldList ; +opcua:EventFields a opcua:HistoryEventFieldList, + owl:NamedIndividual ; base:hasFieldName "EventFields" . -opcua:ExactlyOnce a opcua:BrokerTransportQualityOfService ; +opcua:ExactlyOnce a opcua:BrokerTransportQualityOfService, + owl:NamedIndividual ; base:hasFieldName "ExactlyOnce" . opcua:Executable a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "Executable" . opcua:Failed a opcua:NegotiationStatus, opcua:ServerState, opcua:TsnListenerStatus, - opcua:TsnTalkerStatus ; + opcua:TsnTalkerStatus, + owl:NamedIndividual ; base:hasFieldName "Failed" . -opcua:FeatureNotPropagated a opcua:TsnFailureCode ; +opcua:FeatureNotPropagated a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "FeatureNotPropagated" . -opcua:FeatureNotSupported a opcua:TsnFailureCode ; +opcua:FeatureNotSupported a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "FeatureNotSupported" . -opcua:FirstValueChangedForStreamId a opcua:TsnFailureCode ; +opcua:FirstValueChangedForStreamId a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "FirstValueChangedForStreamId" . -opcua:Full a opcua:Duplex ; +opcua:Full a opcua:Duplex, + owl:NamedIndividual ; base:hasFieldName "Full" . -opcua:GreaterThan a opcua:FilterOperator ; +opcua:GreaterThan a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "GreaterThan" . -opcua:GreaterThanOrEqual a opcua:FilterOperator ; +opcua:GreaterThanOrEqual a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "GreaterThanOrEqual" . -opcua:GroupHeader a opcua:UadpNetworkMessageContentMask ; +opcua:GroupHeader a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "GroupHeader" . -opcua:GroupId a opcua:IdentityCriteriaType ; +opcua:GroupId a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "GroupId" . -opcua:Half a opcua:Duplex ; +opcua:Half a opcua:Duplex, + owl:NamedIndividual ; base:hasFieldName "Half" . opcua:Historizing a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "Historizing" . opcua:HistoryRead a opcua:AccessLevelExType, opcua:AccessLevelType, - opcua:EventNotifierType ; + opcua:EventNotifierType, + owl:NamedIndividual ; base:hasFieldName "HistoryRead" . opcua:HistoryWrite a opcua:AccessLevelExType, opcua:AccessLevelType, - opcua:EventNotifierType ; + opcua:EventNotifierType, + owl:NamedIndividual ; base:hasFieldName "HistoryWrite" . -opcua:Hot a opcua:RedundancySupport ; +opcua:Hot a opcua:RedundancySupport, + owl:NamedIndividual ; base:hasFieldName "Hot" . -opcua:HotAndMirrored a opcua:RedundancySupport ; +opcua:HotAndMirrored a opcua:RedundancySupport, + owl:NamedIndividual ; base:hasFieldName "HotAndMirrored" . -opcua:InList a opcua:FilterOperator ; +opcua:InList a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "InList" . -opcua:InProgress a opcua:NegotiationStatus ; +opcua:InProgress a opcua:NegotiationStatus, + owl:NamedIndividual ; base:hasFieldName "InProgress" . -opcua:InView a opcua:FilterOperator ; +opcua:InView a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "InView" . -opcua:Info a opcua:DiagnosticsLevel ; +opcua:Info a opcua:DiagnosticsLevel, + owl:NamedIndividual ; base:hasFieldName "Info" . -opcua:Information a opcua:PubSubDiagnosticsCounterClassification ; +opcua:Information a opcua:PubSubDiagnosticsCounterClassification, + owl:NamedIndividual ; base:hasFieldName "Information" . opcua:Insert a opcua:HistoryUpdateType, - opcua:PerformUpdateType ; + opcua:PerformUpdateType, + owl:NamedIndividual ; base:hasFieldName "Insert" . -opcua:InsertHistory a opcua:PermissionType ; +opcua:InsertHistory a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "InsertHistory" . -opcua:InsufficientBandwidth a opcua:TsnFailureCode ; +opcua:InsufficientBandwidth a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "InsufficientBandwidth" . -opcua:InsufficientResources a opcua:TsnFailureCode ; +opcua:InsufficientResources a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "InsufficientResources" . -opcua:InsufficientTrafficClassBandwidth a opcua:TsnFailureCode ; +opcua:InsufficientTrafficClassBandwidth a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "InsufficientTrafficClassBandwidth" . -opcua:Invalid a opcua:MessageSecurityMode ; +opcua:Invalid a opcua:MessageSecurityMode, + owl:NamedIndividual ; base:hasFieldName "Invalid" . opcua:InverseName a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "InverseName" . opcua:IsAbstract a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "IsAbstract" . -opcua:IsNull a opcua:FilterOperator ; +opcua:IsNull a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "IsNull" . -opcua:Issue a opcua:SecurityTokenRequestType ; +opcua:Issue a opcua:SecurityTokenRequestType, + owl:NamedIndividual ; base:hasFieldName "Issue" . -opcua:IssuedToken a opcua:UserTokenType ; +opcua:IssuedToken a opcua:UserTokenType, + owl:NamedIndividual ; base:hasFieldName "IssuedToken" . -opcua:LastMethodInputValues a opcua:ProgramDiagnostic2DataType ; +opcua:LastMethodInputValues a opcua:ProgramDiagnostic2DataType, + owl:NamedIndividual ; base:hasFieldName "LastMethodInputValues" . -opcua:LastMethodOutputValues a opcua:ProgramDiagnostic2DataType ; +opcua:LastMethodOutputValues a opcua:ProgramDiagnostic2DataType, + owl:NamedIndividual ; base:hasFieldName "LastMethodOutputValues" . -opcua:LastUsableValue a opcua:OverrideValueHandling ; +opcua:LastUsableValue a opcua:OverrideValueHandling, + owl:NamedIndividual ; base:hasFieldName "LastUsableValue" . -opcua:LatencyHasChanged a opcua:TsnFailureCode ; +opcua:LatencyHasChanged a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "LatencyHasChanged" . -opcua:LessThan a opcua:FilterOperator ; +opcua:LessThan a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "LessThan" . -opcua:LessThanOrEqual a opcua:FilterOperator ; +opcua:LessThanOrEqual a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "LessThanOrEqual" . -opcua:Like a opcua:FilterOperator ; +opcua:Like a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Like" . -opcua:Limited a opcua:ConversionLimitEnum ; +opcua:Limited a opcua:ConversionLimitEnum, + owl:NamedIndividual ; base:hasFieldName "Limited" . -opcua:Linear a opcua:AxisScaleEnumeration ; +opcua:Linear a opcua:AxisScaleEnumeration, + owl:NamedIndividual ; base:hasFieldName "Linear" . -opcua:Ln a opcua:AxisScaleEnumeration ; +opcua:Ln a opcua:AxisScaleEnumeration, + owl:NamedIndividual ; base:hasFieldName "Ln" . opcua:Log a opcua:AxisScaleEnumeration, - opcua:DiagnosticsLevel ; + opcua:DiagnosticsLevel, + owl:NamedIndividual ; base:hasFieldName "Log" . -opcua:LowerLayerDown a opcua:InterfaceOperStatus ; +opcua:LowerLayerDown a opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "LowerLayerDown" . -opcua:Mandatory a opcua:NamingRuleType ; +opcua:Mandatory a opcua:NamingRuleType, + owl:NamedIndividual ; base:hasFieldName "Mandatory" . -opcua:MaxFanInPortsLimitReached a opcua:TsnFailureCode ; +opcua:MaxFanInPortsLimitReached a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "MaxFanInPortsLimitReached" . -opcua:MaxFrameSizeTooLarge a opcua:TsnFailureCode ; +opcua:MaxFrameSizeTooLarge a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "MaxFrameSizeTooLarge" . -opcua:MaxLatencyExceeded a opcua:TsnFailureCode ; +opcua:MaxLatencyExceeded a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "MaxLatencyExceeded" . -opcua:MessageType a opcua:JsonDataSetMessageContentMask ; +opcua:MessageType a opcua:JsonDataSetMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "MessageType" . -opcua:MetaDataVersion a opcua:JsonDataSetMessageContentMask ; +opcua:MetaDataVersion a opcua:JsonDataSetMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "MetaDataVersion" . opcua:Method a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "Method" . opcua:MinimumSamplingInterval a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "MinimumSamplingInterval" . -opcua:ModifyHistory a opcua:PermissionType ; +opcua:ModifyHistory a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "ModifyHistory" . -opcua:MustChangePassword a opcua:UserConfigurationMask ; +opcua:MustChangePassword a opcua:UserConfigurationMask, + owl:NamedIndividual ; base:hasFieldName "MustChangePassword" . -opcua:NetworkMessageHeader a opcua:JsonNetworkMessageContentMask ; +opcua:NetworkMessageHeader a opcua:JsonNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "NetworkMessageHeader" . -opcua:NoChangeByUser a opcua:UserConfigurationMask ; +opcua:NoChangeByUser a opcua:UserConfigurationMask, + owl:NamedIndividual ; base:hasFieldName "NoChangeByUser" . -opcua:NoConfiguration a opcua:ServerState ; +opcua:NoConfiguration a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "NoConfiguration" . -opcua:NoConversion a opcua:ConversionLimitEnum ; +opcua:NoConversion a opcua:ConversionLimitEnum, + owl:NamedIndividual ; base:hasFieldName "NoConversion" . -opcua:NoDelete a opcua:UserConfigurationMask ; +opcua:NoDelete a opcua:UserConfigurationMask, + owl:NamedIndividual ; base:hasFieldName "NoDelete" . -opcua:NoFailure a opcua:TsnFailureCode ; +opcua:NoFailure a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "NoFailure" . -opcua:NoNegotiation a opcua:NegotiationStatus ; +opcua:NoNegotiation a opcua:NegotiationStatus, + owl:NamedIndividual ; base:hasFieldName "NoNegotiation" . -opcua:NoSubDataTypes a opcua:AccessLevelExType ; +opcua:NoSubDataTypes a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "NoSubDataTypes" . -opcua:NonVolatile a opcua:AccessLevelExType ; +opcua:NonVolatile a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "NonVolatile" . -opcua:NonatomicRead a opcua:AccessLevelExType ; +opcua:NonatomicRead a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "NonatomicRead" . -opcua:NonatomicWrite a opcua:AccessLevelExType ; +opcua:NonatomicWrite a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "NonatomicWrite" . opcua:None a opcua:MessageSecurityMode, @@ -435,423 +567,550 @@ opcua:None a opcua:MessageSecurityMode, opcua:RedundancySupport, opcua:TrustListMasks, opcua:TsnListenerStatus, - opcua:TsnTalkerStatus ; + opcua:TsnTalkerStatus, + owl:NamedIndividual ; base:hasFieldName "None" . -opcua:Not a opcua:FilterOperator ; +opcua:Not a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Not" . -opcua:NotPresent a opcua:InterfaceOperStatus ; +opcua:NotPresent a opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "NotPresent" . -opcua:NotSpecified a opcua:BrokerTransportQualityOfService ; +opcua:NotSpecified a opcua:BrokerTransportQualityOfService, + owl:NamedIndividual ; base:hasFieldName "NotSpecified" . -opcua:Numeric a opcua:IdType ; +opcua:Numeric a opcua:IdType, + owl:NamedIndividual ; base:hasFieldName "Numeric" . opcua:Object a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "Object" . opcua:ObjectType a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "ObjectType" . -opcua:OfType a opcua:FilterOperator ; +opcua:OfType a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "OfType" . -opcua:Opaque a opcua:IdType ; +opcua:Opaque a opcua:IdType, + owl:NamedIndividual ; base:hasFieldName "Opaque" . opcua:Operational a opcua:PubSubState, - opcua:TsnStreamState ; + opcua:TsnStreamState, + owl:NamedIndividual ; base:hasFieldName "Operational" . -opcua:Optional a opcua:NamingRuleType ; +opcua:Optional a opcua:NamingRuleType, + owl:NamedIndividual ; base:hasFieldName "Optional" . -opcua:Or a opcua:FilterOperator ; +opcua:Or a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "Or" . -opcua:OutOfMmrpResources a opcua:TsnFailureCode ; +opcua:OutOfMmrpResources a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "OutOfMmrpResources" . -opcua:OutOfMsrpResources a opcua:TsnFailureCode ; +opcua:OutOfMsrpResources a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "OutOfMsrpResources" . opcua:OverrideValue a opcua:FieldTargetDataType, - opcua:OverrideValueHandling ; + opcua:OverrideValueHandling, + owl:NamedIndividual ; base:hasFieldName "OverrideValue" . -opcua:PartialFailed a opcua:TsnListenerStatus ; +opcua:PartialFailed a opcua:TsnListenerStatus, + owl:NamedIndividual ; base:hasFieldName "PartialFailed" . -opcua:Paused a opcua:PubSubState ; +opcua:Paused a opcua:PubSubState, + owl:NamedIndividual ; base:hasFieldName "Paused" . -opcua:PayloadHeader a opcua:UadpNetworkMessageContentMask ; +opcua:PayloadHeader a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "PayloadHeader" . -opcua:PercentOfEURange a opcua:ExceptionDeviationFormat ; +opcua:PercentOfEURange a opcua:ExceptionDeviationFormat, + owl:NamedIndividual ; base:hasFieldName "PercentOfEURange" . -opcua:PercentOfRange a opcua:ExceptionDeviationFormat ; +opcua:PercentOfRange a opcua:ExceptionDeviationFormat, + owl:NamedIndividual ; base:hasFieldName "PercentOfRange" . -opcua:PercentOfValue a opcua:ExceptionDeviationFormat ; +opcua:PercentOfValue a opcua:ExceptionDeviationFormat, + owl:NamedIndividual ; base:hasFieldName "PercentOfValue" . opcua:PicoSeconds a opcua:UadpDataSetMessageContentMask, - opcua:UadpNetworkMessageContentMask ; + opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "PicoSeconds" . -opcua:PreOperational a opcua:PubSubState ; +opcua:PreOperational a opcua:PubSubState, + owl:NamedIndividual ; base:hasFieldName "PreOperational" . -opcua:PrimaryOnly a opcua:RedundantServerMode ; +opcua:PrimaryOnly a opcua:RedundantServerMode, + owl:NamedIndividual ; base:hasFieldName "PrimaryOnly" . -opcua:PrimaryWithBackup a opcua:RedundantServerMode ; +opcua:PrimaryWithBackup a opcua:RedundantServerMode, + owl:NamedIndividual ; base:hasFieldName "PrimaryWithBackup" . -opcua:PriorityIsNotAnSrcClass a opcua:TsnFailureCode ; +opcua:PriorityIsNotAnSrcClass a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "PriorityIsNotAnSrcClass" . -opcua:PromotedField a opcua:DataSetFieldFlags ; +opcua:PromotedField a opcua:DataSetFieldFlags, + owl:NamedIndividual ; base:hasFieldName "PromotedField" . -opcua:PromotedFields a opcua:UadpNetworkMessageContentMask ; +opcua:PromotedFields a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "PromotedFields" . opcua:PublisherId a opcua:DataSetReaderDataType, opcua:JsonDataSetMessageContentMask, opcua:JsonNetworkMessageContentMask, opcua:PubSubConnectionDataType, - opcua:UadpNetworkMessageContentMask ; + opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "PublisherId" . -opcua:RawData a opcua:DataSetFieldContentMask ; +opcua:RawData a opcua:DataSetFieldContentMask, + owl:NamedIndividual ; base:hasFieldName "RawData" . opcua:Read a opcua:OpenFileMode, - opcua:PermissionType ; + opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "Read" . -opcua:ReadHistory a opcua:PermissionType ; +opcua:ReadHistory a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "ReadHistory" . -opcua:ReadRolePermissions a opcua:PermissionType ; +opcua:ReadRolePermissions a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "ReadRolePermissions" . opcua:Ready a opcua:TsnListenerStatus, opcua:TsnStreamState, - opcua:TsnTalkerStatus ; + opcua:TsnTalkerStatus, + owl:NamedIndividual ; base:hasFieldName "Ready" . -opcua:ReceiveEvents a opcua:PermissionType ; +opcua:ReceiveEvents a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "ReceiveEvents" . -opcua:ReferenceConnection a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceConnection a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceConnection" . -opcua:ReferencePubDataset a opcua:PubSubConfigurationRefMask ; +opcua:ReferencePubDataset a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferencePubDataset" . -opcua:ReferencePushTarget a opcua:PubSubConfigurationRefMask ; +opcua:ReferencePushTarget a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferencePushTarget" . -opcua:ReferenceReader a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceReader a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceReader" . -opcua:ReferenceReaderGroup a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceReaderGroup a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceReaderGroup" . -opcua:ReferenceSecurityGroup a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceSecurityGroup a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceSecurityGroup" . -opcua:ReferenceSubDataset a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceSubDataset a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceSubDataset" . -opcua:ReferenceWriter a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceWriter a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceWriter" . -opcua:ReferenceWriterGroup a opcua:PubSubConfigurationRefMask ; +opcua:ReferenceWriterGroup a opcua:PubSubConfigurationRefMask, + owl:NamedIndividual ; base:hasFieldName "ReferenceWriterGroup" . -opcua:RelatedTo a opcua:FilterOperator ; +opcua:RelatedTo a opcua:FilterOperator, + owl:NamedIndividual ; base:hasFieldName "RelatedTo" . -opcua:Remove a opcua:PerformUpdateType ; +opcua:Remove a opcua:PerformUpdateType, + owl:NamedIndividual ; base:hasFieldName "Remove" . -opcua:RemoveReference a opcua:PermissionType ; +opcua:RemoveReference a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "RemoveReference" . -opcua:Renew a opcua:SecurityTokenRequestType ; +opcua:Renew a opcua:SecurityTokenRequestType, + owl:NamedIndividual ; base:hasFieldName "Renew" . opcua:Replace a opcua:HistoryUpdateType, - opcua:PerformUpdateType ; + opcua:PerformUpdateType, + owl:NamedIndividual ; base:hasFieldName "Replace" . -opcua:ReplyTo a opcua:JsonNetworkMessageContentMask ; +opcua:ReplyTo a opcua:JsonNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "ReplyTo" . -opcua:RequiresDigitCharacters a opcua:PasswordOptionsMask ; +opcua:RequiresDigitCharacters a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "RequiresDigitCharacters" . -opcua:RequiresLowerCaseCharacters a opcua:PasswordOptionsMask ; +opcua:RequiresLowerCaseCharacters a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "RequiresLowerCaseCharacters" . -opcua:RequiresSpecialCharacters a opcua:PasswordOptionsMask ; +opcua:RequiresSpecialCharacters a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "RequiresSpecialCharacters" . -opcua:RequiresUpperCaseCharacters a opcua:PasswordOptionsMask ; +opcua:RequiresUpperCaseCharacters a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "RequiresUpperCaseCharacters" . -opcua:ReversibleFieldEncoding a opcua:JsonDataSetMessageContentMask ; +opcua:ReversibleFieldEncoding a opcua:JsonDataSetMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "ReversibleFieldEncoding" . -opcua:Role a opcua:IdentityCriteriaType ; +opcua:Role a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "Role" . -opcua:Running a opcua:ServerState ; +opcua:Running a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "Running" . opcua:SemanticChange a opcua:AccessLevelExType, - opcua:AccessLevelType ; + opcua:AccessLevelType, + owl:NamedIndividual ; base:hasFieldName "SemanticChange" . opcua:SequenceNumber a opcua:JsonDataSetMessageContentMask, opcua:UadpDataSetMessageContentMask, - opcua:UadpNetworkMessageContentMask ; + opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "SequenceNumber" . -opcua:ServerPicoSeconds a opcua:DataSetFieldContentMask ; +opcua:ServerPicoSeconds a opcua:DataSetFieldContentMask, + owl:NamedIndividual ; base:hasFieldName "ServerPicoSeconds" . -opcua:ServerTimestamp a opcua:DataSetFieldContentMask ; +opcua:ServerTimestamp a opcua:DataSetFieldContentMask, + owl:NamedIndividual ; base:hasFieldName "ServerTimestamp" . -opcua:SessionRequired a opcua:AccessRestrictionType ; +opcua:SessionRequired a opcua:AccessRestrictionType, + owl:NamedIndividual ; base:hasFieldName "SessionRequired" . -opcua:Shutdown a opcua:ServerState ; +opcua:Shutdown a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "Shutdown" . -opcua:Sign a opcua:MessageSecurityMode ; +opcua:Sign a opcua:MessageSecurityMode, + owl:NamedIndividual ; base:hasFieldName "Sign" . -opcua:SignAndEncrypt a opcua:MessageSecurityMode ; +opcua:SignAndEncrypt a opcua:MessageSecurityMode, + owl:NamedIndividual ; base:hasFieldName "SignAndEncrypt" . -opcua:SigningRequired a opcua:AccessRestrictionType ; +opcua:SigningRequired a opcua:AccessRestrictionType, + owl:NamedIndividual ; base:hasFieldName "SigningRequired" . -opcua:SingleDataSetMessage a opcua:JsonNetworkMessageContentMask ; +opcua:SingleDataSetMessage a opcua:JsonNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "SingleDataSetMessage" . -opcua:SourcePicoSeconds a opcua:DataSetFieldContentMask ; +opcua:SourcePicoSeconds a opcua:DataSetFieldContentMask, + owl:NamedIndividual ; base:hasFieldName "SourcePicoSeconds" . -opcua:SourceTimestamp a opcua:DataSetFieldContentMask ; +opcua:SourceTimestamp a opcua:DataSetFieldContentMask, + owl:NamedIndividual ; base:hasFieldName "SourceTimestamp" . -opcua:SrClassPriorityMismatch a opcua:TsnFailureCode ; +opcua:SrClassPriorityMismatch a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "SrClassPriorityMismatch" . opcua:Status a opcua:JsonDataSetMessageContentMask, - opcua:UadpDataSetMessageContentMask ; + opcua:UadpDataSetMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "Status" . opcua:StatusWrite a opcua:AccessLevelExType, - opcua:AccessLevelType ; + opcua:AccessLevelType, + owl:NamedIndividual ; base:hasFieldName "StatusWrite" . -opcua:StreamDestinationAddressInUse a opcua:TsnFailureCode ; +opcua:StreamDestinationAddressInUse a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "StreamDestinationAddressInUse" . -opcua:StreamIdInUse a opcua:TsnFailureCode ; +opcua:StreamIdInUse a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "StreamIdInUse" . -opcua:StreamIdTypeNotSupported a opcua:TsnFailureCode ; +opcua:StreamIdTypeNotSupported a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "StreamIdTypeNotSupported" . -opcua:StreamPreemptedByHigherRank a opcua:TsnFailureCode ; +opcua:StreamPreemptedByHigherRank a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "StreamPreemptedByHigherRank" . -opcua:StreamTransformNotSupported a opcua:TsnFailureCode ; +opcua:StreamTransformNotSupported a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "StreamTransformNotSupported" . -opcua:StructureWithOptionalFields a opcua:StructureType ; +opcua:StructureWithOptionalFields a opcua:StructureType, + owl:NamedIndividual ; base:hasFieldName "StructureWithOptionalFields" . -opcua:StructureWithSubtypedValues a opcua:StructureType ; +opcua:StructureWithSubtypedValues a opcua:StructureType, + owl:NamedIndividual ; base:hasFieldName "StructureWithSubtypedValues" . -opcua:SubscribeToEvents a opcua:EventNotifierType ; +opcua:SubscribeToEvents a opcua:EventNotifierType, + owl:NamedIndividual ; base:hasFieldName "SubscribeToEvents" . -opcua:SubstituteValue a opcua:PublishedVariableDataType ; +opcua:SubstituteValue a opcua:PublishedVariableDataType, + owl:NamedIndividual ; base:hasFieldName "SubstituteValue" . -opcua:SupportDescriptionForUser a opcua:PasswordOptionsMask ; +opcua:SupportDescriptionForUser a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "SupportDescriptionForUser" . -opcua:SupportDisableDeleteForUser a opcua:PasswordOptionsMask ; +opcua:SupportDisableDeleteForUser a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "SupportDisableDeleteForUser" . -opcua:SupportDisableUser a opcua:PasswordOptionsMask ; +opcua:SupportDisableUser a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "SupportDisableUser" . -opcua:SupportInitialPasswordChange a opcua:PasswordOptionsMask ; +opcua:SupportInitialPasswordChange a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "SupportInitialPasswordChange" . -opcua:SupportNoChangeForUser a opcua:PasswordOptionsMask ; +opcua:SupportNoChangeForUser a opcua:PasswordOptionsMask, + owl:NamedIndividual ; base:hasFieldName "SupportNoChangeForUser" . -opcua:SuppressCertificateExpired a opcua:TrustListValidationOptions ; +opcua:SuppressCertificateExpired a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "SuppressCertificateExpired" . -opcua:SuppressHostNameInvalid a opcua:TrustListValidationOptions ; +opcua:SuppressHostNameInvalid a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "SuppressHostNameInvalid" . -opcua:SuppressIssuerCertificateExpired a opcua:TrustListValidationOptions ; +opcua:SuppressIssuerCertificateExpired a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "SuppressIssuerCertificateExpired" . -opcua:SuppressIssuerRevocationStatusUnknown a opcua:TrustListValidationOptions ; +opcua:SuppressIssuerRevocationStatusUnknown a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "SuppressIssuerRevocationStatusUnknown" . -opcua:SuppressRevocationStatusUnknown a opcua:TrustListValidationOptions ; +opcua:SuppressRevocationStatusUnknown a opcua:TrustListValidationOptions, + owl:NamedIndividual ; base:hasFieldName "SuppressRevocationStatusUnknown" . -opcua:Suspended a opcua:ServerState ; +opcua:Suspended a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "Suspended" . opcua:Symmetric a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "Symmetric" . -opcua:Test a opcua:ServerState ; +opcua:Test a opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "Test" . opcua:Testing a opcua:InterfaceAdminStatus, - opcua:InterfaceOperStatus ; + opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "Testing" . -opcua:Thumbprint a opcua:IdentityCriteriaType ; +opcua:Thumbprint a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "Thumbprint" . opcua:Timestamp a opcua:JsonDataSetMessageContentMask, opcua:UadpDataSetMessageContentMask, - opcua:UadpNetworkMessageContentMask ; + opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "Timestamp" . opcua:TimestampWrite a opcua:AccessLevelExType, - opcua:AccessLevelType ; + opcua:AccessLevelType, + owl:NamedIndividual ; base:hasFieldName "TimestampWrite" . -opcua:Transparent a opcua:RedundancySupport ; +opcua:Transparent a opcua:RedundancySupport, + owl:NamedIndividual ; base:hasFieldName "Transparent" . -opcua:Unacknowledged a opcua:AlarmMask ; +opcua:Unacknowledged a opcua:AlarmMask, + owl:NamedIndividual ; base:hasFieldName "Unacknowledged" . -opcua:Unconfirmed a opcua:AlarmMask ; +opcua:Unconfirmed a opcua:AlarmMask, + owl:NamedIndividual ; base:hasFieldName "Unconfirmed" . -opcua:Undefined a opcua:DataSetOrderingType ; +opcua:Undefined a opcua:DataSetOrderingType, + owl:NamedIndividual ; base:hasFieldName "Undefined" . -opcua:UnionWithSubtypedValues a opcua:StructureType ; +opcua:UnionWithSubtypedValues a opcua:StructureType, + owl:NamedIndividual ; base:hasFieldName "UnionWithSubtypedValues" . opcua:Unknown a opcua:Duplex, opcua:ExceptionDeviationFormat, opcua:InterfaceOperStatus, opcua:NegotiationStatus, - opcua:ServerState ; + opcua:ServerState, + owl:NamedIndividual ; base:hasFieldName "Unknown" . -opcua:Unlimited a opcua:ConversionLimitEnum ; +opcua:Unlimited a opcua:ConversionLimitEnum, + owl:NamedIndividual ; base:hasFieldName "Unlimited" . -opcua:Unspecified a opcua:NodeClass ; +opcua:Unspecified a opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "Unspecified" . opcua:Up a opcua:InterfaceAdminStatus, - opcua:InterfaceOperStatus ; + opcua:InterfaceOperStatus, + owl:NamedIndividual ; base:hasFieldName "Up" . opcua:Update a opcua:HistoryUpdateType, - opcua:PerformUpdateType ; + opcua:PerformUpdateType, + owl:NamedIndividual ; base:hasFieldName "Update" . -opcua:UseDifferentDestinationAddress a opcua:TsnFailureCode ; +opcua:UseDifferentDestinationAddress a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "UseDifferentDestinationAddress" . opcua:UserAccessLevel a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "UserAccessLevel" . opcua:UserExecutable a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "UserExecutable" . opcua:UserWriteMask a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "UserWriteMask" . -opcua:ValueForVariableType a opcua:AttributeWriteMask ; +opcua:ValueForVariableType a opcua:AttributeWriteMask, + owl:NamedIndividual ; base:hasFieldName "ValueForVariableType" . opcua:Variable a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "Variable" . opcua:VariableType a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "VariableType" . opcua:View a opcua:NodeAttributesMask, - opcua:NodeClass ; + opcua:NodeClass, + owl:NamedIndividual ; base:hasFieldName "View" . -opcua:VlanBlockedOnEgress a opcua:TsnFailureCode ; +opcua:VlanBlockedOnEgress a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "VlanBlockedOnEgress" . -opcua:VlanTaggingDisabledOnEgress a opcua:TsnFailureCode ; +opcua:VlanTaggingDisabledOnEgress a opcua:TsnFailureCode, + owl:NamedIndividual ; base:hasFieldName "VlanTaggingDisabledOnEgress" . -opcua:Warm a opcua:RedundancySupport ; +opcua:Warm a opcua:RedundancySupport, + owl:NamedIndividual ; base:hasFieldName "Warm" . opcua:Write a opcua:OpenFileMode, - opcua:PermissionType ; + opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "Write" . -opcua:WriteAttribute a opcua:PermissionType ; +opcua:WriteAttribute a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "WriteAttribute" . -opcua:WriteFullArrayOnly a opcua:AccessLevelExType ; +opcua:WriteFullArrayOnly a opcua:AccessLevelExType, + owl:NamedIndividual ; base:hasFieldName "WriteFullArrayOnly" . -opcua:WriteHistorizing a opcua:PermissionType ; +opcua:WriteHistorizing a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "WriteHistorizing" . opcua:WriteMask a opcua:AttributeWriteMask, - opcua:NodeAttributesMask ; + opcua:NodeAttributesMask, + owl:NamedIndividual ; base:hasFieldName "WriteMask" . -opcua:WriteRolePermissions a opcua:PermissionType ; +opcua:WriteRolePermissions a opcua:PermissionType, + owl:NamedIndividual ; base:hasFieldName "WriteRolePermissions" . opcua:WriterGroupName a opcua:JsonDataSetMessageContentMask, - opcua:JsonNetworkMessageContentMask ; + opcua:JsonNetworkMessageContentMask, + owl:NamedIndividual ; base:hasFieldName "WriterGroupName" . -opcua:X509Subject a opcua:IdentityCriteriaType ; +opcua:X509Subject a opcua:IdentityCriteriaType, + owl:NamedIndividual ; base:hasFieldName "X509Subject" . opcua:nodei1 a opcua:DataTypeNodeClass ; @@ -8424,23 +8683,28 @@ opcua:3DFrameType a owl:Class ; opcua:3DVectorType a owl:Class ; rdfs:subClassOf opcua:VectorType . -opcua:A a base:Field ; +opcua:A a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "A" . -opcua:AbsoluteTemperatureExponent a base:Field ; +opcua:AbsoluteTemperatureExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "AbsoluteTemperatureExponent" . -opcua:ActualSessionTimeout a base:Field ; +opcua:ActualSessionTimeout a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "ActualSessionTimeout" . -opcua:AddNodesCount a base:Field ; +opcua:AddNodesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "AddNodesCount" . -opcua:AddReferencesCount a base:Field ; +opcua:AddReferencesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "AddReferencesCount" . @@ -8469,7 +8733,8 @@ opcua:AlarmSuppressionGroupMember a owl:Class, opcua:AlarmSuppressionGroupType a owl:Class ; rdfs:subClassOf opcua:AlarmGroupType . -opcua:Alias a base:Field ; +opcua:Alias a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Alias" . @@ -8477,7 +8742,8 @@ opcua:AliasFor a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:NonHierarchicalReferences . -opcua:AliasName a base:Field ; +opcua:AliasName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "AliasName" . @@ -8486,7 +8752,8 @@ opcua:AliasNameDataType a owl:Class ; base:hasField opcua:AliasName, opcua:ReferencedNodes . -opcua:AlphabeticCode a base:Field ; +opcua:AlphabeticCode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "AlphabeticCode" . @@ -8494,21 +8761,24 @@ opcua:AlwaysGeneratesEvent a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:GeneratesEvent . -opcua:AmountOfSubstanceExponent a base:Field ; +opcua:AmountOfSubstanceExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "AmountOfSubstanceExponent" . opcua:AnalogUnitRangeType a owl:Class ; rdfs:subClassOf opcua:AnalogItemType . -opcua:AnnotationTime a base:Field ; +opcua:AnnotationTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "AnnotationTime" . opcua:AnonymousIdentityToken a owl:Class ; rdfs:subClassOf opcua:UserIdentityToken . -opcua:ApplicationName a base:Field ; +opcua:ApplicationName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "ApplicationName" . @@ -8645,22 +8915,26 @@ opcua:AuditWriteUpdateEventType a owl:Class ; rdfs:subClassOf opcua:AuditUpdateEventType ; base:isAbstract "true" . -opcua:AuthenticationMechanism a base:Field ; +opcua:AuthenticationMechanism a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "AuthenticationMechanism" . opcua:AuthorizationServicesConfigurationFolderType a owl:Class ; rdfs:subClassOf opcua:FolderType . -opcua:AxisScaleType a base:Field ; +opcua:AxisScaleType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:AxisScaleEnumeration ; base:hasFieldName "AxisScaleType" . -opcua:AxisSteps a base:Field ; +opcua:AxisSteps a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "AxisSteps" . -opcua:B a base:Field ; +opcua:B a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "B" . @@ -8712,33 +8986,40 @@ opcua:BrokerWriterGroupTransportDataType a owl:Class ; opcua:BrokerWriterGroupTransportType a owl:Class ; rdfs:subClassOf opcua:WriterGroupTransportType . -opcua:BrowseCount a base:Field ; +opcua:BrowseCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "BrowseCount" . opcua:BrowseName a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "BrowseName" . -opcua:BrowseNextCount a base:Field ; +opcua:BrowseNextCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "BrowseNextCount" . -opcua:BuildDate a base:Field ; +opcua:BuildDate a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "BuildDate" . -opcua:BuildNumber a base:Field ; +opcua:BuildNumber a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "BuildNumber" . -opcua:C a base:Field ; +opcua:C a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "C" . -opcua:CallCount a base:Field ; +opcua:CallCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "CallCount" . @@ -8750,34 +9031,41 @@ opcua:CertificateUpdatedAuditEventType a owl:Class ; rdfs:subClassOf opcua:AuditEventType ; base:isAbstract "true" . -opcua:ChannelLifetime a base:Field ; +opcua:ChannelLifetime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "ChannelLifetime" . opcua:ChoiceStateType a owl:Class ; rdfs:subClassOf opcua:StateType . -opcua:ClientCertificate a base:Field ; +opcua:ClientCertificate a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "ClientCertificate" . -opcua:ClientConnectionTime a base:Field ; +opcua:ClientConnectionTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "ClientConnectionTime" . -opcua:ClientDescription a base:Field ; +opcua:ClientDescription a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ApplicationDescription ; base:hasFieldName "ClientDescription" . -opcua:ClientLastContactTime a base:Field ; +opcua:ClientLastContactTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "ClientLastContactTime" . -opcua:ClientUserIdHistory a base:Field ; +opcua:ClientUserIdHistory a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ClientUserIdHistory" . -opcua:ClientUserIdOfSession a base:Field ; +opcua:ClientUserIdOfSession a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ClientUserIdOfSession" . @@ -8786,31 +9074,38 @@ opcua:ComplexNumberType a owl:Class ; base:hasField opcua:Imaginary, opcua:Real . -opcua:ConfigurationElement a base:Field ; +opcua:ConfigurationElement a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PubSubConfigurationRefDataType ; base:hasFieldName "ConfigurationElement" . -opcua:ConfigurationMask a base:Field ; +opcua:ConfigurationMask a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PubSubConfigurationRefMask ; base:hasFieldName "ConfigurationMask" . -opcua:ConfigurationProperties a base:Field ; +opcua:ConfigurationProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "ConfigurationProperties" . -opcua:ConfiguredSize a base:Field ; +opcua:ConfiguredSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "ConfiguredSize" . -opcua:ConnectionIndex a base:Field ; +opcua:ConnectionIndex a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "ConnectionIndex" . -opcua:ConnectionProperties a base:Field ; +opcua:ConnectionProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "ConnectionProperties" . -opcua:Connections a base:Field ; +opcua:Connections a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PubSubConnectionDataType ; base:hasFieldName "Connections" . @@ -8824,94 +9119,116 @@ opcua:Controls a owl:Class, opcua:Counter a owl:Class ; rdfs:subClassOf opcua:UInt32 . -opcua:CreateMonitoredItemsCount a base:Field ; +opcua:CreateMonitoredItemsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "CreateMonitoredItemsCount" . -opcua:CreateSubscriptionCount a base:Field ; +opcua:CreateSubscriptionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "CreateSubscriptionCount" . -opcua:Criteria a base:Field ; +opcua:Criteria a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Criteria" . -opcua:CriteriaType a base:Field ; +opcua:CriteriaType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:IdentityCriteriaType ; base:hasFieldName "CriteriaType" . opcua:CubeItemType a owl:Class ; rdfs:subClassOf opcua:ArrayItemType . -opcua:CumulatedSessionCount a base:Field ; +opcua:CumulatedSessionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CumulatedSessionCount" . -opcua:CumulatedSubscriptionCount a base:Field ; +opcua:CumulatedSubscriptionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CumulatedSubscriptionCount" . -opcua:Currency a base:Field ; +opcua:Currency a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "Currency" . -opcua:CurrentKeepAliveCount a base:Field ; +opcua:CurrentKeepAliveCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentKeepAliveCount" . -opcua:CurrentLifetimeCount a base:Field ; +opcua:CurrentLifetimeCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentLifetimeCount" . -opcua:CurrentMonitoredItemsCount a base:Field ; +opcua:CurrentMonitoredItemsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentMonitoredItemsCount" . -opcua:CurrentPublishRequestsInQueue a base:Field ; +opcua:CurrentPublishRequestsInQueue a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentPublishRequestsInQueue" . -opcua:CurrentSessionCount a base:Field ; +opcua:CurrentSessionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentSessionCount" . -opcua:CurrentSubscriptionCount a base:Field ; +opcua:CurrentSubscriptionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentSubscriptionCount" . -opcua:CurrentSubscriptionsCount a base:Field ; +opcua:CurrentSubscriptionsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "CurrentSubscriptionsCount" . -opcua:CurrentTime a base:Field ; +opcua:CurrentTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "CurrentTime" . -opcua:CyclicDataSet a base:Field ; +opcua:CyclicDataSet a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "CyclicDataSet" . -opcua:DataChangeNotificationsCount a base:Field ; +opcua:DataChangeNotificationsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DataChangeNotificationsCount" . -opcua:DataSetClasses a base:Field ; +opcua:DataSetClasses a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetMetaDataType ; base:hasFieldName "DataSetClasses" . -opcua:DataSetOrdering a base:Field ; +opcua:DataSetOrdering a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetOrderingType ; base:hasFieldName "DataSetOrdering" . -opcua:DataSetReaderProperties a base:Field ; +opcua:DataSetReaderProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "DataSetReaderProperties" . -opcua:DataSetReaders a base:Field ; +opcua:DataSetReaders a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetReaderDataType ; base:hasFieldName "DataSetReaders" . -opcua:DataSetSource a base:Field ; +opcua:DataSetSource a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PublishedDataSetSourceDataType ; base:hasFieldName "DataSetSource" . @@ -8919,15 +9236,18 @@ opcua:DataSetToWriter a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HierarchicalReferences . -opcua:DataSetWriterProperties a base:Field ; +opcua:DataSetWriterProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "DataSetWriterProperties" . -opcua:DataSetWriters a base:Field ; +opcua:DataSetWriters a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetWriterDataType ; base:hasFieldName "DataSetWriters" . -opcua:DataTypeId a base:Field ; +opcua:DataTypeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "DataTypeId" . @@ -8965,15 +9285,18 @@ opcua:DatagramWriterGroupTransportType a owl:Class ; opcua:DateString a owl:Class ; rdfs:subClassOf opcua:String . -opcua:DaylightSavingInOffset a base:Field ; +opcua:DaylightSavingInOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "DaylightSavingInOffset" . -opcua:DeadbandType a base:Field ; +opcua:DeadbandType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DeadbandType" . -opcua:DeadbandValue a base:Field ; +opcua:DeadbandValue a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "DeadbandValue" . @@ -8983,35 +9306,43 @@ opcua:Decimal a owl:Class ; opcua:DecimalString a owl:Class ; rdfs:subClassOf opcua:String . -opcua:DefaultEncodingId a base:Field ; +opcua:DefaultEncodingId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "DefaultEncodingId" . -opcua:DefaultSecurityKeyServices a base:Field ; +opcua:DefaultSecurityKeyServices a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EndpointDescription ; base:hasFieldName "DefaultSecurityKeyServices" . -opcua:DeleteBidirectional a base:Field ; +opcua:DeleteBidirectional a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "DeleteBidirectional" . -opcua:DeleteMonitoredItemsCount a base:Field ; +opcua:DeleteMonitoredItemsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "DeleteMonitoredItemsCount" . -opcua:DeleteNodesCount a base:Field ; +opcua:DeleteNodesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "DeleteNodesCount" . -opcua:DeleteReferencesCount a base:Field ; +opcua:DeleteReferencesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "DeleteReferencesCount" . -opcua:DeleteSubscriptionsCount a base:Field ; +opcua:DeleteSubscriptionsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "DeleteSubscriptionsCount" . -opcua:DeleteTargetReferences a base:Field ; +opcua:DeleteTargetReferences a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "DeleteTargetReferences" . @@ -9022,42 +9353,51 @@ opcua:DeviceFailureEventType a owl:Class ; opcua:DialogConditionType a owl:Class ; rdfs:subClassOf opcua:ConditionType . -opcua:DimensionlessExponent a base:Field ; +opcua:DimensionlessExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "DimensionlessExponent" . -opcua:DisableCount a base:Field ; +opcua:DisableCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DisableCount" . -opcua:DiscardedMessageCount a base:Field ; +opcua:DiscardedMessageCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DiscardedMessageCount" . -opcua:Discipline a base:Field ; +opcua:Discipline a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Discipline" . -opcua:DiscoveryAddress a base:Field ; +opcua:DiscoveryAddress a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NetworkAddressDataType ; base:hasFieldName "DiscoveryAddress" . -opcua:DiscoveryMaxMessageSize a base:Field ; +opcua:DiscoveryMaxMessageSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DiscoveryMaxMessageSize" . -opcua:DiscoveryProfileUri a base:Field ; +opcua:DiscoveryProfileUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "DiscoveryProfileUri" . -opcua:DiscoveryUrl a base:Field ; +opcua:DiscoveryUrl a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "DiscoveryUrl" . opcua:DiscrepancyAlarmType a owl:Class ; rdfs:subClassOf opcua:AlarmConditionType . -opcua:Divisor a base:Field ; +opcua:Divisor a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Float ; base:hasFieldName "Divisor" . @@ -9069,7 +9409,8 @@ opcua:DoubleComplexNumberType a owl:Class ; opcua:DurationString a owl:Class ; rdfs:subClassOf opcua:String . -opcua:EURange a base:Field ; +opcua:EURange a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Range ; base:hasFieldName "EURange" . @@ -9091,11 +9432,13 @@ opcua:EccNistP256ApplicationCertificateType a owl:Class ; opcua:EccNistP384ApplicationCertificateType a owl:Class ; rdfs:subClassOf opcua:EccApplicationCertificateType . -opcua:ElectricCurrentExponent a base:Field ; +opcua:ElectricCurrentExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "ElectricCurrentExponent" . -opcua:ElementIndex a base:Field ; +opcua:ElementIndex a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "ElementIndex" . @@ -9106,18 +9449,21 @@ opcua:ElementOperand a owl:Class ; opcua:ElseGuardVariableType a owl:Class ; rdfs:subClassOf opcua:GuardVariableType . -opcua:EnableCount a base:Field ; +opcua:EnableCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "EnableCount" . opcua:EncodedTicket a owl:Class ; rdfs:subClassOf opcua:String . -opcua:Encoding a base:Field ; +opcua:Encoding a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Encoding" . -opcua:EndingBitPosition a base:Field ; +opcua:EndingBitPosition a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "EndingBitPosition" . @@ -9133,15 +9479,18 @@ opcua:EndpointConfiguration a owl:Class ; opcua:SecurityTokenLifetime, opcua:UseBinaryEncoding . -opcua:EndpointUrlList a base:Field ; +opcua:EndpointUrlList a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "EndpointUrlList" . -opcua:EngineeringUnits a base:Field ; +opcua:EngineeringUnits a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EUInformation ; base:hasFieldName "EngineeringUnits" . -opcua:EnumDataTypes a base:Field ; +opcua:EnumDataTypes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EnumDescription ; base:hasFieldName "EnumDataTypes" . @@ -9153,25 +9502,30 @@ opcua:EphemeralKeyType a owl:Class ; opcua:Error a opcua:PubSubDiagnosticsCounterClassification, opcua:PubSubState, opcua:TsnStreamState, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:StatusCode ; base:hasFieldName "Error" . -opcua:ErrorCount a base:Field ; +opcua:ErrorCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "ErrorCount" . -opcua:EventNotificationsCount a base:Field ; +opcua:EventNotificationsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "EventNotificationsCount" . opcua:EventNotifier a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "EventNotifier" . -opcua:EventQueueOverFlowCount a base:Field ; +opcua:EventQueueOverFlowCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "EventQueueOverFlowCount" . @@ -9179,7 +9533,8 @@ opcua:EventQueueOverflowEventType a owl:Class ; rdfs:subClassOf opcua:BaseEventType ; base:isAbstract "true" . -opcua:Events a base:Field ; +opcua:Events a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:HistoryEventFieldList ; base:hasFieldName "Events" . @@ -9192,34 +9547,41 @@ opcua:ExclusiveLevelAlarmType a owl:Class ; opcua:ExclusiveRateOfChangeAlarmType a owl:Class ; rdfs:subClassOf opcua:ExclusiveLimitAlarmType . -opcua:Exponent a base:Field ; +opcua:Exponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "Exponent" . opcua:ExpressionGuardVariableType a owl:Class ; rdfs:subClassOf opcua:GuardVariableType . -opcua:ExtensionFields a base:Field ; +opcua:ExtensionFields a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "ExtensionFields" . -opcua:FieldFlags a base:Field ; +opcua:FieldFlags a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetFieldFlags ; base:hasFieldName "FieldFlags" . -opcua:FileHeader a base:Field ; +opcua:FileHeader a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "FileHeader" . -opcua:Filter a base:Field ; +opcua:Filter a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ContentFilter ; base:hasFieldName "Filter" . -opcua:FilterOperands a base:Field ; +opcua:FilterOperands a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Structure ; base:hasFieldName "FilterOperands" . -opcua:FinalAddend a base:Field ; +opcua:FinalAddend a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Float ; base:hasFieldName "FinalAddend" . @@ -9231,7 +9593,8 @@ opcua:GeneralModelChangeEventType a owl:Class ; rdfs:subClassOf opcua:BaseModelChangeEventType ; base:isAbstract "true" . -opcua:GroupIndex a base:Field ; +opcua:GroupIndex a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "GroupIndex" . @@ -9398,7 +9761,8 @@ opcua:HasWriterGroup a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HasComponent . -opcua:High a base:Field ; +opcua:High a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "High" . @@ -9413,11 +9777,13 @@ opcua:HistoryModifiedEvent a owl:Class ; rdfs:subClassOf opcua:HistoryEvent ; base:hasField opcua:ModificationInfos . -opcua:HistoryReadCount a base:Field ; +opcua:HistoryReadCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "HistoryReadCount" . -opcua:HistoryUpdateCount a base:Field ; +opcua:HistoryUpdateCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "HistoryUpdateCount" . @@ -9485,6 +9851,7 @@ opcua:IVlanIdType a owl:Class ; base:isAbstract "true" . opcua:Identifier a opcua:PubSubConfigurationValueDataType, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "Identifier" . @@ -9507,11 +9874,13 @@ opcua:ImageJPG a owl:Class ; opcua:ImagePNG a owl:Class ; rdfs:subClassOf opcua:Image . -opcua:IncludeSubtypes a base:Field ; +opcua:IncludeSubtypes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "IncludeSubtypes" . -opcua:InitialAddend a base:Field ; +opcua:InitialAddend a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Float ; base:hasFieldName "InitialAddend" . @@ -9537,15 +9906,18 @@ opcua:IsHostedBy a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:Utilizes . -opcua:IsInverse a base:Field ; +opcua:IsInverse a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "IsInverse" . -opcua:IsOnline a base:Field ; +opcua:IsOnline a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "IsOnline" . -opcua:IsOptional a base:Field ; +opcua:IsOptional a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "IsOptional" . @@ -9558,21 +9930,25 @@ opcua:IssuedIdentityToken a owl:Class ; base:hasField opcua:EncryptionAlgorithm, opcua:TokenData . -opcua:IssuedTokenType a base:Field ; +opcua:IssuedTokenType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "IssuedTokenType" . opcua:IssuerCertificates a opcua:TrustListMasks, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "IssuerCertificates" . opcua:IssuerCrls a opcua:TrustListMasks, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "IssuerCrls" . -opcua:IssuerEndpointUrl a base:Field ; +opcua:IssuerEndpointUrl a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "IssuerEndpointUrl" . @@ -9598,11 +9974,13 @@ opcua:JsonWriterGroupMessageDataType a owl:Class ; opcua:JsonWriterGroupMessageType a owl:Class ; rdfs:subClassOf opcua:WriterGroupMessageType . -opcua:KeepAliveTime a base:Field ; +opcua:KeepAliveTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "KeepAliveTime" . -opcua:Key a base:Field ; +opcua:Key a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "Key" . @@ -9612,23 +9990,28 @@ opcua:KeyCredentialDeletedAuditEventType a owl:Class ; opcua:KeyCredentialUpdatedAuditEventType a owl:Class ; rdfs:subClassOf opcua:KeyCredentialAuditEventType . -opcua:KeyLifetime a base:Field ; +opcua:KeyLifetime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "KeyLifetime" . -opcua:LatePublishRequestCount a base:Field ; +opcua:LatePublishRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "LatePublishRequestCount" . -opcua:LengthExponent a base:Field ; +opcua:LengthExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "LengthExponent" . -opcua:Low a base:Field ; +opcua:Low a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "Low" . -opcua:LuminousIntensityExponent a base:Field ; +opcua:LuminousIntensityExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "LuminousIntensityExponent" . @@ -9637,67 +10020,83 @@ opcua:MaintenanceConditionClassType a owl:Class ; base:isAbstract "true" . opcua:MajorVersion a opcua:UadpDataSetMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:VersionTime ; base:hasFieldName "MajorVersion" . -opcua:ManufacturerName a base:Field ; +opcua:ManufacturerName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ManufacturerName" . -opcua:MappingUri a base:Field ; +opcua:MappingUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "MappingUri" . -opcua:MassExponent a base:Field ; +opcua:MassExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "MassExponent" . -opcua:MaxArrayLength a base:Field ; +opcua:MaxArrayLength a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "MaxArrayLength" . -opcua:MaxBufferSize a base:Field ; +opcua:MaxBufferSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "MaxBufferSize" . -opcua:MaxByteStringLength a base:Field ; +opcua:MaxByteStringLength a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "MaxByteStringLength" . -opcua:MaxFutureKeyCount a base:Field ; +opcua:MaxFutureKeyCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxFutureKeyCount" . -opcua:MaxKeepAliveCount a base:Field ; +opcua:MaxKeepAliveCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxKeepAliveCount" . -opcua:MaxLifetimeCount a base:Field ; +opcua:MaxLifetimeCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxLifetimeCount" . -opcua:MaxMessageSize a base:Field ; +opcua:MaxMessageSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "MaxMessageSize" . -opcua:MaxMonitoredItemCount a base:Field ; +opcua:MaxMonitoredItemCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxMonitoredItemCount" . -opcua:MaxNetworkMessageSize a base:Field ; +opcua:MaxNetworkMessageSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxNetworkMessageSize" . -opcua:MaxNotificationsPerPublish a base:Field ; +opcua:MaxNotificationsPerPublish a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxNotificationsPerPublish" . -opcua:MaxPastKeyCount a base:Field ; +opcua:MaxPastKeyCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxPastKeyCount" . -opcua:MaxResponseMessageSize a base:Field ; +opcua:MaxResponseMessageSize a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MaxResponseMessageSize" . @@ -9706,57 +10105,70 @@ opcua:MdnsDiscoveryConfiguration a owl:Class ; base:hasField opcua:MdnsServerName, opcua:ServerCapabilities . -opcua:MdnsServerName a base:Field ; +opcua:MdnsServerName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "MdnsServerName" . -opcua:MessageReceiveTimeout a base:Field ; +opcua:MessageReceiveTimeout a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "MessageReceiveTimeout" . -opcua:MessageRepeatCount a base:Field ; +opcua:MessageRepeatCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "MessageRepeatCount" . -opcua:MessageRepeatDelay a base:Field ; +opcua:MessageRepeatDelay a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "MessageRepeatDelay" . -opcua:MetaDataProperties a base:Field ; +opcua:MetaDataProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "MetaDataProperties" . -opcua:MetaDataUpdateTime a base:Field ; +opcua:MetaDataUpdateTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "MetaDataUpdateTime" . opcua:MinorVersion a opcua:JsonDataSetMessageContentMask, opcua:UadpDataSetMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:VersionTime ; base:hasFieldName "MinorVersion" . -opcua:ModificationInfos a base:Field ; +opcua:ModificationInfos a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ModificationInfo ; base:hasFieldName "ModificationInfos" . -opcua:ModificationTime a base:Field ; +opcua:ModificationTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "ModificationTime" . -opcua:ModifyCount a base:Field ; +opcua:ModifyCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "ModifyCount" . -opcua:ModifyMonitoredItemsCount a base:Field ; +opcua:ModifyMonitoredItemsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "ModifyMonitoredItemsCount" . -opcua:ModifySubscriptionCount a base:Field ; +opcua:ModifySubscriptionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "ModifySubscriptionCount" . -opcua:MonitoringQueueOverflowCount a base:Field ; +opcua:MonitoringQueueOverflowCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MonitoringQueueOverflowCount" . @@ -9766,14 +10178,16 @@ opcua:MultiStateDictionaryEntryDiscreteType a owl:Class ; opcua:MultiStateDiscreteType a owl:Class ; rdfs:subClassOf opcua:DiscreteItemType . -opcua:Multiplicand a base:Field ; +opcua:Multiplicand a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Float ; base:hasFieldName "Multiplicand" . opcua:NDimensionArrayItemType a owl:Class ; rdfs:subClassOf opcua:ArrayItemType . -opcua:Namespaces a base:Field ; +opcua:Namespaces a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Namespaces" . @@ -9784,19 +10198,23 @@ opcua:NetworkAddressUrlDataType a owl:Class ; opcua:NetworkAddressUrlType a owl:Class ; rdfs:subClassOf opcua:NetworkAddressType . -opcua:NetworkInterface a base:Field ; +opcua:NetworkInterface a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "NetworkInterface" . -opcua:NetworkPaths a base:Field ; +opcua:NetworkPaths a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EndpointUrlListDataType ; base:hasFieldName "NetworkPaths" . -opcua:NextSequenceNumber a base:Field ; +opcua:NextSequenceNumber a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "NextSequenceNumber" . -opcua:NodeAttributes a base:Field ; +opcua:NodeAttributes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Structure ; base:hasFieldName "NodeAttributes" . @@ -9818,19 +10236,23 @@ opcua:NonTransparentNetworkRedundancyType a owl:Class ; opcua:NormalizedString a owl:Class ; rdfs:subClassOf opcua:String . -opcua:NotificationsCount a base:Field ; +opcua:NotificationsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "NotificationsCount" . -opcua:NumericCode a base:Field ; +opcua:NumericCode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int16 ; base:hasFieldName "NumericCode" . -opcua:Offset a base:Field ; +opcua:Offset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int16 ; base:hasFieldName "Offset" . -opcua:OperationTimeout a base:Field ; +opcua:OperationTimeout a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "OperationTimeout" . @@ -9846,31 +10268,38 @@ opcua:OptionSetType a owl:Class ; opcua:OrderedListType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:Parameters a base:Field ; +opcua:Parameters a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "Parameters" . -opcua:ParentNodeId a base:Field ; +opcua:ParentNodeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId ; base:hasFieldName "ParentNodeId" . -opcua:ParentNodeName a base:Field ; +opcua:ParentNodeName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ParentNodeName" . -opcua:Password a base:Field ; +opcua:Password a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "Password" . -opcua:PercentDataBad a base:Field ; +opcua:PercentDataBad a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "PercentDataBad" . -opcua:PercentDataGood a base:Field ; +opcua:PercentDataGood a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "PercentDataGood" . -opcua:Permissions a base:Field ; +opcua:Permissions a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PermissionType ; base:hasFieldName "Permissions" . @@ -9887,11 +10316,13 @@ opcua:PortableQualifiedName a owl:Class ; opcua:PriorityMappingTableType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:PriorityValue_DSCP a base:Field ; +opcua:PriorityValue_DSCP a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "PriorityValue_DSCP" . -opcua:PriorityValue_PCP a base:Field ; +opcua:PriorityValue_PCP a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "PriorityValue_PCP" . @@ -9899,11 +10330,13 @@ opcua:ProcessConditionClassType a owl:Class ; rdfs:subClassOf opcua:BaseConditionClassType ; base:isAbstract "true" . -opcua:ProcessingOffset a base:Field ; +opcua:ProcessingOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "ProcessingOffset" . -opcua:ProductName a base:Field ; +opcua:ProductName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ProductName" . @@ -9924,7 +10357,8 @@ opcua:ProgressEventType a owl:Class ; rdfs:subClassOf opcua:BaseEventType ; base:isAbstract "true" . -opcua:Properties a base:Field ; +opcua:Properties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "Properties" . @@ -9942,7 +10376,8 @@ opcua:PubSubConfiguration2DataType a owl:Class ; opcua:SecurityGroups, opcua:SubscribedDataSets . -opcua:PubSubKeyPushTargets a base:Field ; +opcua:PubSubKeyPushTargets a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PubSubKeyPushTargetDataType ; base:hasFieldName "PubSubKeyPushTargets" . @@ -9950,19 +10385,23 @@ opcua:PubSubTransportLimitsExceedEventType a owl:Class ; rdfs:subClassOf opcua:PubSubStatusEventType ; base:isAbstract "true" . -opcua:PublicKey a base:Field ; +opcua:PublicKey a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "PublicKey" . -opcua:PublishCount a base:Field ; +opcua:PublishCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "PublishCount" . -opcua:PublishRequestCount a base:Field ; +opcua:PublishRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "PublishRequestCount" . -opcua:PublishedData a base:Field ; +opcua:PublishedData a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PublishedVariableDataType ; base:hasFieldName "PublishedData" . @@ -9977,7 +10416,8 @@ opcua:PublishedDataSetCustomSourceDataType a owl:Class ; rdfs:subClassOf opcua:PublishedDataSetSourceDataType ; base:hasField opcua:CyclicDataSet . -opcua:PublishedDataSets a base:Field ; +opcua:PublishedDataSets a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:PublishedDataSetDataType ; base:hasFieldName "PublishedDataSets" . @@ -9990,50 +10430,61 @@ opcua:PublishedEventsDataType a owl:Class ; opcua:PublishedEventsType a owl:Class ; rdfs:subClassOf opcua:PublishedDataSetType . -opcua:PublishedVariable a base:Field ; +opcua:PublishedVariable a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "PublishedVariable" . -opcua:PublishingEnabled a base:Field ; +opcua:PublishingEnabled a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "PublishingEnabled" . -opcua:PublishingIntervalCount a base:Field ; +opcua:PublishingIntervalCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "PublishingIntervalCount" . -opcua:PublishingOffset a base:Field ; +opcua:PublishingOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "PublishingOffset" . -opcua:PushTargetFolder a base:Field ; +opcua:PushTargetFolder a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "PushTargetFolder" . -opcua:PushTargetProperties a base:Field ; +opcua:PushTargetProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "PushTargetProperties" . -opcua:QueryFirstCount a base:Field ; +opcua:QueryFirstCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "QueryFirstCount" . -opcua:QueryNextCount a base:Field ; +opcua:QueryNextCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "QueryNextCount" . opcua:RationalNumberType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType . -opcua:ReadCount a base:Field ; +opcua:ReadCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "ReadCount" . -opcua:ReaderGroups a base:Field ; +opcua:ReaderGroups a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ReaderGroupDataType ; base:hasFieldName "ReaderGroups" . -opcua:ReceiveOffset a base:Field ; +opcua:ReceiveOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "ReceiveOffset" . @@ -10041,18 +10492,21 @@ opcua:ReceiveQosPriorityDataType a owl:Class ; rdfs:subClassOf opcua:ReceiveQosDataType ; base:hasField opcua:PriorityLabel . -opcua:ReceiverIndexRange a base:Field ; +opcua:ReceiverIndexRange a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NumericRange ; base:hasFieldName "ReceiverIndexRange" . -opcua:RecordId a base:Field ; +opcua:RecordId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RecordId" . opcua:ReferenceDescriptionVariableType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType . -opcua:ReferencedNodes a base:Field ; +opcua:ReferencedNodes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId ; base:hasFieldName "ReferencedNodes" . @@ -10068,7 +10522,8 @@ opcua:RefreshStartEventType a owl:Class ; rdfs:subClassOf opcua:SystemEventType ; base:isAbstract "true" . -opcua:RegisterNodesCount a base:Field ; +opcua:RegisterNodesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "RegisterNodesCount" . @@ -10083,11 +10538,13 @@ opcua:RegisteredServer a owl:Class ; opcua:ServerType, opcua:ServerUri . -opcua:RejectedRequestsCount a base:Field ; +opcua:RejectedRequestsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RejectedRequestsCount" . -opcua:RejectedSessionCount a base:Field ; +opcua:RejectedSessionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RejectedSessionCount" . @@ -10099,27 +10556,33 @@ opcua:RepresentsSameHardwareAs a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:RepresentsSameEntityAs . -opcua:RepublishCount a base:Field ; +opcua:RepublishCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "RepublishCount" . -opcua:RepublishMessageCount a base:Field ; +opcua:RepublishMessageCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RepublishMessageCount" . -opcua:RepublishMessageRequestCount a base:Field ; +opcua:RepublishMessageRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RepublishMessageRequestCount" . -opcua:RepublishRequestCount a base:Field ; +opcua:RepublishRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "RepublishRequestCount" . -opcua:RequestedKeyCount a base:Field ; +opcua:RequestedKeyCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "RequestedKeyCount" . -opcua:RequestedNewNodeId a base:Field ; +opcua:RequestedNewNodeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId ; base:hasFieldName "RequestedNewNodeId" . @@ -10127,15 +10590,18 @@ opcua:Requires a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HierarchicalReferences . -opcua:Reserved a base:Field ; +opcua:Reserved a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "Reserved" . -opcua:RetryInterval a base:Field ; +opcua:RetryInterval a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "RetryInterval" . -opcua:RoleId a base:Field ; +opcua:RoleId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "RoleId" . @@ -10153,51 +10619,63 @@ opcua:SafetyConditionClassType a owl:Class ; rdfs:subClassOf opcua:BaseConditionClassType ; base:isAbstract "true" . -opcua:SamplingInterval a base:Field ; +opcua:SamplingInterval a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "SamplingInterval" . -opcua:SamplingIntervalHint a base:Field ; +opcua:SamplingIntervalHint a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "SamplingIntervalHint" . -opcua:SamplingOffset a base:Field ; +opcua:SamplingOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "SamplingOffset" . -opcua:SchemaLocation a base:Field ; +opcua:SchemaLocation a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SchemaLocation" . -opcua:SecondsTillShutdown a base:Field ; +opcua:SecondsTillShutdown a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SecondsTillShutdown" . -opcua:SecurityGroupFolder a base:Field ; +opcua:SecurityGroupFolder a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SecurityGroupFolder" . -opcua:SecurityLevel a base:Field ; +opcua:SecurityLevel a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "SecurityLevel" . -opcua:SecurityRejectedRequestsCount a base:Field ; +opcua:SecurityRejectedRequestsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SecurityRejectedRequestsCount" . -opcua:SecurityRejectedSessionCount a base:Field ; +opcua:SecurityRejectedSessionCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SecurityRejectedSessionCount" . -opcua:SecurityTokenLifetime a base:Field ; +opcua:SecurityTokenLifetime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "SecurityTokenLifetime" . -opcua:SelectClauses a base:Field ; +opcua:SelectClauses a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SimpleAttributeOperand ; base:hasFieldName "SelectClauses" . -opcua:SelectedFields a base:Field ; +opcua:SelectedFields a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SimpleAttributeOperand ; base:hasFieldName "SelectedFields" . @@ -10205,28 +10683,34 @@ opcua:SemanticChangeEventType a owl:Class ; rdfs:subClassOf opcua:BaseEventType ; base:isAbstract "true" . -opcua:SemaphoreFilePath a base:Field ; +opcua:SemaphoreFilePath a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SemaphoreFilePath" . opcua:Server a opcua:ApplicationType, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ApplicationDescription ; base:hasFieldName "Server" . -opcua:ServerCertificate a base:Field ; +opcua:ServerCertificate a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ApplicationInstanceCertificate ; base:hasFieldName "ServerCertificate" . -opcua:ServerId a base:Field ; +opcua:ServerId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ServerId" . -opcua:ServerName a base:Field ; +opcua:ServerName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ServerName" . -opcua:ServerNames a base:Field ; +opcua:ServerNames a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "ServerNames" . @@ -10237,58 +10721,71 @@ opcua:ServerOnNetwork a owl:Class ; opcua:ServerCapabilities, opcua:ServerName . -opcua:ServerViewCount a base:Field ; +opcua:ServerViewCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "ServerViewCount" . -opcua:ServiceLevel a base:Field ; +opcua:ServiceLevel a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "ServiceLevel" . -opcua:SessionAbortCount a base:Field ; +opcua:SessionAbortCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SessionAbortCount" . opcua:SessionAuthenticationToken a owl:Class ; rdfs:subClassOf opcua:NodeId . -opcua:SessionName a base:Field ; +opcua:SessionName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SessionName" . -opcua:SessionTimeoutCount a base:Field ; +opcua:SessionTimeoutCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SessionTimeoutCount" . -opcua:SetMonitoringModeCount a base:Field ; +opcua:SetMonitoringModeCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "SetMonitoringModeCount" . -opcua:SetPublishingModeCount a base:Field ; +opcua:SetPublishingModeCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "SetPublishingModeCount" . -opcua:SetTriggeringCount a base:Field ; +opcua:SetTriggeringCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "SetTriggeringCount" . -opcua:ShutdownReason a base:Field ; +opcua:ShutdownReason a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "ShutdownReason" . -opcua:SimpleDataTypes a base:Field ; +opcua:SimpleDataTypes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SimpleTypeDescription ; base:hasFieldName "SimpleDataTypes" . -opcua:SoftwareVersion a base:Field ; +opcua:SoftwareVersion a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SoftwareVersion" . -opcua:SourceNode a base:Field ; +opcua:SourceNode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "SourceNode" . -opcua:SpecifiedLists a base:Field ; +opcua:SpecifiedLists a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SpecifiedLists" . @@ -10296,15 +10793,18 @@ opcua:StandaloneSubscribedDataSetRefDataType a owl:Class ; rdfs:subClassOf opcua:SubscribedDataSetDataType ; base:hasField opcua:DataSetName . -opcua:StartTime a base:Field ; +opcua:StartTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "StartTime" . -opcua:StartingBitPosition a base:Field ; +opcua:StartingBitPosition a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "StartingBitPosition" . -opcua:State a base:Field ; +opcua:State a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServerState ; base:hasFieldName "State" . @@ -10312,7 +10812,8 @@ opcua:StatisticalConditionClassType a owl:Class ; rdfs:subClassOf opcua:BaseConditionClassType ; base:isAbstract "true" . -opcua:StructureDataTypes a base:Field ; +opcua:StructureDataTypes a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:StructureDescription ; base:hasFieldName "StructureDataTypes" . @@ -10324,11 +10825,13 @@ opcua:SubscribedDataSetMirrorDataType a owl:Class ; opcua:SubscribedDataSetMirrorType a owl:Class ; rdfs:subClassOf opcua:SubscribedDataSetType . -opcua:SubscribedDataSets a base:Field ; +opcua:SubscribedDataSets a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:StandaloneSubscribedDataSetDataType ; base:hasFieldName "SubscribedDataSets" . -opcua:SubscriptionId a base:Field ; +opcua:SubscriptionId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "SubscriptionId" . @@ -10346,23 +10849,28 @@ opcua:SystemStatusChangeEventType a owl:Class ; rdfs:subClassOf opcua:SystemEventType ; base:isAbstract "true" . -opcua:TargetId a base:Field ; +opcua:TargetId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "TargetId" . -opcua:TargetName a base:Field ; +opcua:TargetName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "TargetName" . -opcua:TargetNodeClass a base:Field ; +opcua:TargetNodeClass a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeClass ; base:hasFieldName "TargetNodeClass" . -opcua:TargetServerUri a base:Field ; +opcua:TargetServerUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "TargetServerUri" . -opcua:TargetVariables a base:Field ; +opcua:TargetVariables a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:FieldTargetDataType ; base:hasFieldName "TargetVariables" . @@ -10380,14 +10888,16 @@ opcua:TestingConditionClassType a owl:Class ; rdfs:subClassOf opcua:BaseConditionClassType ; base:isAbstract "true" . -opcua:TimeExponent a base:Field ; +opcua:TimeExponent a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SByte ; base:hasFieldName "TimeExponent" . opcua:TimeString a owl:Class ; rdfs:subClassOf opcua:String . -opcua:Title a base:Field ; +opcua:Title a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "Title" . @@ -10395,19 +10905,23 @@ opcua:ToState a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:NonHierarchicalReferences . -opcua:TokenData a base:Field ; +opcua:TokenData a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "TokenData" . -opcua:TokenType a base:Field ; +opcua:TokenType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UserTokenType ; base:hasFieldName "TokenType" . -opcua:TotalCount a base:Field ; +opcua:TotalCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "TotalCount" . -opcua:TotalRequestCount a base:Field ; +opcua:TotalRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "TotalRequestCount" . @@ -10415,23 +10929,28 @@ opcua:TrainingConditionClassType a owl:Class ; rdfs:subClassOf opcua:BaseConditionClassType ; base:isAbstract "true" . -opcua:TransferRequestCount a base:Field ; +opcua:TransferRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "TransferRequestCount" . -opcua:TransferSubscriptionsCount a base:Field ; +opcua:TransferSubscriptionsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "TransferSubscriptionsCount" . -opcua:TransferredToAltClientCount a base:Field ; +opcua:TransferredToAltClientCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "TransferredToAltClientCount" . -opcua:TransferredToSameClientCount a base:Field ; +opcua:TransferredToSameClientCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "TransferredToSameClientCount" . -opcua:TranslateBrowsePathsToNodeIdsCount a base:Field ; +opcua:TranslateBrowsePathsToNodeIdsCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "TranslateBrowsePathsToNodeIdsCount" . @@ -10442,11 +10961,13 @@ opcua:TransmitQosPriorityDataType a owl:Class ; opcua:TransparentRedundancyType a owl:Class ; rdfs:subClassOf opcua:ServerRedundancyType . -opcua:TransportProtocol a base:Field ; +opcua:TransportProtocol a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "TransportProtocol" . -opcua:TreatUncertainAsBad a base:Field ; +opcua:TreatUncertainAsBad a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "TreatUncertainAsBad" . @@ -10473,11 +10994,13 @@ opcua:TrustListUpdatedAuditEventType a owl:Class ; base:isAbstract "true" . opcua:TrustedCertificates a opcua:TrustListMasks, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "TrustedCertificates" . opcua:TrustedCrls a opcua:TrustListMasks, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "TrustedCrls" . @@ -10485,11 +11008,13 @@ opcua:TrustedCrls a opcua:TrustListMasks, opcua:TwoStateDiscreteType a owl:Class ; rdfs:subClassOf opcua:DiscreteItemType . -opcua:TypeDefinition a base:Field ; +opcua:TypeDefinition a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId ; base:hasFieldName "TypeDefinition" . -opcua:TypeDefinitionId a base:Field ; +opcua:TypeDefinitionId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "TypeDefinitionId" . @@ -10529,63 +11054,76 @@ opcua:UadpWriterGroupMessageDataType a owl:Class ; opcua:UadpWriterGroupMessageType a owl:Class ; rdfs:subClassOf opcua:WriterGroupMessageType . -opcua:UnacknowledgedMessageCount a base:Field ; +opcua:UnacknowledgedMessageCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "UnacknowledgedMessageCount" . -opcua:UnauthorizedRequestCount a base:Field ; +opcua:UnauthorizedRequestCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "UnauthorizedRequestCount" . opcua:Union a opcua:StructureType, - owl:Class ; + owl:Class, + owl:NamedIndividual ; rdfs:subClassOf opcua:Structure ; base:hasFieldName "Union" ; base:isAbstract "true" . -opcua:UnitId a base:Field ; +opcua:UnitId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "UnitId" . -opcua:UnregisterNodesCount a base:Field ; +opcua:UnregisterNodesCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "UnregisterNodesCount" . -opcua:UpdateType a base:Field ; +opcua:UpdateType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:HistoryUpdateType ; base:hasFieldName "UpdateType" . -opcua:Uri a base:Field ; +opcua:Uri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Uri" . opcua:UriDictionaryEntryType a owl:Class ; rdfs:subClassOf opcua:DictionaryEntryType . -opcua:Url a base:Field ; +opcua:Url a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Url" . -opcua:UseBinaryEncoding a base:Field ; +opcua:UseBinaryEncoding a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "UseBinaryEncoding" . -opcua:UseServerCapabilitiesDefaults a base:Field ; +opcua:UseServerCapabilitiesDefaults a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "UseServerCapabilitiesDefaults" . -opcua:UseSlopedExtrapolation a base:Field ; +opcua:UseSlopedExtrapolation a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "UseSlopedExtrapolation" . -opcua:UserConfiguration a base:Field ; +opcua:UserConfiguration a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UserConfigurationMask ; base:hasFieldName "UserConfiguration" . opcua:UserCredentialCertificateType a owl:Class ; rdfs:subClassOf opcua:CertificateType . -opcua:UserIdentityTokens a base:Field ; +opcua:UserIdentityTokens a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UserTokenPolicy ; base:hasFieldName "UserIdentityTokens" . @@ -10599,27 +11137,33 @@ opcua:UsesPriorityMappingTable a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:NonHierarchicalReferences . -opcua:ValidBits a base:Field ; +opcua:ValidBits a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "ValidBits" . -opcua:Verb a base:Field ; +opcua:Verb a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "Verb" . -opcua:WhereClause a base:Field ; +opcua:WhereClause a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ContentFilter ; base:hasFieldName "WhereClause" . -opcua:WriteCount a base:Field ; +opcua:WriteCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ServiceCounterDataType ; base:hasFieldName "WriteCount" . -opcua:WriteIndexRange a base:Field ; +opcua:WriteIndexRange a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NumericRange ; base:hasFieldName "WriteIndexRange" . -opcua:WriterGroups a base:Field ; +opcua:WriterGroups a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:WriterGroupDataType ; base:hasFieldName "WriterGroups" . @@ -50740,11 +51284,13 @@ opcua:AddReferencesItem a owl:Class ; opcua:AddressSpaceFileType a owl:Class ; rdfs:subClassOf opcua:FileType . -opcua:Affected a base:Field ; +opcua:Affected a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "Affected" . -opcua:AffectedType a base:Field ; +opcua:AffectedType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "AffectedType" . @@ -50773,7 +51319,8 @@ opcua:ApplicationConfigurationType a owl:Class ; opcua:ApplicationInstanceCertificate a owl:Class ; rdfs:subClassOf opcua:ByteString . -opcua:ApplicationUri a base:Field ; +opcua:ApplicationUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ApplicationUri" . @@ -50807,19 +51354,22 @@ opcua:BitFieldDefinition a owl:Class ; opcua:Reserved, opcua:StartingBitPosition . -opcua:BrowsePath a base:Field ; +opcua:BrowsePath a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName, opcua:RelativePath ; base:hasFieldName "BrowsePath" . -opcua:CertificateData a base:Field ; +opcua:CertificateData a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "CertificateData" . opcua:CertificateExpirationAlarmType a owl:Class ; rdfs:subClassOf opcua:SystemOffNormalAlarmType . -opcua:ConfigurationVersion a base:Field ; +opcua:ConfigurationVersion a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ConfigurationVersionDataType, opcua:VersionTime ; base:hasFieldName "ConfigurationVersion" . @@ -50829,11 +51379,13 @@ opcua:ContentFilterElement a owl:Class ; base:hasField opcua:FilterOperands, opcua:FilterOperator . -opcua:CreateClientName a base:Field ; +opcua:CreateClientName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "CreateClientName" . -opcua:CreateSessionId a base:Field ; +opcua:CreateSessionId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "CreateSessionId" . @@ -50846,23 +51398,28 @@ opcua:CurrencyUnitType a owl:Class ; opcua:DataSetClassId a opcua:JsonNetworkMessageContentMask, opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:Guid ; base:hasFieldName "DataSetClassId" . -opcua:DataSetFieldId a base:Field ; +opcua:DataSetFieldId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Guid ; base:hasFieldName "DataSetFieldId" . -opcua:DataSetFolder a base:Field ; +opcua:DataSetFolder a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "DataSetFolder" . -opcua:DataSetName a base:Field ; +opcua:DataSetName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "DataSetName" . -opcua:DataSetOffset a base:Field ; +opcua:DataSetOffset a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "DataSetOffset" . @@ -50882,6 +51439,7 @@ opcua:DataSetWriterDataType a owl:Class ; opcua:TransportSettings . opcua:DataSetWriterId a opcua:JsonDataSetMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "DataSetWriterId" . @@ -50908,22 +51466,26 @@ opcua:DeleteReferencesItem a owl:Class ; opcua:SourceNodeId, opcua:TargetNodeId . -opcua:Denominator a base:Field ; +opcua:Denominator a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "Denominator" . -opcua:DisabledMonitoredItemCount a base:Field ; +opcua:DisabledMonitoredItemCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DisabledMonitoredItemCount" . -opcua:DiscoveryAnnounceRate a base:Field ; +opcua:DiscoveryAnnounceRate a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "DiscoveryAnnounceRate" . opcua:DiscoveryConfiguration a owl:Class ; rdfs:subClassOf opcua:Structure . -opcua:DiscoveryUrls a base:Field ; +opcua:DiscoveryUrls a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "DiscoveryUrls" . @@ -50932,16 +51494,19 @@ opcua:DiscreteAlarmType a owl:Class ; opcua:DisplayName a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "DisplayName" . -opcua:Elements a base:Field ; +opcua:Elements a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ContentFilterElement, opcua:RelativePathElement ; base:hasFieldName "Elements" . -opcua:EncryptionAlgorithm a base:Field ; +opcua:EncryptionAlgorithm a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "EncryptionAlgorithm" . @@ -50984,7 +51549,8 @@ opcua:FrameType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType ; base:isAbstract "true" . -opcua:GatewayServerUri a base:Field ; +opcua:GatewayServerUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "GatewayServerUri" . @@ -50992,11 +51558,13 @@ opcua:GeneratesEvent a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:NonHierarchicalReferences . -opcua:GroupProperties a base:Field ; +opcua:GroupProperties a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:KeyValuePair ; base:hasFieldName "GroupProperties" . opcua:GroupVersion a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:VersionTime ; base:hasFieldName "GroupVersion" . @@ -51009,7 +51577,8 @@ opcua:HasEventSource a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HierarchicalReferences . -opcua:HeaderLayoutUri a base:Field ; +opcua:HeaderLayoutUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "HeaderLayoutUri" . @@ -51023,12 +51592,14 @@ opcua:HistoryEvent a owl:Class ; opcua:HistoryServerCapabilitiesType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:Imaginary a base:Field ; +opcua:Imaginary a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double, opcua:Float ; base:hasFieldName "Imaginary" . opcua:Index a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:UInt32 ; base:hasDatatype opcua:UInt32 ; @@ -51043,7 +51614,8 @@ opcua:Int64 a owl:Class ; opcua:IntegerId a owl:Class ; rdfs:subClassOf opcua:UInt32 . -opcua:InvocationCreationTime a base:Field ; +opcua:InvocationCreationTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "InvocationCreationTime" . @@ -51053,36 +51625,44 @@ opcua:KeyCredentialConfigurationFolderType a owl:Class ; opcua:KeyCredentialConfigurationType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:KeyFrameCount a base:Field ; +opcua:KeyFrameCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "KeyFrameCount" . -opcua:LastMethodCall a base:Field ; +opcua:LastMethodCall a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "LastMethodCall" . -opcua:LastMethodCallTime a base:Field ; +opcua:LastMethodCallTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "LastMethodCallTime" . -opcua:LastMethodInputArguments a base:Field ; +opcua:LastMethodInputArguments a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Argument ; base:hasFieldName "LastMethodInputArguments" . -opcua:LastMethodOutputArguments a base:Field ; +opcua:LastMethodOutputArguments a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Argument ; base:hasFieldName "LastMethodOutputArguments" . -opcua:LastMethodReturnStatus a base:Field ; +opcua:LastMethodReturnStatus a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:StatusCode, opcua:StatusResult ; base:hasFieldName "LastMethodReturnStatus" . -opcua:LastMethodSessionId a base:Field ; +opcua:LastMethodSessionId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "LastMethodSessionId" . -opcua:LastTransitionTime a base:Field ; +opcua:LastTransitionTime a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UtcTime ; base:hasFieldName "LastTransitionTime" . @@ -51096,16 +51676,19 @@ opcua:LinearConversionDataType a owl:Class ; opcua:LiteralOperand a owl:Class ; rdfs:subClassOf opcua:FilterOperand . -opcua:LocaleIds a base:Field ; +opcua:LocaleIds a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocaleId ; base:hasFieldName "LocaleIds" . -opcua:Message a base:Field ; +opcua:Message a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText, opcua:String ; base:hasFieldName "Message" . -opcua:MetaDataQueueName a base:Field ; +opcua:MetaDataQueueName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "MetaDataQueueName" . @@ -51121,7 +51704,8 @@ opcua:ModificationInfo a owl:Class ; opcua:UpdateType, opcua:UserName . -opcua:MonitoredItemCount a base:Field ; +opcua:MonitoredItemCount a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "MonitoredItemCount" . @@ -51135,11 +51719,13 @@ opcua:MultiStateValueDiscreteType a owl:Class ; rdfs:subClassOf opcua:DiscreteItemType . opcua:NetworkMessageNumber a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "NetworkMessageNumber" . -opcua:Numerator a base:Field ; +opcua:Numerator a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32, opcua:UInt32 ; base:hasFieldName "Numerator" . @@ -51148,11 +51734,13 @@ opcua:Organizes a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HierarchicalReferences . -opcua:PolicyId a base:Field ; +opcua:PolicyId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "PolicyId" . -opcua:Priority a base:Field ; +opcua:Priority a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "Priority" . @@ -51283,7 +51871,8 @@ opcua:ReaderGroupTransportType a owl:Class ; opcua:ReaderGroupType a owl:Class ; rdfs:subClassOf opcua:PubSubGroupType . -opcua:Real a base:Field ; +opcua:Real a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double, opcua:Float ; base:hasFieldName "Real" . @@ -51303,6 +51892,7 @@ opcua:ReferenceListEntryDataType a owl:Class ; opcua:ReferenceType a opcua:NodeAttributesMask, opcua:NodeClass, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "ReferenceType" . @@ -51320,6 +51910,7 @@ opcua:RelativePathElement a owl:Class ; opcua:RolePermissions a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:RolePermissionType ; base:hasFieldName "RolePermissions" . @@ -51339,12 +51930,14 @@ opcua:SecurityGroupDataType a owl:Class ; opcua:SecurityGroupId, opcua:SecurityPolicyUri . -opcua:SecurityGroups a base:Field ; +opcua:SecurityGroups a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SecurityGroupDataType, opcua:String ; base:hasFieldName "SecurityGroups" . -opcua:SecurityKeyServices a base:Field ; +opcua:SecurityKeyServices a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EndpointDescription ; base:hasFieldName "SecurityKeyServices" . @@ -51353,7 +51946,8 @@ opcua:SemanticChangeStructureDataType a owl:Class ; base:hasField opcua:Affected, opcua:AffectedType . -opcua:ServerCapabilities a base:Field ; +opcua:ServerCapabilities a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ServerCapabilities" . @@ -51370,7 +51964,8 @@ opcua:SessionDiagnosticsObjectType a owl:Class ; opcua:ShelvedStateMachineType a owl:Class ; rdfs:subClassOf opcua:FiniteStateMachineType . -opcua:Signature a base:Field ; +opcua:Signature a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ByteString ; base:hasFieldName "Signature" . @@ -51379,7 +51974,8 @@ opcua:SimpleTypeDescription a owl:Class ; base:hasField opcua:BaseDataType, opcua:BuiltInType . -opcua:SourceNodeId a base:Field ; +opcua:SourceNodeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "SourceNodeId" . @@ -51410,18 +52006,21 @@ opcua:StructureField a owl:Class ; opcua:Name, opcua:ValueRank . -opcua:SubscribedDataSet a base:Field ; +opcua:SubscribedDataSet a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:SubscribedDataSetDataType ; base:hasFieldName "SubscribedDataSet" . opcua:SubscriptionDiagnosticsType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType . -opcua:TargetNode a base:Field ; +opcua:TargetNode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId ; base:hasFieldName "TargetNode" . -opcua:Topic a base:Field ; +opcua:Topic a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "Topic" . @@ -51465,6 +52064,7 @@ opcua:WriterGroupDataType a owl:Class ; opcua:WriterGroupId . opcua:WriterGroupId a opcua:UadpNetworkMessageContentMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:UInt16 ; base:hasFieldName "WriterGroupId" . @@ -51477,11 +52077,13 @@ opcua:XVType a owl:Class ; base:hasField opcua:Value, opcua:X . -opcua:Y a base:Field ; +opcua:Y a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "Y" . -opcua:Z a base:Field ; +opcua:Z a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "Z" . @@ -54900,12 +55502,14 @@ opcua:nodei9455 a opcua:ExclusiveLimitStateMachineType, base:hasNamespace opcua:OPCUANamespace ; base:hasNodeId "9455" . -opcua:Address a base:Field ; +opcua:Address a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NetworkAddressDataType ; base:hasFieldName "Address" . opcua:ArrayDimensions a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:UInt32 ; base:hasFieldName "ArrayDimensions" . @@ -54924,7 +55528,8 @@ opcua:AuditUpdateStateEventType a owl:Class ; opcua:BaseAnalogType a owl:Class ; rdfs:subClassOf opcua:DataItemType . -opcua:BuiltInType a base:Field ; +opcua:BuiltInType a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Byte ; base:hasFieldName "BuiltInType" . @@ -54939,7 +55544,8 @@ opcua:ConditionType a owl:Class ; opcua:DataSetFieldFlags a owl:Class ; rdfs:subClassOf opcua:UInt16 . -opcua:DataSetMetaData a base:Field ; +opcua:DataSetMetaData a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetMetaDataType ; base:hasFieldName "DataSetMetaData" . @@ -54976,13 +55582,15 @@ opcua:DataSetWriterType a owl:Class ; opcua:DataType a opcua:AttributeWriteMask, opcua:NodeAttributesMask, opcua:NodeClass, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "DataType" . opcua:DataTypeDefinition a opcua:AttributeWriteMask, opcua:NodeAttributesMask, - owl:Class ; + owl:Class, + owl:NamedIndividual ; rdfs:subClassOf opcua:Structure ; base:hasFieldName "DataTypeDefinition" ; base:isAbstract "true" . @@ -55001,13 +55609,15 @@ opcua:DataTypeSchemaHeader a owl:Class ; opcua:DataTypeSystemType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:DatagramQos a base:Field ; +opcua:DatagramQos a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QosDataType, opcua:ReceiveQosDataType, opcua:TransmitQosDataType ; base:hasFieldName "DatagramQos" . opcua:DiagnosticInfo a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:BaseDataType ; base:hasDatatype opcua:DiagnosticInfo ; @@ -55017,13 +55627,15 @@ opcua:DictionaryFolderType a owl:Class ; rdfs:subClassOf opcua:FolderType . opcua:EnumDefinition a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:DataTypeDefinition ; base:hasDatatype opcua:EnumDefinition ; base:hasField opcua:Fields ; base:hasFieldName "EnumDefinition" . -opcua:Fields a base:Field ; +opcua:Fields a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:EnumField, opcua:FieldMetaData, opcua:StructureField ; @@ -55050,7 +55662,8 @@ opcua:IIeeeTsnInterfaceConfigurationType a owl:Class ; rdfs:subClassOf opcua:BaseInterfaceType ; base:isAbstract "true" . -opcua:IndexRange a base:Field ; +opcua:IndexRange a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NumericRange ; base:hasFieldName "IndexRange" . @@ -55061,7 +55674,8 @@ opcua:KeyCredentialAuditEventType a owl:Class ; opcua:LimitAlarmType a owl:Class ; rdfs:subClassOf opcua:AlarmConditionType . -opcua:MaxStringLength a base:Field ; +opcua:MaxStringLength a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32, opcua:UInt32 ; base:hasFieldName "MaxStringLength" . @@ -55069,7 +55683,8 @@ opcua:MaxStringLength a base:Field ; opcua:NamespaceMetadataType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:NamespaceUri a base:Field ; +opcua:NamespaceUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "NamespaceUri" . @@ -55091,11 +55706,13 @@ opcua:OrientationType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType ; base:isAbstract "true" . -opcua:PriorityLabel a base:Field ; +opcua:PriorityLabel a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "PriorityLabel" . -opcua:ProductUri a base:Field ; +opcua:ProductUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ProductUri" . @@ -55138,11 +55755,13 @@ opcua:PubSubStatusEventType a owl:Class ; rdfs:subClassOf opcua:SystemEventType ; base:isAbstract "true" . -opcua:PublishingInterval a base:Field ; +opcua:PublishingInterval a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Duration ; base:hasFieldName "PublishingInterval" . -opcua:QosCategory a base:Field ; +opcua:QosCategory a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "QosCategory" . @@ -55157,7 +55776,8 @@ opcua:QuantityDimension a owl:Class ; opcua:MassExponent, opcua:TimeExponent . -opcua:QueueName a base:Field ; +opcua:QueueName a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "QueueName" . @@ -55169,7 +55789,8 @@ opcua:RepresentsSameEntityAs a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:NonHierarchicalReferences . -opcua:RequestedDeliveryGuarantee a base:Field ; +opcua:RequestedDeliveryGuarantee a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:BrokerTransportQualityOfService ; base:hasFieldName "RequestedDeliveryGuarantee" . @@ -55179,7 +55800,8 @@ opcua:RoleSetType a owl:Class ; opcua:SamplingIntervalDiagnosticsArrayType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType . -opcua:SecurityGroupId a base:Field ; +opcua:SecurityGroupId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SecurityGroupId" . @@ -55202,16 +55824,19 @@ opcua:ServerStatusType a owl:Class ; rdfs:subClassOf opcua:BaseDataVariableType . opcua:ServerType a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:BaseObjectType ; base:hasDatatype opcua:ApplicationType ; base:hasFieldName "ServerType" . -opcua:ServerUri a base:Field ; +opcua:ServerUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ServerUri" . -opcua:SessionId a base:Field ; +opcua:SessionId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "SessionId" . @@ -55221,6 +55846,7 @@ opcua:StatusResult a owl:Class ; opcua:StatusCode . opcua:StructureDefinition a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:DataTypeDefinition ; base:hasDatatype opcua:StructureDefinition ; @@ -55233,7 +55859,8 @@ opcua:StructureDefinition a owl:Class, opcua:SystemOffNormalAlarmType a owl:Class ; rdfs:subClassOf opcua:OffNormalAlarmType . -opcua:TargetNodeId a base:Field ; +opcua:TargetNodeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ExpandedNodeId, opcua:NodeId ; base:hasFieldName "TargetNodeId" . @@ -55244,7 +55871,8 @@ opcua:TransactionErrorType a owl:Class ; opcua:Message, opcua:TargetId . -opcua:TransportProfileUri a base:Field ; +opcua:TransportProfileUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "TransportProfileUri" . @@ -55261,6 +55889,7 @@ opcua:Utilizes a owl:Class, opcua:Value a opcua:KeyValuePair, opcua:LiteralOperand, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:ByteString, opcua:Float, @@ -55269,6 +55898,7 @@ opcua:Value a opcua:KeyValuePair, opcua:ValueRank a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "ValueRank" . @@ -55280,7 +55910,8 @@ opcua:Vector a owl:Class ; opcua:VendorServerInfoType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -opcua:X a base:Field ; +opcua:X a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Double ; base:hasFieldName "X" . @@ -55409,7 +56040,8 @@ opcua:ApplicationCertificateType a owl:Class ; rdfs:subClassOf opcua:CertificateType ; base:isAbstract "true" . -opcua:AttributeId a base:Field ; +opcua:AttributeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:IntegerId ; base:hasFieldName "AttributeId" . @@ -55424,7 +56056,8 @@ opcua:AuditSessionEventType a owl:Class ; rdfs:subClassOf opcua:AuditSecurityEventType ; base:isAbstract "true" . -opcua:AuthenticationProfileUri a base:Field ; +opcua:AuthenticationProfileUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "AuthenticationProfileUri" . @@ -55457,7 +56090,8 @@ opcua:DataItemType a owl:Class ; opcua:DataSetFolderType a owl:Class ; rdfs:subClassOf opcua:FolderType . -opcua:DataSetMessageContentMask a base:Field ; +opcua:DataSetMessageContentMask a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:JsonDataSetMessageContentMask, opcua:UadpDataSetMessageContentMask ; base:hasFieldName "DataSetMessageContentMask" . @@ -55496,7 +56130,8 @@ opcua:DiscreteItemType a owl:Class ; rdfs:subClassOf opcua:DataItemType ; base:isAbstract "true" . -opcua:EndpointUrl a base:Field ; +opcua:EndpointUrl a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "EndpointUrl" . @@ -55528,11 +56163,13 @@ opcua:HasChild a owl:Class, opcua:Int16 a owl:Class ; rdfs:subClassOf opcua:Integer . -opcua:IsForward a base:Field ; +opcua:IsForward a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "IsForward" . -opcua:MessageSettings a base:Field ; +opcua:MessageSettings a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DataSetReaderMessageDataType, opcua:DataSetWriterMessageDataType, opcua:ReaderGroupMessageDataType, @@ -55547,7 +56184,8 @@ opcua:NetworkAddressDataType a owl:Class ; base:hasField opcua:NetworkInterface ; base:isAbstract "true" . -opcua:NetworkMessageContentMask a base:Field ; +opcua:NetworkMessageContentMask a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:JsonNetworkMessageContentMask, opcua:UadpNetworkMessageContentMask ; base:hasFieldName "NetworkMessageContentMask" . @@ -55581,11 +56219,13 @@ opcua:RedundantServerDataType a owl:Class ; opcua:ServerState, opcua:ServiceLevel . -opcua:ReferenceTypeId a base:Field ; +opcua:ReferenceTypeId a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "ReferenceTypeId" . -opcua:ResourceUri a base:Field ; +opcua:ResourceUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "ResourceUri" . @@ -55639,6 +56279,7 @@ opcua:UnitType a owl:Class ; opcua:UserName a opcua:IdentityCriteriaType, opcua:UserTokenType, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "UserName" . @@ -55720,6 +56361,7 @@ opcua:AliasNameCategoryType a owl:Class ; rdfs:subClassOf opcua:FolderType . opcua:Annotation a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Structure ; base:hasDatatype opcua:String ; @@ -55740,6 +56382,7 @@ opcua:BaseVariableType a owl:Class ; base:isAbstract "true" . opcua:CartesianCoordinates a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Structure ; base:hasDatatype opcua:3DCartesianCoordinates ; @@ -55752,7 +56395,8 @@ opcua:DataValue a owl:Class ; opcua:Duplex a owl:Class ; rdfs:subClassOf opcua:Enumeration . -opcua:Enabled a base:Field ; +opcua:Enabled a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "Enabled" . @@ -55768,7 +56412,8 @@ opcua:FiniteStateMachineType a owl:Class ; base:isAbstract "true" . opcua:Guid a opcua:IdType, - owl:Class ; + owl:Class, + owl:NamedIndividual ; rdfs:subClassOf opcua:BaseDataType ; base:hasFieldName "Guid" . @@ -55787,6 +56432,7 @@ opcua:OpenFileMode a owl:Class ; rdfs:subClassOf opcua:Enumeration . opcua:Orientation a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Structure ; base:hasDatatype opcua:3DOrientation ; @@ -55814,7 +56460,8 @@ opcua:QosDataType a owl:Class ; rdfs:subClassOf opcua:Structure ; base:isAbstract "true" . -opcua:SecurityMode a base:Field ; +opcua:SecurityMode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:MessageSecurityMode ; base:hasFieldName "SecurityMode" . @@ -55852,7 +56499,8 @@ opcua:TimeZoneDataType a owl:Class ; base:hasField opcua:DaylightSavingInOffset, opcua:Offset . -opcua:TransportSettings a base:Field ; +opcua:TransportSettings a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:ConnectionTransportDataType, opcua:DataSetReaderTransportDataType, opcua:DataSetWriterTransportDataType, @@ -55961,6 +56609,7 @@ opcua:ModellingRuleType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . opcua:OverrideValueHandling a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:OverrideValueHandling ; @@ -55981,7 +56630,8 @@ opcua:SamplingIntervalDiagnosticsDataType a owl:Class ; opcua:MonitoredItemCount, opcua:SamplingInterval . -opcua:SecurityPolicyUri a base:Field ; +opcua:SecurityPolicyUri a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:String ; base:hasFieldName "SecurityPolicyUri" . @@ -56063,6 +56713,7 @@ opcua:AuditUpdateMethodEventType a owl:Class ; base:isAbstract "true" . opcua:BuildInfo a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Structure ; base:hasDatatype opcua:BuildInfo ; @@ -56120,6 +56771,7 @@ opcua:UInteger a owl:Class ; base:isAbstract "true" . opcua:UserTokenType a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:UserTokenPolicy ; @@ -56130,6 +56782,7 @@ opcua:AccessLevelType a owl:Class ; opcua:Description a opcua:AttributeWriteMask, opcua:NodeAttributesMask, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:LocalizedText, opcua:String ; @@ -56151,6 +56804,7 @@ opcua:PerformUpdateType a owl:Class ; rdfs:subClassOf opcua:Enumeration . opcua:StructureType a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:StructureType ; @@ -56409,6 +57063,7 @@ opcua:UriString a owl:Class ; rdfs:subClassOf opcua:String . opcua:ApplicationType a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:ApplicationType ; @@ -56434,6 +57089,7 @@ opcua:HasComponent a owl:Class, opcua:NodeClass a opcua:AttributeWriteMask, opcua:NodeAttributesMask, owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:NodeClass ; @@ -56461,6 +57117,7 @@ opcua:BaseInterfaceType a owl:Class ; base:isAbstract "true" . opcua:DataSetFieldContentMask a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:UInt32 ; base:hasDatatype opcua:DataSetFieldContentMask ; @@ -56495,12 +57152,14 @@ opcua:VersionTime a owl:Class ; opcua:MessageSecurityMode a owl:Class ; rdfs:subClassOf opcua:Enumeration . -opcua:Name a base:Field ; +opcua:Name a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName, opcua:String ; base:hasFieldName "Name" . opcua:ServerState a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:ServerState ; @@ -56513,6 +57172,7 @@ opcua:StateType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . opcua:BaseDataType a owl:Class, + owl:NamedIndividual, base:Field ; base:hasDatatype opcua:NodeId ; base:hasFieldName "BaseDataType" ; @@ -56523,6 +57183,7 @@ opcua:PermissionType a owl:Class ; opcua:StatusCode a opcua:DataSetFieldContentMask, owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:BaseDataType ; base:hasDatatype opcua:StatusCode ; @@ -56538,6 +57199,7 @@ opcua:PubSubState a owl:Class ; rdfs:subClassOf opcua:Enumeration . opcua:FilterOperator a owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:Enumeration ; base:hasDatatype opcua:FilterOperator ; @@ -56614,7 +57276,8 @@ opcua:UInt16 a owl:Class ; opcua:BaseObjectType a owl:Class . opcua:Structure a opcua:StructureType, - owl:Class ; + owl:Class, + owl:NamedIndividual ; rdfs:subClassOf opcua:BaseDataType ; base:hasFieldName "Structure" ; base:isAbstract "true" . @@ -56625,6 +57288,7 @@ opcua:UtcTime a owl:Class ; opcua:NodeId a opcua:AttributeWriteMask, opcua:NodeAttributesMask, owl:Class, + owl:NamedIndividual, base:Field ; rdfs:subClassOf opcua:BaseDataType ; base:hasDatatype opcua:NodeId ; @@ -56675,7 +57339,8 @@ opcua:BaseDataVariableType a owl:Class ; rdfs:subClassOf opcua:BaseVariableType . opcua:String a opcua:IdType, - owl:Class ; + owl:Class, + owl:NamedIndividual ; rdfs:subClassOf opcua:BaseDataType ; base:hasFieldName "String" . diff --git a/semantic-model/opcua/tests/nodeset2owl/devices_cleaned.ttl b/semantic-model/opcua/tests/nodeset2owl/devices_cleaned.ttl index 8c3347c0..8413d1db 100644 --- a/semantic-model/opcua/tests/nodeset2owl/devices_cleaned.ttl +++ b/semantic-model/opcua/tests/nodeset2owl/devices_cleaned.ttl @@ -9,43 +9,56 @@ devices: a owl:Ontology ; owl:versionIRI ; owl:versionInfo 1e-01 . -devices:CHECK_FUNCTION a devices:DeviceHealthEnumeration ; +devices:CHECK_FUNCTION a devices:DeviceHealthEnumeration, + owl:NamedIndividual ; base:hasFieldName "CHECK_FUNCTION" . -devices:Current a devices:SoftwareVersionFileType ; +devices:Current a devices:SoftwareVersionFileType, + owl:NamedIndividual ; base:hasFieldName "Current" . -devices:FAILURE a devices:DeviceHealthEnumeration ; +devices:FAILURE a devices:DeviceHealthEnumeration, + owl:NamedIndividual ; base:hasFieldName "FAILURE" . -devices:Fallback a devices:SoftwareVersionFileType ; +devices:Fallback a devices:SoftwareVersionFileType, + owl:NamedIndividual ; base:hasFieldName "Fallback" . -devices:KeepsParameters a devices:UpdateBehavior ; +devices:KeepsParameters a devices:UpdateBehavior, + owl:NamedIndividual ; base:hasFieldName "KeepsParameters" . -devices:MAINTENANCE_REQUIRED a devices:DeviceHealthEnumeration ; +devices:MAINTENANCE_REQUIRED a devices:DeviceHealthEnumeration, + owl:NamedIndividual ; base:hasFieldName "MAINTENANCE_REQUIRED" . -devices:NORMAL a devices:DeviceHealthEnumeration ; +devices:NORMAL a devices:DeviceHealthEnumeration, + owl:NamedIndividual ; base:hasFieldName "NORMAL" . -devices:NeedsPreparation a devices:UpdateBehavior ; +devices:NeedsPreparation a devices:UpdateBehavior, + owl:NamedIndividual ; base:hasFieldName "NeedsPreparation" . -devices:OFF_SPEC a devices:DeviceHealthEnumeration ; +devices:OFF_SPEC a devices:DeviceHealthEnumeration, + owl:NamedIndividual ; base:hasFieldName "OFF_SPEC" . -devices:Pending a devices:SoftwareVersionFileType ; +devices:Pending a devices:SoftwareVersionFileType, + owl:NamedIndividual ; base:hasFieldName "Pending" . -devices:RequiresPowerCycle a devices:UpdateBehavior ; +devices:RequiresPowerCycle a devices:UpdateBehavior, + owl:NamedIndividual ; base:hasFieldName "RequiresPowerCycle" . -devices:WillDisconnect a devices:UpdateBehavior ; +devices:WillDisconnect a devices:UpdateBehavior, + owl:NamedIndividual ; base:hasFieldName "WillDisconnect" . -devices:WillReboot a devices:UpdateBehavior ; +devices:WillReboot a devices:UpdateBehavior, + owl:NamedIndividual ; base:hasFieldName "WillReboot" . devices:nodei1 a opcua:ObjectTypeNodeClass ; @@ -655,7 +668,8 @@ devices:DiameterIndicationType a owl:Class ; devices:DirectLoadingType a owl:Class ; rdfs:subClassOf devices:PackageLoadingType . -devices:EndOfResults a base:Field ; +devices:EndOfResults a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Boolean ; base:hasFieldName "EndOfResults" . @@ -699,7 +713,8 @@ devices:LifetimeVariableType a owl:Class ; devices:MaintenanceRequiredAlarmType a owl:Class ; rdfs:subClassOf devices:DeviceHealthDiagnosticAlarmType . -devices:NodePath a base:Field ; +devices:NodePath a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:QualifiedName ; base:hasFieldName "NodePath" . @@ -714,11 +729,13 @@ devices:NumberOfUsagesIndicationType a owl:Class ; devices:OffSpecAlarmType a owl:Class ; rdfs:subClassOf devices:DeviceHealthDiagnosticAlarmType . -devices:ParameterDefs a base:Field ; +devices:ParameterDefs a owl:NamedIndividual, + base:Field ; base:hasDatatype devices:ParameterResultDataType ; base:hasFieldName "ParameterDefs" . -devices:SequenceNumber a base:Field ; +devices:SequenceNumber a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "SequenceNumber" . @@ -728,11 +745,13 @@ devices:SoftwareType a owl:Class ; devices:SoftwareUpdateType a owl:Class ; rdfs:subClassOf opcua:BaseObjectType . -devices:Status a base:Field ; +devices:Status a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:Int32 ; base:hasFieldName "Status" . -devices:StatusCode a base:Field ; +devices:StatusCode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:StatusCode ; base:hasFieldName "StatusCode" . @@ -4367,7 +4386,8 @@ devices:ConnectsTo a owl:Class, owl:ObjectProperty ; rdfs:subClassOf opcua:HierarchicalReferences . -devices:Diagnostics a base:Field ; +devices:Diagnostics a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:DiagnosticInfo ; base:hasFieldName "Diagnostics" . diff --git a/semantic-model/opcua/tests/nodeset2owl/pumps_cleaned.ttl b/semantic-model/opcua/tests/nodeset2owl/pumps_cleaned.ttl index d900b1ca..ba983552 100644 --- a/semantic-model/opcua/tests/nodeset2owl/pumps_cleaned.ttl +++ b/semantic-model/opcua/tests/nodeset2owl/pumps_cleaned.ttl @@ -12,500 +12,650 @@ pumps: a owl:Ontology ; owl:versionInfo 1e-01 . pumps:ARCNET a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "ARCNET" . pumps:AS_Interface a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "AS_Interface" . -pumps:AdditionOperation a pumps:MultiPumpOperationModeEnum ; +pumps:AdditionOperation a pumps:MultiPumpOperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "AdditionOperation" . -pumps:Advanced a pumps:OperationModeEnum ; +pumps:Advanced a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "Advanced" . -pumps:AutoControl a pumps:OperationModeEnum ; +pumps:AutoControl a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "AutoControl" . pumps:Automatic a pumps:ControlModeEnum, - pumps:OfferedControlModesOptionSet ; + pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Automatic" . pumps:BACnet_IP a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "BACnet_IP" . pumps:BACnet_MSTP a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "BACnet_MSTP" . pumps:Bluetooth a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Bluetooth" . -pumps:BluetoothLowEnergy a pumps:FieldbusEnum ; +pumps:BluetoothLowEnergy a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "BluetoothLowEnergy" . -pumps:Bluetooth_Low_Energy a pumps:OfferedFieldbusesOptionSet ; +pumps:Bluetooth_Low_Energy a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Bluetooth_Low_Energy" . pumps:CAN a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "CAN" . pumps:CANopen a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "CANopen" . pumps:CC_Link a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "CC_Link" . -pumps:Calibration a pumps:OperationModeEnum ; +pumps:Calibration a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "Calibration" . -pumps:ClosedLoopMax a pumps:OperationModeEnum ; +pumps:ClosedLoopMax a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "ClosedLoopMax" . -pumps:ClosedLoopMin a pumps:OperationModeEnum ; +pumps:ClosedLoopMin a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "ClosedLoopMin" . -pumps:ClosedLoopStandardPID a pumps:OperationModeEnum ; +pumps:ClosedLoopStandardPID a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "ClosedLoopStandardPID" . -pumps:ConcerningLoadDistribution a pumps:DistributionTypeEnum ; +pumps:ConcerningLoadDistribution a pumps:DistributionTypeEnum, + owl:NamedIndividual ; base:hasFieldName "ConcerningLoadDistribution" . -pumps:ConcerningTimeDistribution a pumps:DistributionTypeEnum ; +pumps:ConcerningTimeDistribution a pumps:DistributionTypeEnum, + owl:NamedIndividual ; base:hasFieldName "ConcerningTimeDistribution" . -pumps:ConstantDifferentialPressureControl a pumps:ControlModeEnum ; +pumps:ConstantDifferentialPressureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "ConstantDifferentialPressureControl" . -pumps:ConstantPressureControl a pumps:ControlModeEnum ; +pumps:ConstantPressureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "ConstantPressureControl" . -pumps:ConstantTemperatureControl a pumps:ControlModeEnum ; +pumps:ConstantTemperatureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "ConstantTemperatureControl" . -pumps:Constant_differential_pressure_control a pumps:OfferedControlModesOptionSet ; +pumps:Constant_differential_pressure_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Constant_differential_pressure_control" . -pumps:Constant_pressure_control a pumps:OfferedControlModesOptionSet ; +pumps:Constant_pressure_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Constant_pressure_control" . -pumps:Constant_temperature_control a pumps:OfferedControlModesOptionSet ; +pumps:Constant_temperature_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Constant_temperature_control" . pumps:ControlNet a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "ControlNet" . pumps:DALI a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "DALI" . -pumps:DECTULE a pumps:FieldbusEnum ; +pumps:DECTULE a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "DECTULE" . -pumps:DECT_ULE a pumps:OfferedFieldbusesOptionSet ; +pumps:DECT_ULE a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "DECT_ULE" . pumps:DMX a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "DMX" . pumps:DeviceNet a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "DeviceNet" . -pumps:DifferentialPressureControl a pumps:ControlModeEnum ; +pumps:DifferentialPressureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "DifferentialPressureControl" . -pumps:Differential_pressure_control a pumps:OfferedControlModesOptionSet ; +pumps:Differential_pressure_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Differential_pressure_control" . -pumps:Disabled a pumps:PumpKickModeEnum ; +pumps:Disabled a pumps:PumpKickModeEnum, + owl:NamedIndividual ; base:hasFieldName "Disabled" . -pumps:DownState a pumps:StateOfTheItemEnum ; +pumps:DownState a pumps:StateOfTheItemEnum, + owl:NamedIndividual ; base:hasFieldName "DownState" . pumps:EnOcean a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "EnOcean" . pumps:EtherCAT a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "EtherCAT" . -pumps:EthernetTCP_IP a pumps:FieldbusEnum ; +pumps:EthernetTCP_IP a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "EthernetTCP_IP" . pumps:Ethernet_IP a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Ethernet_IP" . -pumps:Ethernet_TCP_IP a pumps:OfferedFieldbusesOptionSet ; +pumps:Ethernet_TCP_IP a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Ethernet_TCP_IP" . -pumps:ExchangeDisabled a pumps:ExchangeModeEnum ; +pumps:ExchangeDisabled a pumps:ExchangeModeEnum, + owl:NamedIndividual ; base:hasFieldName "ExchangeDisabled" . -pumps:ExternalDisabledState a pumps:StateOfTheItemEnum ; +pumps:ExternalDisabledState a pumps:StateOfTheItemEnum, + owl:NamedIndividual ; base:hasFieldName "ExternalDisabledState" . -pumps:FlowDependentDifferentialPressureControl a pumps:ControlModeEnum ; +pumps:FlowDependentDifferentialPressureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "FlowDependentDifferentialPressureControl" . -pumps:FlowRateControl a pumps:ControlModeEnum ; +pumps:FlowRateControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "FlowRateControl" . -pumps:FlowTemperatureControl a pumps:ControlModeEnum ; +pumps:FlowTemperatureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "FlowTemperatureControl" . -pumps:Flow_dependent_differential_pressure_control a pumps:OfferedControlModesOptionSet ; +pumps:Flow_dependent_differential_pressure_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Flow_dependent_differential_pressure_control" . -pumps:Flow_rate_control a pumps:OfferedControlModesOptionSet ; +pumps:Flow_rate_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Flow_rate_control" . -pumps:Flow_temperature_control a pumps:OfferedControlModesOptionSet ; +pumps:Flow_temperature_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Flow_temperature_control" . pumps:GSM a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "GSM" . pumps:HART a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "HART" . pumps:IEEE1588 a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "IEEE1588" . pumps:IO_Link a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "IO_Link" . -pumps:IdleState a pumps:StateOfTheItemEnum ; +pumps:IdleState a pumps:StateOfTheItemEnum, + owl:NamedIndividual ; base:hasFieldName "IdleState" . -pumps:In a pumps:PortDirectionEnum ; +pumps:In a pumps:PortDirectionEnum, + owl:NamedIndividual ; base:hasFieldName "In" . -pumps:InOut a pumps:PortDirectionEnum ; +pumps:InOut a pumps:PortDirectionEnum, + owl:NamedIndividual ; base:hasFieldName "InOut" . pumps:Interbus a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Interbus" . pumps:KNX a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "KNX" . pumps:LIN_Bus a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "LIN_Bus" . pumps:LON a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "LON" . pumps:LTE a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "LTE" . pumps:LTE_M a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "LTE_M" . -pumps:Level1 a pumps:MaintenanceLevelEnum ; +pumps:Level1 a pumps:MaintenanceLevelEnum, + owl:NamedIndividual ; base:hasFieldName "Level1" . -pumps:Level2 a pumps:MaintenanceLevelEnum ; +pumps:Level2 a pumps:MaintenanceLevelEnum, + owl:NamedIndividual ; base:hasFieldName "Level2" . -pumps:Level3 a pumps:MaintenanceLevelEnum ; +pumps:Level3 a pumps:MaintenanceLevelEnum, + owl:NamedIndividual ; base:hasFieldName "Level3" . -pumps:Level4 a pumps:MaintenanceLevelEnum ; +pumps:Level4 a pumps:MaintenanceLevelEnum, + owl:NamedIndividual ; base:hasFieldName "Level4" . -pumps:Level5 a pumps:MaintenanceLevelEnum ; +pumps:Level5 a pumps:MaintenanceLevelEnum, + owl:NamedIndividual ; base:hasFieldName "Level5" . -pumps:LiquidPump a pumps:PumpClassEnum ; +pumps:LiquidPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "LiquidPump" . pumps:LoRaWAN a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "LoRaWAN" . -pumps:M1 a pumps:ExplosionProtectionOptionSet ; +pumps:M1 a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "M1" . -pumps:M2 a pumps:ExplosionProtectionOptionSet ; +pumps:M2 a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "M2" . pumps:MP_Bus a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "MP_Bus" . pumps:M_Bus a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "M_Bus" . pumps:ManufacturerSpecific a pumps:DistributionTypeEnum, pumps:ExchangeModeEnum, - pumps:PumpKickModeEnum ; + pumps:PumpKickModeEnum, + owl:NamedIndividual ; base:hasFieldName "ManufacturerSpecific" . -pumps:Master a pumps:PumpRoleEnum ; +pumps:Master a pumps:PumpRoleEnum, + owl:NamedIndividual ; base:hasFieldName "Master" . -pumps:MixedRedundancy a pumps:MultiPumpOperationModeEnum ; +pumps:MixedRedundancy a pumps:MultiPumpOperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "MixedRedundancy" . -pumps:ModbusRTU a pumps:FieldbusEnum ; +pumps:ModbusRTU a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "ModbusRTU" . -pumps:ModbusTCP a pumps:FieldbusEnum ; +pumps:ModbusTCP a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "ModbusTCP" . -pumps:Modbus_RTU a pumps:OfferedFieldbusesOptionSet ; +pumps:Modbus_RTU a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Modbus_RTU" . -pumps:Modbus_TCP a pumps:OfferedFieldbusesOptionSet ; +pumps:Modbus_TCP a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Modbus_TCP" . pumps:NB_IOT a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "NB_IOT" . pumps:NFC a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "NFC" . -pumps:OPCDA a pumps:FieldbusEnum ; +pumps:OPCDA a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "OPCDA" . -pumps:OPCUA a pumps:FieldbusEnum ; +pumps:OPCUA a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "OPCUA" . -pumps:OPC_DA a pumps:OfferedFieldbusesOptionSet ; +pumps:OPC_DA a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "OPC_DA" . -pumps:OPC_UA a pumps:OfferedFieldbusesOptionSet ; +pumps:OPC_UA a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "OPC_UA" . -pumps:OpenLoopMax a pumps:OperationModeEnum ; +pumps:OpenLoopMax a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "OpenLoopMax" . -pumps:OpenLoopMin a pumps:OperationModeEnum ; +pumps:OpenLoopMin a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "OpenLoopMin" . -pumps:OpenLoopValue a pumps:OperationModeEnum ; +pumps:OpenLoopValue a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "OpenLoopValue" . -pumps:OperatingState a pumps:StateOfTheItemEnum ; +pumps:OperatingState a pumps:StateOfTheItemEnum, + owl:NamedIndividual ; base:hasFieldName "OperatingState" . pumps:OperatorSpecific a pumps:DistributionTypeEnum, pumps:ExchangeModeEnum, - pumps:PumpKickModeEnum ; + pumps:PumpKickModeEnum, + owl:NamedIndividual ; base:hasFieldName "OperatorSpecific" . pumps:Other a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Other" . -pumps:Out a pumps:PortDirectionEnum ; +pumps:Out a pumps:PortDirectionEnum, + owl:NamedIndividual ; base:hasFieldName "Out" . -pumps:PROFIBUSDP a pumps:FieldbusEnum ; +pumps:PROFIBUSDP a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "PROFIBUSDP" . -pumps:PROFIBUS_DP a pumps:OfferedFieldbusesOptionSet ; +pumps:PROFIBUS_DP a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "PROFIBUS_DP" . -pumps:PROFINETRT a pumps:FieldbusEnum ; +pumps:PROFINETRT a pumps:FieldbusEnum, + owl:NamedIndividual ; base:hasFieldName "PROFINETRT" . -pumps:PROFINET_RT a pumps:OfferedFieldbusesOptionSet ; +pumps:PROFINET_RT a pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "PROFINET_RT" . -pumps:ParallelOperation a pumps:OperatingModeEnum ; +pumps:ParallelOperation a pumps:OperatingModeEnum, + owl:NamedIndividual ; base:hasFieldName "ParallelOperation" . -pumps:PositiveDisplacementPump a pumps:PumpClassEnum ; +pumps:PositiveDisplacementPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "PositiveDisplacementPump" . pumps:Powerlink a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Powerlink" . -pumps:ProcessVacuumPump a pumps:PumpClassEnum ; +pumps:ProcessVacuumPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "ProcessVacuumPump" . -pumps:Pump a pumps:PumpClassEnum ; +pumps:Pump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "Pump" . -pumps:RedundancyOperation a pumps:MultiPumpOperationModeEnum ; +pumps:RedundancyOperation a pumps:MultiPumpOperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "RedundancyOperation" . -pumps:ReturnFlowTemperatureControl a pumps:ControlModeEnum ; +pumps:ReturnFlowTemperatureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "ReturnFlowTemperatureControl" . -pumps:Return_flow_temperature_control a pumps:OfferedControlModesOptionSet ; +pumps:Return_flow_temperature_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Return_flow_temperature_control" . -pumps:RotodynamicPump a pumps:PumpClassEnum ; +pumps:RotodynamicPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "RotodynamicPump" . -pumps:S1D a pumps:ExplosionProtectionOptionSet ; +pumps:S1D a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S1D" . -pumps:S1G a pumps:ExplosionProtectionOptionSet ; +pumps:S1G a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S1G" . -pumps:S2006_42_EC a pumps:DeclarationOfConformityOptionSet ; +pumps:S2006_42_EC a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2006_42_EC" . -pumps:S2009_125_EC a pumps:DeclarationOfConformityOptionSet ; +pumps:S2009_125_EC a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2009_125_EC" . -pumps:S2011_65_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2011_65_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2011_65_EU" . -pumps:S2014_29_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2014_29_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2014_29_EU" . -pumps:S2014_30_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2014_30_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2014_30_EU" . -pumps:S2014_34_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2014_34_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2014_34_EU" . -pumps:S2014_35_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2014_35_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2014_35_EU" . -pumps:S2014_68_EU a pumps:DeclarationOfConformityOptionSet ; +pumps:S2014_68_EU a pumps:DeclarationOfConformityOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2014_68_EU" . -pumps:S2D a pumps:ExplosionProtectionOptionSet ; +pumps:S2D a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2D" . -pumps:S2G a pumps:ExplosionProtectionOptionSet ; +pumps:S2G a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S2G" . -pumps:S3D a pumps:ExplosionProtectionOptionSet ; +pumps:S3D a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S3D" . -pumps:S3G a pumps:ExplosionProtectionOptionSet ; +pumps:S3G a pumps:ExplosionProtectionOptionSet, + owl:NamedIndividual ; base:hasFieldName "S3G" . pumps:SERCOS a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "SERCOS" . pumps:SMI a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "SMI" . -pumps:SeriesOperation a pumps:OperatingModeEnum ; +pumps:SeriesOperation a pumps:OperatingModeEnum, + owl:NamedIndividual ; base:hasFieldName "SeriesOperation" . -pumps:SingleOperation a pumps:OperatingModeEnum ; +pumps:SingleOperation a pumps:OperatingModeEnum, + owl:NamedIndividual ; base:hasFieldName "SingleOperation" . -pumps:Slave a pumps:PumpRoleEnum ; +pumps:Slave a pumps:PumpRoleEnum, + owl:NamedIndividual ; base:hasFieldName "Slave" . -pumps:SlaveAndAuxiliaryMaster a pumps:PumpRoleEnum ; +pumps:SlaveAndAuxiliaryMaster a pumps:PumpRoleEnum, + owl:NamedIndividual ; base:hasFieldName "SlaveAndAuxiliaryMaster" . -pumps:SpeedControl a pumps:ControlModeEnum ; +pumps:SpeedControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "SpeedControl" . -pumps:Speed_control a pumps:OfferedControlModesOptionSet ; +pumps:Speed_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Speed_control" . -pumps:StandBy a pumps:OperationModeEnum ; +pumps:StandBy a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "StandBy" . -pumps:StandByState a pumps:StateOfTheItemEnum ; +pumps:StandByState a pumps:StateOfTheItemEnum, + owl:NamedIndividual ; base:hasFieldName "StandByState" . -pumps:Standalone a pumps:MultiPumpOperationModeEnum ; +pumps:Standalone a pumps:MultiPumpOperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "Standalone" . -pumps:Test a pumps:OperationModeEnum ; +pumps:Test a pumps:OperationModeEnum, + owl:NamedIndividual ; base:hasFieldName "Test" . pumps:Thread a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Thread" . -pumps:TurboVacuumPump a pumps:PumpClassEnum ; +pumps:TurboVacuumPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "TurboVacuumPump" . pumps:UMTS a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "UMTS" . pumps:Uncontrolled a pumps:ControlModeEnum, - pumps:OfferedControlModesOptionSet ; + pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Uncontrolled" . pumps:VARAN a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "VARAN" . -pumps:VacuumPump a pumps:PumpClassEnum ; +pumps:VacuumPump a pumps:PumpClassEnum, + owl:NamedIndividual ; base:hasFieldName "VacuumPump" . -pumps:VariableDifferentialPressureControl a pumps:ControlModeEnum ; +pumps:VariableDifferentialPressureControl a pumps:ControlModeEnum, + owl:NamedIndividual ; base:hasFieldName "VariableDifferentialPressureControl" . -pumps:Variable_differential_pressure_control a pumps:OfferedControlModesOptionSet ; +pumps:Variable_differential_pressure_control a pumps:OfferedControlModesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Variable_differential_pressure_control" . pumps:WIFI a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "WIFI" . pumps:X2X_Link a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "X2X_Link" . pumps:Z_Wave a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "Z_Wave" . pumps:ZigBee a pumps:FieldbusEnum, - pumps:OfferedFieldbusesOptionSet ; + pumps:OfferedFieldbusesOptionSet, + owl:NamedIndividual ; base:hasFieldName "ZigBee" . -pumps:Zone_0 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_0 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_0" . -pumps:Zone_1 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_1 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_1" . -pumps:Zone_2 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_2 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_2" . -pumps:Zone_20 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_20 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_20" . -pumps:Zone_21 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_21 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_21" . -pumps:Zone_22 a pumps:ExplosionZoneOptionSet ; +pumps:Zone_22 a pumps:ExplosionZoneOptionSet, + owl:NamedIndividual ; base:hasFieldName "Zone_22" . pumps:nodei1002 a opcua:ObjectTypeNodeClass ; @@ -1819,11 +1969,13 @@ opcua:nodei92 base:hasComponent pumps:nodei6004 . opcua:nodei93 base:hasComponent pumps:nodei6002 . -pumps:City a base:Field ; +pumps:City a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "City" . -pumps:Country a base:Field ; +pumps:Country a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "Country" . @@ -1831,22 +1983,26 @@ pumps:IPumpVendorNameplateType a owl:Class ; rdfs:subClassOf machinery:IMachineVendorNameplateType ; base:isAbstract "true" . -pumps:Number a base:Field ; +pumps:Number a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "Number" . -pumps:PostalCode a base:Field ; +pumps:PostalCode a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "PostalCode" . pumps:PumpType a owl:Class ; rdfs:subClassOf devices:TopologyElementType . -pumps:State a base:Field ; +pumps:State a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "State" . -pumps:Street a base:Field ; +pumps:Street a owl:NamedIndividual, + base:Field ; base:hasDatatype opcua:LocalizedText ; base:hasFieldName "Street" . diff --git a/semantic-model/opcua/tests/test_libbindings.py b/semantic-model/opcua/tests/test_libbindings.py new file mode 100644 index 00000000..2dfd9894 --- /dev/null +++ b/semantic-model/opcua/tests/test_libbindings.py @@ -0,0 +1,94 @@ +# tests/test_bindings.py +import unittest +from unittest.mock import MagicMock, patch +from rdflib import Graph, Namespace, Literal, URIRef +from rdflib.namespace import RDF +from lib.bindings import Bindings +import lib.utils as utils + + +class TestBindings(unittest.TestCase): + + def setUp(self): + """Set up common test data.""" + self.namespace_prefix = "http://example.org/" + self.basens = Namespace("http://example.org/base/") + self.bindings_instance = Bindings(self.namespace_prefix, self.basens) + + @patch('random.choices', return_value=['A', 'B', 'C', 'D']) + @patch('lib.utils.idtype2String', return_value='i') + def test_create_binding(self, mock_idtype2string, mock_random_choices): + """Test creating a binding and adding it to the RDF graph.""" + g = Graph() + parent_node_id = URIRef("http://example.org/parentNode") + var_node = URIRef("http://example.org/varNode") + attribute_iri = URIRef("http://example.org/attributeIri") + + # Mocking objects in graph g + g.objects = MagicMock(side_effect=[ + iter([URIRef("http://example.org/dtype")]), # hasDatatype + iter([Literal("node123")]), # hasNodeId + iter([Literal("numericID")]), # hasIdentifierType + iter([URIRef("http://example.org/ns")]), # hasNamespace + iter([Literal("http://example.org/nsuri")]) # hasUri + ]) + + # Call the create_binding method + self.bindings_instance.create_binding(g, parent_node_id, var_node, attribute_iri) + + # Check if the triples are added correctly + triples = list(self.bindings_instance.bindingsg) + self.assertEqual(len(triples), 12) # Ensure 10 triples are added + + bindingiri = self.bindings_instance.binding_namespace['binding_ABCD'] + mapiri = self.bindings_instance.binding_namespace['map_ABCD'] + + # Check specific triples to ensure correct addition + self.assertIn((bindingiri, RDF['type'], self.basens['Binding']), triples) + self.assertIn((bindingiri, self.basens['bindsEntity'], parent_node_id), triples) + self.assertIn((bindingiri, self.basens['bindingVersion'], Literal('0.1')), triples) + self.assertIn((bindingiri, self.basens['bindsFirmware'], Literal('firmware')), triples) + self.assertIn((bindingiri, self.basens['bindsMap'], mapiri), triples) + self.assertIn((attribute_iri, self.basens['boundBy'], bindingiri), triples) + self.assertIn((mapiri, RDF['type'], self.basens['BoundMap']), triples) + self.assertIn((mapiri, self.basens['bindsConnector'], self.basens['OPCUAConnector']), triples) + self.assertIn((mapiri, self.basens['bindsMapDatatype'], URIRef("http://example.org/dtype")), triples) + self.assertIn((mapiri, self.basens['bindsConnectorAttribute'], Literal('nsu=http://example.org/nsuri;i=node123')), triples) + + def test_bind(self): + """Test binding a prefix to a namespace in the RDF graph.""" + prefix = 'ex' + namespace = Namespace('http://example.org/ex/') + self.bindings_instance.bind(prefix, namespace) + + # Check if the namespace binding is added correctly + bindings = dict(self.bindings_instance.bindingsg.namespaces()) + self.assertIn(prefix, bindings) + self.assertEqual(str(bindings[prefix]), str(namespace)) + + def test_len(self): + """Test getting the length of the RDF graph.""" + # Initially, the graph should be empty + self.assertEqual(self.bindings_instance.len(), 0) + + # Add a triple and check the length + self.bindings_instance.bindingsg.add((URIRef("http://example.org/s"), RDF.type, URIRef("http://example.org/o"))) + self.assertEqual(self.bindings_instance.len(), 1) + + @patch.object(Graph, 'serialize', return_value=None) + def test_serialize(self, mock_serialize): + """Test serializing the RDF graph to a file.""" + destination = "test_output.ttl" + + # Add a triple to the graph + self.bindings_instance.bindingsg.add((URIRef("http://example.org/s"), RDF.type, URIRef("http://example.org/o"))) + + # Call the serialize method + self.bindings_instance.serialize(destination) + + # Check that bindingsg.serialize was called with the correct arguments + mock_serialize.assert_called_once_with(destination) + + +if __name__ == "__main__": + unittest.main() diff --git a/semantic-model/opcua/tests/test_libentity.py b/semantic-model/opcua/tests/test_libentity.py new file mode 100644 index 00000000..d35f8225 --- /dev/null +++ b/semantic-model/opcua/tests/test_libentity.py @@ -0,0 +1,66 @@ +# tests/test_entity.py +import unittest +from unittest.mock import MagicMock, patch +from rdflib import Graph, Namespace, URIRef, Literal +from rdflib.namespace import RDF, OWL, RDFS +from lib.entity import Entity +import lib.utils as utils + +class TestEntity(unittest.TestCase): + + def setUp(self): + """Set up common test data.""" + self.namespace_prefix = "http://example.org/" + self.basens = Namespace("http://example.org/base/") + self.opcuans = Namespace("http://example.org/opcua/") + self.entity_instance = Entity(self.namespace_prefix, self.basens, self.opcuans) + + def test_add_type(self): + """Test adding a type to the internal list.""" + type_uri = URIRef("http://example.org/type") + self.entity_instance.add_type(type_uri) + self.assertIn(type_uri, self.entity_instance.types) + + def test_add_instancetype(self): + """Test adding instance type information to the RDF graph.""" + instancetype = URIRef("http://example.org/type") + attributename = "attributeName" + self.entity_instance.add_instancetype(instancetype, attributename) + + triples = list(self.entity_instance.get_graph()) + self.assertIn((self.entity_instance.entity_namespace[attributename], RDF.type, OWL.ObjectProperty), triples) + self.assertIn((self.entity_instance.entity_namespace[attributename], RDFS.domain, instancetype), triples) + self.assertIn((self.entity_instance.entity_namespace[attributename], RDF.type, OWL.NamedIndividual), triples) + + @patch.object(Graph, 'serialize', return_value=None) + def test_serialize(self, mock_serialize): + """Test serializing the RDF graph to a file.""" + destination = "test_output.ttl" + + # Add a triple to the graph + self.entity_instance.add((URIRef("http://example.org/s"), RDF.type, URIRef("http://example.org/o"))) + + # Call the serialize method + self.entity_instance.serialize(destination) + + # Check that e.serialize was called with the correct arguments + mock_serialize.assert_called_once_with(destination) + + + def test_add_enum_class(self): + """Test adding an enum class to the RDF graph.""" + contentclass = URIRef("http://example.org/enumClass") + graph = Graph() + + # Mocking query results + mock_result = [(URIRef("http://example.org/s"), URIRef("http://example.org/p"), URIRef("http://example.org/o"))] + graph.query = MagicMock(return_value=mock_result) + + self.entity_instance.add_enum_class(graph, contentclass) + + triples = list(self.entity_instance.get_graph()) + self.assertIn((URIRef("http://example.org/s"), URIRef("http://example.org/p"), URIRef("http://example.org/o")), triples) + graph.query.assert_called_once() + +if __name__ == "__main__": + unittest.main() diff --git a/semantic-model/opcua/tests/test_libjsonld.py b/semantic-model/opcua/tests/test_libjsonld.py new file mode 100644 index 00000000..035790a6 --- /dev/null +++ b/semantic-model/opcua/tests/test_libjsonld.py @@ -0,0 +1,114 @@ +# tests/test_jsonld.py +import unittest +from unittest.mock import MagicMock, patch +from rdflib import Graph, Namespace, URIRef, Literal +from lib.jsonld import JsonLd +import lib.utils as utils +from rdflib.namespace import XSD + + +class TestJsonLd(unittest.TestCase): + + def setUp(self): + """Set up common test data.""" + self.basens = Namespace("http://example.org/base/") + self.opcuans = Namespace("http://example.org/opcua/") + self.jsonld_instance = JsonLd(self.basens, self.opcuans) + + def test_add_instance(self): + """Test adding an instance to the JSON-LD data.""" + instance = {"id": "testId", "type": "TestType"} + self.jsonld_instance.add_instance(instance) + self.assertIn(instance, self.jsonld_instance.instances) + + @patch("builtins.open", new_callable=unittest.mock.mock_open) + @patch("json.dump") + def test_serialize(self, mock_json_dump, mock_open): + """Test serializing JSON-LD instances to a file.""" + instance = {"id": "testId", "type": "TestType"} + self.jsonld_instance.add_instance(instance) + + # Call the serialize method + self.jsonld_instance.serialize("test_output.json") + + # Check that open was called correctly + mock_open.assert_called_once_with("test_output.json", "w") + + # Check that json.dump was called with correct data + mock_json_dump.assert_called_once_with( + self.jsonld_instance.instances, mock_open(), ensure_ascii=False, indent=4 + ) + + @patch("builtins.open", new_callable=unittest.mock.mock_open) + @patch("json.dump") + def test_dump_context(self, mock_json_dump, mock_open): + """Test dumping JSON-LD context to a file.""" + namespaces = { + "base": {"@id": str(self.basens), "@prefix": True} + } + self.jsonld_instance.dump_context("context_output.json", namespaces) + + # Check that open was called correctly + mock_open.assert_called_once_with("context_output.json", "w") + + # Check that json.dump was called with correct data + mock_json_dump.assert_called_once_with( + { + "@context": [ + namespaces, + "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld" + ] + }, + mock_open(), + indent=2 + ) + + def test_map_datatype_to_jsonld(self): + """Test mapping OPC UA data types to JSON-LD data types.""" + # Boolean type test + result = JsonLd.map_datatype_to_jsonld(self.opcuans['Boolean'], self.opcuans) + self.assertEqual(result, XSD.boolean) + + # Integer type test + result = JsonLd.map_datatype_to_jsonld(self.opcuans['Int32'], self.opcuans) + self.assertEqual(result, XSD.integer) + + # Double type test + result = JsonLd.map_datatype_to_jsonld(self.opcuans['Double'], self.opcuans) + self.assertEqual(result, XSD.double) + + # Unknown type test + result = JsonLd.map_datatype_to_jsonld(self.opcuans['UnknownType'], self.opcuans) + self.assertEqual(result, XSD.string) + + @patch("lib.utils.idtype2String", return_value="i") + def test_generate_node_id(self, mock_idtype2string): + """Test generating node ID.""" + graph = Graph() + rootentity = URIRef("http://example.org/root") + node = URIRef("http://example.org/node") + id = "testId" + + # Mocking graph objects + graph.objects = MagicMock(side_effect=[ + iter([Literal("123")]), # hasNodeId + iter([Literal("numericID")]), # hasIdentifierType + iter([Literal("RootName")]) # hasBrowseName + ]) + + # Test for root entity + result = self.jsonld_instance.generate_node_id(graph, rootentity, rootentity, id) + self.assertEqual(result, "testId:RootName") + + graph.objects = MagicMock(side_effect=[ + iter([Literal("123")]), # hasNodeId + iter([Literal("numericID")]), # hasIdentifierType + iter([Literal("RootName")]) # hasBrowseName + ]) + # Test for a non-root entity + result = self.jsonld_instance.generate_node_id(graph, rootentity, node, id) + self.assertEqual(result, "testId:RootName:sub:i123") + + +if __name__ == "__main__": + unittest.main() diff --git a/semantic-model/opcua/tests/test_libshacl.py b/semantic-model/opcua/tests/test_libshacl.py new file mode 100644 index 00000000..84e753f4 --- /dev/null +++ b/semantic-model/opcua/tests/test_libshacl.py @@ -0,0 +1,132 @@ +# tests/test_shacl.py +import unittest +from unittest.mock import MagicMock, patch +from rdflib import Graph, Namespace, URIRef, Literal, BNode +from rdflib.namespace import RDF, RDFS, SH +from urllib.parse import urlparse +from lib.shacl import Shacl +import lib.utils as utils +from lib.jsonld import JsonLd + +class TestShacl(unittest.TestCase): + + def setUp(self): + """Set up common test data.""" + self.namespace_prefix = "http://example.org/" + self.basens = Namespace("http://example.org/base/") + self.opcuans = Namespace("http://example.org/opcua/") + self.shacl_instance = Shacl(self.namespace_prefix, self.basens, self.opcuans) + + def test_create_shacl_type(self): + """Test creating a SHACL type in the RDF graph.""" + targetclass = "http://example.org/TargetClass" + shapename = self.shacl_instance.create_shacl_type(targetclass) + + triples = list(self.shacl_instance.get_graph()) + self.assertIn((shapename, RDF.type, SH.NodeShape), triples) + self.assertIn((shapename, SH.targetClass, URIRef(targetclass)), triples) + + def test_create_shacl_property(self): + """Test creating a SHACL property in the RDF graph.""" + shapename = URIRef("http://example.org/shacl/ShapeName") + path = URIRef("http://example.org/path") + optional = True + is_array = False + is_property = True + is_iri = False + contentclass = None + datatype = URIRef("http://www.w3.org/2001/XMLSchema#string") + + self.shacl_instance.create_shacl_property(shapename, path, optional, is_array, is_property, is_iri, contentclass, datatype) + + triples = list(self.shacl_instance.get_graph()) + + # Find the bnodes created for property and innerproperty + property_bnode = None + innerproperty_bnode = None + + for s, p, o in triples: + if s == shapename and p == SH.property: + property_bnode = o + elif p == SH.path and o == path: + property_bnode = s + elif p == SH.path and (o == self.shacl_instance.ngsildns['hasValue'] or o == self.shacl_instance.ngsildns['hasObject']): + innerproperty_bnode = s + + # Check that the BNodes exist and are properly linked + self.assertIsNotNone(property_bnode) + self.assertIsInstance(property_bnode, BNode) + self.assertIn((shapename, SH.property, property_bnode), triples) + self.assertIn((property_bnode, SH.path, path), triples) + + self.assertIsNotNone(innerproperty_bnode) + self.assertIsInstance(innerproperty_bnode, BNode) + self.assertIn((property_bnode, SH.property, innerproperty_bnode), triples) + + def test_get_typename(self): + """Test extracting type name from a URL.""" + url = "http://example.org/Type#MyType" + result = self.shacl_instance.get_typename(url) + self.assertEqual(result, "MyType") + + url = "http://example.org/Type/MyType" + result = self.shacl_instance.get_typename(url) + self.assertEqual(result, "MyType") + + def test_bind(self): + """Test binding a prefix to a namespace in the RDF graph.""" + prefix = 'ex' + namespace = Namespace('http://example.org/ex/') + self.shacl_instance.bind(prefix, namespace) + + bindings = dict(self.shacl_instance.get_graph().namespaces()) + self.assertIn(prefix, bindings) + self.assertEqual(str(bindings[prefix]), str(namespace)) + + @patch.object(Graph, 'serialize', return_value=None) + def test_serialize(self, mock_serialize): + """Test serializing the RDF graph to a file.""" + destination = "test_output.ttl" + + # Add a triple to the graph + self.shacl_instance.shaclg.add((URIRef("http://example.org/s"), RDF.type, URIRef("http://example.org/o"))) + + # Call the serialize method + self.shacl_instance.serialize(destination) + + # Check that shaclg.serialize was called with the correct arguments + mock_serialize.assert_called_once_with(destination) + + @patch('lib.utils.get_datatype', return_value=URIRef("http://example.org/datatype")) + @patch('lib.jsonld.JsonLd.map_datatype_to_jsonld', return_value=Literal("xsd:string")) + def test_get_shacl_iri_and_contentclass(self, mock_map_datatype_to_jsonld, mock_get_datatype): + """Test retrieving SHACL IRI and content class.""" + g = Graph() + node = URIRef("http://example.org/node") + shacl_rule = {} + + # Mocking graph objects + g.objects = MagicMock(side_effect=[ + iter([URIRef("http://example.org/Enumeration")]), # RDFS.subClassOf + ]) + + self.shacl_instance.get_shacl_iri_and_contentclass(g, node, shacl_rule) + + self.assertFalse(shacl_rule['is_iri']) + self.assertIsNone(shacl_rule['contentclass']) + mock_get_datatype.assert_called_once_with(g, node, self.basens) + + @patch.object(Graph, 'query', return_value=[(Literal(0), Literal(1))]) + def test_get_modelling_rule(self, mock_query): + """Test retrieving modeling rules from SHACL graph.""" + path = URIRef("http://example.org/path") + target_class = URIRef("http://example.org/TargetClass") + + optional, array = self.shacl_instance.get_modelling_rule(path, target_class) + + self.assertTrue(optional) + self.assertFalse(array) + mock_query.assert_called_once() + +if __name__ == "__main__": + unittest.main() diff --git a/semantic-model/opcua/tests/test_libutils.py b/semantic-model/opcua/tests/test_libutils.py new file mode 100644 index 00000000..d5ec399a --- /dev/null +++ b/semantic-model/opcua/tests/test_libutils.py @@ -0,0 +1,146 @@ +# tests/test_utils.py +import unittest +from unittest.mock import MagicMock, patch +from rdflib import Graph, Namespace, URIRef, Literal +from rdflib.namespace import RDFS, XSD, OWL +from lib.utils import RdfUtils, downcase_string, isNodeId, convert_to_json_type, idtype2String, extract_namespaces, get_datatype, attributename_from_type, get_default_value, normalize_angle_bracket_name, contains_both_angle_brackets, get_typename + +class TestUtils(unittest.TestCase): + + def setUp(self): + """Set up common test data.""" + self.basens = Namespace("http://example.org/base/") + self.opcuans = Namespace("http://example.org/opcua/") + self.rdf_utils = RdfUtils(self.basens, self.opcuans) + + def test_downcase_string(self): + """Test downcasing the first character of a string.""" + self.assertEqual(downcase_string("TestString"), "testString") + self.assertEqual(downcase_string("anotherTest"), "anotherTest") + + def test_isNodeId(self): + """Test checking if a string is a NodeId.""" + self.assertTrue(isNodeId("i=1234")) + self.assertTrue(isNodeId("g=abcd")) + self.assertTrue(isNodeId("s=test")) + self.assertFalse(isNodeId("unknown")) + + def test_convert_to_json_type(self): + """Test converting various types to JSON compatible types.""" + self.assertEqual(convert_to_json_type("123", "integer"), 123) + self.assertEqual(convert_to_json_type("True", "boolean"), True) + self.assertEqual(convert_to_json_type("123.45", "number"), 123.45) + self.assertEqual(convert_to_json_type(123, "string"), "123") + + def test_idtype2String(self): + """Test converting id types to their string representations.""" + self.assertEqual(idtype2String(self.basens['numericID'], self.basens), 'i') + self.assertEqual(idtype2String(self.basens['stringID'], self.basens), 's') + self.assertEqual(idtype2String(self.basens['guidID'], self.basens), 'g') + self.assertEqual(idtype2String(self.basens['opaqueID'], self.basens), 'b') + self.assertEqual(idtype2String(URIRef("http://example.org/unknownID"), self.basens), 'x') + + def test_extract_namespaces(self): + """Test extracting namespaces from an RDF graph.""" + graph = Graph() + graph.bind("base", self.basens) + graph.bind("opcua", self.opcuans) + + expected_namespaces = { + "base": { + "@id": str(self.basens), + "@prefix": True + }, + "opcua": { + "@id": str(self.opcuans), + "@prefix": True + } + } + + result = extract_namespaces(graph) + + # Filter result to only include the namespaces of interest + filtered_result = {k: v for k, v in result.items() if k in expected_namespaces} + + self.assertEqual(filtered_result, expected_namespaces) + + + def test_get_datatype(self): + """Test retrieving a datatype from the RDF graph.""" + graph = Graph() + node = URIRef("http://example.org/node") + graph.add((node, self.basens['hasDatatype'], XSD.string)) + + result = get_datatype(graph, node, self.basens) + self.assertEqual(result, XSD.string) + + def test_attributename_from_type(self): + """Test extracting attribute name from a type.""" + type_uri = "http://example.org/SomeType" + result = attributename_from_type(type_uri) + self.assertEqual(result, "Some") + + def test_get_default_value(self): + """Test getting the default value for a datatype.""" + self.assertEqual(get_default_value(XSD.integer), 0) + self.assertEqual(get_default_value(XSD.double), 0.0) + self.assertEqual(get_default_value(XSD.string), '') + self.assertEqual(get_default_value(XSD.boolean), False) + + def test_normalize_angle_bracket_name(self): + """Test normalizing a name by removing angle bracket content.""" + input_str = "example123" + result = normalize_angle_bracket_name(input_str) + self.assertEqual(result, "example") + + def test_contains_both_angle_brackets(self): + """Test checking if a string contains both angle brackets.""" + self.assertTrue(contains_both_angle_brackets("example")) + self.assertFalse(contains_both_angle_brackets("example")) + + def test_get_typename(self): + """Test getting type name from a URL.""" + url = "http://example.org/Type#MyType" + result = get_typename(url) + self.assertEqual(result, "MyType") + + url = "http://example.org/Type/MyType" + result = get_typename(url) + self.assertEqual(result, "MyType") + + @patch.object(Graph, 'query', return_value=[(None, URIRef("http://example.org/realtype"))]) + def test_get_type(self, mock_query): + """Test retrieving the type of a node from the RDF graph.""" + g = Graph() + node = URIRef("http://example.org/node") + + nodeclass, realtype = self.rdf_utils.get_type(g, node) + + # Check if the nodeclass is None and realtype is as expected + self.assertIsNone(nodeclass) + self.assertEqual(realtype, URIRef("http://example.org/realtype")) + + mock_query.assert_called_once() + + + @patch.object(Graph, 'query', return_value=[(URIRef("http://example.org/reference"), URIRef("http://example.org/target"))]) + def test_get_generic_references(self, mock_query): + """Test retrieving generic references from the RDF graph.""" + g = Graph() + node = URIRef("http://example.org/node") + + references = self.rdf_utils.get_generic_references(g, node) + self.assertEqual(references, [(URIRef("http://example.org/reference"), URIRef("http://example.org/target"))]) + mock_query.assert_called_once() + + @patch.object(Graph, 'query', return_value=[(URIRef("http://example.org/subclass"),)]) + def test_get_ignored_references(self, mock_query): + """Test retrieving ignored references from the RDF graph.""" + g = Graph() + + ignored_references = self.rdf_utils.get_ignored_references(g) + self.assertEqual(ignored_references, [URIRef("http://example.org/subclass")]) + mock_query.assert_called_once() + +if __name__ == "__main__": + unittest.main() diff --git a/test/bats/test-device-connection/test-subcomponent-creation.bats b/test/bats/test-device-connection/test-subcomponent-creation.bats index a1abdffe..2ec17601 100644 --- a/test/bats/test-device-connection/test-subcomponent-creation.bats +++ b/test/bats/test-device-connection/test-subcomponent-creation.bats @@ -331,7 +331,7 @@ EOF for id in "${SCHEMA_IDS[@]}"; do node $JSONSCHEMA2SHACL -s "${SCHEMA}" -i "$id" -c "$CONTEXT" done | sed 's/"/\\"/g' | xargs echo | rdfpipe - > ${SHACL_FILE} - node $GETSUBCOMPONENTS -e "$ENTITY_FILE" -t "$token" "$FILTERID" > $SUBCOMPONENTS + node $GETSUBCOMPONENTS -e "$ENTITY_FILE" -s "${SHACL_FILE}" -t "$token" "$FILTERID" > $SUBCOMPONENTS run compare_subcomponents "$SUBCOMPONENTS" [ "$status" -eq 0 ] delete_ngsild "$token" "$FILTERID"