Dataset Telemark 120 - statnett/Talk2PowerSystem GitHub Wiki

Table of Contents

Intro

Telemark-120 (formerly CIM4NoUtility and DIGIN10 Grunnprofil) is another dataset of the NO grid It includes extra kinds of data:

  • Aviation obstacles
  • Geospatial data
  • Timeseries data ("schedules")

The main problem is where to obtain ontologies for all the novel data in this dataset, see Missing Ontology Terms and its subsections

Tasks

Tasks:

  • Graphwise to analyse and describe the dataset: variety of data and volumetrics
  • Graphwise to post issues that might need to be fixed
  • Graphwise/Statnett to describe queries that can be answered only by Telemark-120: [Demo4 Telemark-120] (first cut)
  • Graphwise/Statnett to look if there's correlation of resources between Nordic44 and Telemark-120, because cross-dataset questions may be most interesting
  • Elbits to provide nc-no ontology and any other classes/props/enums appearing in Telemark-120 data

Posted issues:

Telemark-120 issues (stats as of 14-Jul-2025):

Scope

"Map of the territory" from FileNameStandard.adoc, and complemented with actual files found (see RDF Files to Load)

"Roles"

  • HV1: High Voltage
  • MV1: Medium Voltage
  • LV1: Low Voltage
  • M1: Manufacture

Usual profiles (also found in ENTSO-E Conformance and Nordic44):

  • DL: Diagram Layout
  • EQ: Equipment Core
  • GL: Geographical Location: but includes GeoJSON
  • OP: Equipment Operation
  • SSH: Steady State Hypothesis
  • SV: State Variables
  • TP: Topology

Assets (added recently to Nordi44)

  • AC: Asset Catalog (as per manufacturer)
  • AS: Asset information (as per owner)

Less usual profiles

  • CU: Customer
  • SC: Equipment Short Circuit
  • OR: Object Registry
  • AO: Aviation Obstacle
  • Boundary Models:
    • HV1-MV1_BM: High Voltage - Medium Voltage
    • MV1-LV1_BM: Medium Voltage - Low Voltage

Reference Data

  • BaseVoltage_RD: Base Voltage
  • GeographicalRegion_RD: Geographical Region
  • MeasurementValueSource_RD: Measurement Value Source
  • ReadingQualityType_RD: Reading Quality Type
  • ReadingType_RD: Reading Type

Folders and Files

Clone the repo

git clone [email protected]:3lbits/CIM4NoUtility.git
cd CIM4NoUtility

Show all folders and files (without .git folders)

ls -1RF .

Count files

ls -1RF .|grep -c '\*$'
263

Count folders

ls -1RF .|grep -c '/$'
33

List folders

find . -type d
./Code Scripts/Neo4J
./Code Scripts/Python
./Code Scripts/Python/cim-convert-tool
./Code Scripts/Python/cim-convert-tool/archive
./Code Scripts/Python/cim-convert-tool/archive/20230413
./Code Scripts/Python/cim-convert-tool/_config
./Code Scripts/Python/cim-convert-tool/_config/Archive
./Code Scripts/Python/cim-convert-tool/_config/Archive/Previous
./Code Scripts/Python/cim-convert-tool/_data
./Code Scripts/Python/cim-convert-tool/_data/CIMXML
./Code Scripts/Python/cim-convert-tool/_data/CIMXML_Output
./Code Scripts/Python/cim-convert-tool/_data/JSON-LD
./Telemark-120
./Telemark-120/Asset
./Telemark-120/Asset/CIMJSON-LD
./Telemark-120/Asset/CIMJSON-LD/AviationObstacle
./Telemark-120/Asset/CIMJSON-LD/AviationObstacle/jsonSchemas
./Telemark-120/Asset/CIMJSON-LD/AviationObstacle/jsonSchemas/SubSchemas
./Telemark-120/Asset/CIMXML
./Telemark-120/diagrams
./Telemark-120/diagrams/images
./Telemark-120/diagrams/png
./Telemark-120/diagrams/svg
./Telemark-120/docs
./Telemark-120/Grid
./Telemark-120/Grid/CIMJSON-LD
./Telemark-120/Grid/CIMXML
./Telemark-120/Schedule
./Telemark-120/Schedule/2022
./Telemark-120/Schedule/2022/03
./Telemark-120/Schedule/2022/03/30
./Telemark-120/Validation

Docs

Important docs that I list in subjective order of importance.

Modeling

File manipulation

Diagrams

JSON-LD Representation

In addition to CIMXML this dataset includes JSON-LD

cd CIM4NoUtility/Telemark-120/Asset/CIMJSON-LD
riot.bat --formatted trig Telemark-120-LV1_AS.jsonld > Telemark-120-LV1_AS.trig

JSON-LD Pros

  • Uses latest CIM namespaces (TODO check no-nc extensons)
PREFIX cim:     <https://cim.ucaiug.io/ns#>
PREFIX eu:      <https://cim.ucaiug.io/ns/eu#>
  • Uses urn:uuid: for resources, so there is no trouble with under-defined or divergent URLs
  • Uses named graphs for models
  • Uses the latest dcat representation of model metadata.
    • (Doesn't use differential models and the dcat-cim extensions)
  • Uses strict naming conventions for name and descripition, and has mRID:
<urn:uuid:fc57ebb1-8059-4dd7-9811-2129b912dd45>
  rdf:type                         cim:Terminal;
  cim:IdentifiedObject.name        "TELEMA2 04 T15";
  cim:IdentifiedObject.description "Telemarkstien2 400 Volt Terminal 15";
  cim:IdentifiedObject.mRID        "fc57ebb1-8059-4dd7-9811-2129b912dd45";

JSON-LD Cons

  • There are still a number of open json issues (see all json issues)
  • Lexical form '2022-10-28T13:37:00Z' not valid for datatype XSD date: Reported as JSON-LD dct:issued: wrong datatype #361
  • Dataset metadata (model header) is in the default graph. This differs from the decision in Inst4CIM-KG and Nordic44
  • Uses plain strings for some numeric values, eg
    "cim:Asset.purchasePrice": "500.00",
  • Uses JSON numbers for other numeric values
  "cim:EndDevice.timeZoneOffset": 1.0,

  "cim:Conductor.length":        50.0,
  "cim:ACLineSegment.bch":        0.0,
  "cim:ACLineSegment.gch":        0.0,
  "cim:ACLineSegment.r":          0.015999999945951,
  "cim:ACLineSegment.x":          0.003769911221053,

Because JSON numbers don't have strict separation into integer, float and double, this results in some surprises.

 cim:EndDevice.timeZoneOffset 1; # integer

 cim:Conductor.length        50; # integer
 cim:ACLineSegment.bch        0; # integer
 cim:ACLineSegment.gch        0; # integer
 cim:ACLineSegment.r          1.5999999945951E-2; # double, scientific notation
 cim:ACLineSegment.x          3.769911221053E-3;  # double, scientific notation

But these numbers are comparable and orderable, so that is fine.

Round-tripping

_data is testing data to check whether the round-tripping CIMXML -> JSON-LD -> CIMXML_Output provides correct results. I diffed a few files and here are some problems:

  • JSONLD to XML swaps fields scenarioTime and description #358
  • Omitted metadata fields dcat:keyword, dct:conformsTo, md:Model.profile
  • Omitted data fields: eu:IdentifiedObject.shortName, eu:BoundaryPoint.isDirectCurrent, eu:BoundaryPoint.isExcludedFromAreaInterchange
    • And probably other eu, nc properties since _config is hard-coded for CIM17
  • Numbers like 50 are converted to 50.0 (but that's very minor)

XML vs JSON-LD Files

I want to make sure that

  • All XML files are also available as JSON-LD
  • All round-trip test files (DIGIN10-30) are also available in the official distribution (Telemark-120)
find . -iname Telemark-120-*.jsonld -printf "%f\n" | perl -pe 's{Telemark-120-(.*).jsonld}{$1}' |sort> files-Telemark-jsonld.txt
find . -iname Telemark-120-*.xml    -printf "%f\n" | perl -pe 's{Telemark-120-(.*).xml}{$1}'    |sort> files-Telemark-xml.txt
find . -iname DIGIN10-30-*.jsonld   -printf "%f\n" | perl -pe 's{DIGIN10-30-(.*).jsonld}{$1}'        > files-DIGIN-jsonld.txt
find . -iname DIGIN10-30-*.xml      -printf "%f\n" | perl -pe 's{DIGIN10-30-(.*).xml}{$1}'           > files-DIGIN-xml.txt

A comparison of the file lists shows that is indeed the case. The only differences are:

  • files-DIGIN-xml.txt has the files twice (in folders CIMXML vs CIMXML_Output)
  • Telemark-120_AO.jsonld is not included in the test files
  • The test files are older

RDF Files to Load

Given the checking we did in the previous section, the files to load are:

find . -iname Telemark-120*.jsonld
./Telemark-120/Asset/CIMJSON-LD/AviationObstacle/Telemark-120_AO.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-LV1_AS.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-LV1_CU.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-M1_AC.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-MV1_AS.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-MV1_CU.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-ReadingQualityType_RD.jsonld
./Telemark-120/Asset/CIMJSON-LD/Telemark-120-ReadingType_RD.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-BaseVoltage_RD.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-GeographicalRegion_RD.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-HV1-MV1_BM.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_DL.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_EQ.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_GL.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_OP.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_OR.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_SC.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-LV1_SSH.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MeasurementValueSource_RD.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1-LV1_BM.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1-LV1_SV.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1-LV1_TP.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_DL.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_EQ.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_GL.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_OP.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_SC.jsonld
./Telemark-120/Grid/CIMJSON-LD/Telemark-120-MV1_SSH.jsonld

We zip them up to Telemark-120-jsonld.zip as follows:

find . -iname Telemark-120*.jsonld -exec zip -j Telemark-120-jsonld.zip {} \;

We use the -j option to junk (don't record) directory names. This flattens the archive and makes it easier to peruse. Of course, this is a matter of preference.

One more file needs to be loaded after converting from GeoJson to GeoSPARQL (see next):

Telemark-120-WattApp-GL.ttl

Geospatial Data

Telemark-120 includes 3 kinds of Geospatial data:

CIM PositionPoint:

grep -c PositionPoint.xPosition */*/*.jsonld */*/*/*.jsonld | grep -v :0
Grid/CIMJSON-LD/Telemark-120-LV1_GL.jsonld:7
Grid/CIMJSON-LD/Telemark-120-MV1_GL.jsonld:13

GeoJSON:

grep -c '"geometry": {' */*/*.geojson | grep -v :0
Grid/CIMJSON-LD/Telemark-120-LV1_GL.geojson:7
Grid/CIMJSON-LD/Telemark-120-MV1_GL.geojson:13
Grid/CIMJSON-LD/Telemark-120-WattApp-GL.geojson:1
  • Ignore the first two files because they are present as CIM PositionPoint, see above
  • Convert Telemark-120-WattApp-GL.geojson to GeoSPARQL WKT as per next section

GeoSPARQL:

grep -c asWKT */*/*.jsonld */*/*/*.jsonld | grep -v :0
Asset/CIMJSON-LD/AviationObstacle/Telemark-120_AO.jsonld:3
  • Use the values from asGeoJSON to overwrite asWKT, adding altitude and using types POINT Z, LINESTRING Z, POLYGON Z (see comment in CIM4NoUtility#337)
    • It's best to do this by hand
    • For example:
geo:asWKT "LINESTRING Z (8.7007293714585 58.41467201058505 20, 8.7007293 58.414672 20)^^geo:wktLiteral
  • Drop asGML, asGeoJSON since GraphDB doesn't support them
  • Load this file to a named graph (same URN as the dcat:Dataset)

GeoJson Data

Telemark-120 includes some Geospatial data in GeoJSON:

  • We don't need these 2 files because they are also present in
  • Telemark-120-MV1_GL.geojson: point coordinates of 13 medium-voltage Substations (eg L ARENDAL, L ENGENE-NEDENES, L T_ENGENE-ENGENE)
  • Telemark-120-LV1_GL.geojson: point coordinates of 7 low-voltage Substations (eg "TELEMA2 04 CB4")
  • Telemark-120-WattApp-GL.geojson: 1 Geospatial GridCapacity MAS1: geometry and CapacitySchedule of the "Sandefjord business and industry area", which is described as a cim:Feeder "A collection of equipment for organizational purposes, used for grouping distribution resources. The organization a feeder does not necessarily reflect connectivity or current operation state"

In addition to GeoJSON, this is also valid JSON-LD, but it has a variety of problems:

Telemark-120-WattApp-GL.ttl has this:

<urn:uuid:971c4254-5365-4aaf-8fa6-02658b3f8e05> a dcat:Dataset, geojson:FeatureCollection ;
  dcterms:description "Geospartial GridCapacity MAS1"@en ;
  geojson:features <urn:uuid:58aee5a8-0cd9-467e-b5e7-180ac161d9b8> ;

<urn:uuid:58aee5a8-0cd9-467e-b5e7-180ac161d9b8> a geojson:Feature ;
  geojson:geometry [
    a geojson:Polygon ;
    geojson:coordinates ( ( ( 1.0229E1 5.9247E1 ) ( 1.0184E1 5.92E1 ) ( 1.0143E1 5.9139E1 )
      ( 1.0202E1 5.9138E1 ) ( 1.0276E1 5.9161E1 ) ( 1.0311E1 5.9229E1 ) ( 1.0229E1 5.9247E1 ) ) ) ;
  ] ;
  geojson:properties <urn:uuid:4e51e598-8948-4c85-b151-f44ffddc5545> .

<urn:uuid:4e51e598-8948-4c85-b151-f44ffddc5545> a cim:Feeder ;
  cim:IdentifiedObject.description "Sandefjord business and industry area"@en .

It's not our job to fix all problems, but we need to fix 2 things:

  • Load the file to a named graph (same URN as the dcat:Dataset)
  • Convert to GeoSPARQL WKT the same model as in Nordic44#41 Convert Geographical Location to GeoSPAQL. It may be easier to do this by hand, given that the GeoJson coordinates have been rounded off and mangled to scientific notation:
<urn:uuid:971c4254-5365-4aaf-8fa6-02658b3f8e05> {
  <urn:uuid:971c4254-5365-4aaf-8fa6-02658b3f8e05> a dcat:Dataset;
    dcterms:description "Geospartial GridCapacity MAS1"@en.

  <urn:uuid:4e51e598-8948-4c85-b151-f44ffddc5545> a cim:Feeder, geo:Feature ;
    cim:IdentifiedObject.description "Sandefjord business and industry area"@en;
    geo:hasGeometry <urn:uuid:58aee5a8-0cd9-467e-b5e7-180ac161d9b8> .

  <urn:uuid:58aee5a8-0cd9-467e-b5e7-180ac161d9b8> a geo:Geometry ;
    geo:asWKT "POLYGON (10.229020984659712 59.24698254345179, 10.18420614097019 59.19982925336586, 10.142883363023742 59.13888033657065, 10.202442484289662 59.13758660552921, 10.276357875828012 59.16126409167293, 10.310502518638259 59.22922084872761, 10.229020984659712 59.24698254345179)"^^geo:wktLiteral.
}

Time-series Data

Telemark-120 includes some useful data that unfortunately is not in RDF. Schedule/2022/03/30 are mere JSON, not JSONLD.

Data Statistics

Prefixes

The following prefixes are used in JSON-LD (except nc-no), but we put them in a separate file prefixes.ttl so they are also ingested as repository namespaces.

PREFIX cim:     <https://cim.ucaiug.io/ns#>
PREFIX eu:      <https://cim.ucaiug.io/ns/eu#>
PREFIX nc-no:   <https://cim4.eu/ns/nc-no#>
PREFIX dcat:    <http://www.w3.org/ns/dcat#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX geo:     <http://www.opengis.net/ont/geosparql#>
PREFIX prov:    <http://www.w3.org/ns/prov#>

Note: posted enhancement request GDB-12329 ingest JSON-LD prefixes as repo namespaces.

Classes

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
select ?x (count(*) as ?c) {
    [] a ?x
    filter(!strstarts(str(?x),str(rdf:)))
    filter(!strstarts(str(?x),str(rdfs:)))
    filter(!strstarts(str(?x),str(owl:)))
} group by ?x order by ?x

87 classes:

  • Models: 26 dcat:Dataset with 21 dcterms:PeriodOfTime (temporal coverage)
  • GeoSPARQL: 4 geo:Feature with 3 geo:Geometry about AviationObstacles.

Correlation to Nordic44 and CIM/NC

Classes Unique to Telemark-120

32 classes in Telemark-120 are not in Nordic44 (run the query in telemark-120):

select ?x (count(*) as ?c) {
    [] a ?x
   filter not exists {service <repository:nordic44> {[] a ?x}}
} group by ?x order by ?x
x c Notes
http://www.opengis.net/ont/geosparql#Feature 4 Nordic44 doesn't have such but we'll convert PositionPoint to GeoSPARQL
http://www.opengis.net/ont/geosparql#Geometry 3 --"--
https://cim.ucaiug.io/ns#AssetModelCatalogueItem 1 Price ("Pricing for RTU skap for småkraftverk") for ProductAssetModel "RS5970P" with unitCost
https://cim.ucaiug.io/ns#BasePower 1 basePower "1000"^^xsd:integer. Guess parallels BaseVoltage but is disconnected
https://cim.ucaiug.io/ns#CommunicationLink 2 Eg "Disruptive Technolgies 4G" that connects to a RemoteUnit
https://cim.ucaiug.io/ns#CurrentTransformer 4 Parallels PowerTransformer
https://cim.ucaiug.io/ns#DiagramObjectStyle 13 Kind of DiagramObject (eg "ACLineSegment", "NeighborSubstation") or TextDiagramObject (eg "BusBarNameDisplay")
https://cim.ucaiug.io/ns#Discrete 1 Measurement of "Arendal 132kV Trafo 1 Breaker Switch Position" with values 0..3
https://cim.ucaiug.io/ns#DiscreteValue 4 Discrete Measurement readings with MeasurementValue.timeStamp
https://cim.ucaiug.io/ns#EquivalentInjection 3 Generation or Load
https://cim.ucaiug.io/ns#Fuse 30 Eg 400 Volt Fuse in a Low Voltage Cable Bay
https://cim.ucaiug.io/ns#LoadBreakSwitch 2 Load break switch (for Nedenes 22kV Transformer in Transformer Bay 1)
https://cim.ucaiug.io/ns#Meter 2 SmartMeters (eg "Nedenes 400 Volt Meter 2") with aspects Asset and EndDevice
https://cim.ucaiug.io/ns#Name 10 Extra name or identifier for a PSR
https://cim.ucaiug.io/ns#NameType 2 Extra identifier/name types: "companyNis", "source" and "heightReference"="base"
https://cim.ucaiug.io/ns#NameTypeAuthority 2 Used with NameType: some Network Information System; Norwegian Mapping Authority
https://cim.ucaiug.io/ns#PetersenCoil 2 PetersenCoil in 132kV Voltage Level
https://cim.ucaiug.io/ns#PotentialTransformer 4 Parallels PowerTransformer
https://cim.ucaiug.io/ns#ReadingQualityType 27 Attributes like systemId "Metering system (data collection) network", subCategory "KnownMissingRead", category "Failed reasonability testing". Maps to eg http://energy.referencedata.eu/ReadingQualityType/2.5.259 (which doesn't resolve)
https://cim.ucaiug.io/ns#ReadingType 183 Eg "fifteenMinute bulkQuantity forward electricitySecondaryMetered energy (kWh)" skos:exactMatch http://data.europa.eu/energy/ReadingType/0.0.2.1.1.1.12.0.0.0.0.0.0.0.0.3.72.0, not used
https://cim.ucaiug.io/ns#RemoteSource 1 Remote source (akin to sensor: scanInterval, sensorMinimum, sensorMaximum)
https://cim.ucaiug.io/ns#RemoteUnit 1 Remote units (akin to sensors) connected by CommunicationLinks
https://cim.ucaiug.io/ns#StationSupply 1 Power supply for a substation, with cim:EnergyConsumer attributes
https://cim.ucaiug.io/ns#UsagePoint 14 End-user usage point with a lot of details. Connects to equipment such as ConformLoad (in a VoltageLevel in a small Substation, and belongs to a ConformLoadGroup), StationSupply, PotentialTransformer, CurrentTransformer
https://cim.ucaiug.io/ns/eu#BoundaryPoint 2 Boundary point from TSO to DSO (Arendal, Nedenes)
https://cim4.eu/ns/nc-no#ACLineSegmentSpan 1 AviationObstacle classes
https://cim4.eu/ns/nc-no#ACLineSegmentSpanDeployment 1 --"--
https://cim4.eu/ns/nc-no#Guy 1 --"--
https://cim4.eu/ns/nc-no#OverheadStructure 1 --"--
https://cim4.eu/ns/nc-no#StructureDeployment 1 --"--
https://cim4.eu/ns/nc-no#StructureSupportDeployment 1 --"--
https://cim4.eu/ns/nc-no#Zone 1 Has GeoSPARQL geometry and zoneKind eg nc-no:ZoneKind.substation

Note: This is the basis of competency questions in [Demo4 Telemark-120].

Other Classes

Conversely, 204 classes are in Nordic44 (with reasoning) but not in Telemark-120 (without reasoning):

select ?x (count(*) as ?c) {
    service <repository:nordic44> {[] a ?x}
    filter not exists {[] a ?x}
} group by ?x order by ?x

About 95 are cim and 105 are nc. This includes:

  • Ontology annotations like cims:ClassCategory
  • Different styles of representing Models like rdfg:Graph, md:Model, dcat:Distribution
  • Enumerations like cim:AsynchronousMachineKind, cim:IfdBaseKind
  • Superclasses like cim:IdentifiedObject, cim:ConductingEquipment
  • Electrical classes like Analog (analog measurements; whereas Telemark-120 has Discrete measurements)

55 classes are shared between the two datasets:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
select ?x (count(*) as ?c) {
    [] a ?x
    filter exists {service <repository:nordic44> {[] a ?x}}
    filter(!strstarts(str(?x),str(rdf:)))
    filter(!strstarts(str(?x),str(rdfs:)))
    filter(!strstarts(str(?x),str(owl:)))
} group by ?x order by ?x

Shared Resources

Only 17 resources are shared between Nordic44 and Telemark120: run this query on telemark-120

PREFIX sesame: <http://www.openrdf.org/schema/sesame#>
PREFIX onto: <http://www.ontotext.com/>
PREFIX cim: <https://cim.ucaiug.io/ns#>
select ?same ?mrid ?name_t ?name_n ?type_t ?type_n 
where {
  ?x_t cim:IdentifiedObject.mRID ?mrid ;
    cim:IdentifiedObject.name ?name_t ;
    sesame:directType ?type_t .
  service <repository:nordic44> {
    ?x_n cim:IdentifiedObject.mRID ?mrid ;
      cim:IdentifiedObject.name ?name_n ;
      sesame:directType ?type_n .
  }
  bind(?x_t=?x_n && ?name_t=?name_n && ?type_t=?type_n as ?same)
} order by ?same
same mrid name_t name_n type_t type_n
false 2dd90159-bdfb-11e5-94fa-c8f73332c8f4 AC-420kV 420kV cim:BaseVoltage cim:BaseVoltage
false 2dd90169-bdfb-11e5-94fa-c8f73332c8f4 AC-300kV 300kV cim:BaseVoltage cim:BaseVoltage
false 2dd90174-bdfb-11e5-94fa-c8f73332c8f4 AC-132kV 135kV cim:BaseVoltage cim:BaseVoltage
false cb837454-5c66-d341-be63-d0c044e5fd3c XARE1_XARE2 CN ARENDAL CN 015 cim:ConnectivityNode cim:ConnectivityNode
true f1769670-9aeb-11e5-91da-b8763fd99c5f ARENDAL ARENDAL cim:Substation cim:Substation
true 1f4fabd4-8c57-c245-b107-4e64c9007ae3 ARENDAL 420 ARENDAL 420 cim:VoltageLevel cim:VoltageLevel
true f1769619-9aeb-11e5-91da-b8763fd99c5f NO5 SGR NO5 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17696b3-9aeb-11e5-91da-b8763fd99c5f FI1 SGR FI1 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true 2dd9048c-bdfb-11e5-94fa-c8f73332c8f4 NO NO cim:GeographicalRegion cim:GeographicalRegion
true f1769699-9aeb-11e5-91da-b8763fd99c5f NO3 SGR NO3 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f1769609-9aeb-11e5-91da-b8763fd99c5f NO1 SGR NO1 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17695af-9aeb-11e5-91da-b8763fd99c5f SE3 SGR SE3 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17695c3-9aeb-11e5-91da-b8763fd99c5f SE2 SGR SE2 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f176965f-9aeb-11e5-91da-b8763fd99c5f NO2 SGR NO2 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17696cf-9aeb-11e5-91da-b8763fd99c5f SE4 SGR SE4 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17695cd-9aeb-11e5-91da-b8763fd99c5f SE1 SGR SE1 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion
true f17696a3-9aeb-11e5-91da-b8763fd99c5f NO4 SGR NO4 SGR cim:SubGeographicalRegion cim:SubGeographicalRegion

Resources That Should be Merged

Conversely to the previous section, this query looks for objects with the same name but different mRID in the two datasets, which possibly should be merged to the same URN.

PREFIX sesame: <http://www.openrdf.org/schema/sesame#>
PREFIX cim: <https://cim.ucaiug.io/ns#>
select ?name ?mrid_t ?type_t ?mrid_n ?type_n {
  ?x_t cim:IdentifiedObject.mRID ?mrid_t ;
    cim:IdentifiedObject.name ?name ;
    sesame:directType ?type_t.
  service <repository:nordic44> {
          ?x_n cim:IdentifiedObject.mRID ?mrid_n ;
            cim:IdentifiedObject.name ?name ;
            sesame:directType ?type_n .
  }
  filter(?mrid_n != ?mrid_t)
} order by ?name

Notes:

  • run in repo telemark120
  • the <repository:nordic44> federated call is run against Nordic44 data
  • ?mrid_t ?type_t are Telemark120, ?mrid_n ?type_n are Nordic44
?name ?mrid_t ?type_t ?mrid_n ?type_n
ARENDAL f1769670-9aeb-11e5-91da-b8763fd99c5f cim:Substation 47eb7c24-d0f6-11e7-9f7b-b46d83638f70 cim:TopologicalNode
ARENDAL f1769670-9aeb-11e5-91da-b8763fd99c5f cim:Substation 47eb7c29-d0f6-11e7-9f7b-b46d83638f70 cim:TopologicalNode
ARENDAL f1769670-9aeb-11e5-91da-b8763fd99c5f cim:Substation 47eb7c28-d0f6-11e7-9f7b-b46d83638f70 cim:TopologicalNode
ARENDAL f1769670-9aeb-11e5-91da-b8763fd99c5f cim:Substation 47eb7c27-d0f6-11e7-9f7b-b46d83638f70 cim:TopologicalNode
ARENDAL f1769670-9aeb-11e5-91da-b8763fd99c5f cim:Substation 47eb7c26-d0f6-11e7-9f7b-b46d83638f70 cim:TopologicalNode
ARENDAL CN 007 681a1e80-5a55-11eb-a658-74e5f963e191 cim:ConnectivityNode 6b8e0ffe-1129-e541-9ba1-65e69ebff7a4 cim:ConnectivityNode
ARENDAL CN 008 1aea01d1-2f09-1a4d-a2b1-872e3f11457f cim:ConnectivityNode 20c2eb92-4ef1-204b-9054-c1baaba29845 cim:ConnectivityNode
ARENDAL CN 009 d33115d5-f70a-7543-818c-f15f9b7d4501 cim:ConnectivityNode 2751922a-47e7-714b-a611-b90281f72c7e cim:ConnectivityNode
ARENDAL CN 010 517ac677-7ac0-dd4d-ac94-a191b7c05b13 cim:ConnectivityNode 4fdd3c67-0b4a-5145-b123-8404da4b4c37 cim:ConnectivityNode
ARENDAL CN 011 8f69bfc5-3f5a-7f49-aeab-7df584878465 cim:ConnectivityNode 634c0b31-4fe8-2545-b189-6afde342600e cim:ConnectivityNode
ARENDAL CN 012 734aa236-9549-11ec-b226-48ba4eadba68 cim:TopologicalNode b20d8f4b-ad02-ff4e-bd3f-f34a841f2432 cim:ConnectivityNode
ARENDAL CN 012 730d0140-2cfb-1046-a131-fe4022d80e95 cim:ConnectivityNode b20d8f4b-ad02-ff4e-bd3f-f34a841f2432 cim:ConnectivityNode
ARENDAL T1 681a2fdd-5a55-11eb-a658-74e5f963e191 cim:PowerTransformer f1769e1e-9aeb-11e5-91da-b8763fd99c5f cim:PowerTransformer
Allocated 27b2f26a-1444-4d4f-99ae-93d31bb935cf cim:MeasurementValueSource 6a4237ae-327d-5a4c-9c10-167725983c17 cim:MeasurementValueSource
CONST_P_Q LRC 6963e27e-9aaa-df42-a71c-1268f02e472f cim:LoadResponseCharacteristic f1769759-9aeb-11e5-91da-b8763fd99c5f cim:LoadResponseCharacteristic
Calculated 6c0bb43a-91b3-4543-8fed-f423ed9124f8 cim:MeasurementValueSource d9c67735-2e2b-7746-9d00-145c4905db86 cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource 8432a0f5-0640-e34f-b811-331e8bb3712f cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource 3b167a19-ddea-ec45-98be-8a1c2c021457 cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource 817254d6-0199-244f-9bc9-0fd730e1d337 cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource f2f7ec5a-de86-5742-9e75-4a7143b837c8 cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource 5693dfbd-c51e-e343-b1d7-e2d3faa3db5d cim:MeasurementValueSource
Forecasted 4f620500-e428-4a6c-b3f9-96089de113ee cim:MeasurementValueSource daf31d05-411f-984e-96d7-560183e1ec67 cim:MeasurementValueSource
Operator e5048824-2bc1-4b72-810b-750981000b6f cim:MeasurementValueSource 343ca58a-714a-41e5-8920-5cad9a1b4a94 cim:MeasurementValueSource
PATL a7d9b42e-0f87-4882-903d-1cf454f85df4 cim:OperationalLimitType f1769a3e-9aeb-11e5-91da-b8763fd99c5f cim:OperationalLimitType
PATL 681a2679-5a55-11eb-a658-74e5f963e191 cim:OperationalLimitType f1769a3e-9aeb-11e5-91da-b8763fd99c5f cim:OperationalLimitType
PowerFlow 793bb713-6c01-46ae-b2d0-2977a4981e70 cim:MeasurementValueSource 4c0436b7-532d-a34e-b2ee-a46a5e151536 cim:MeasurementValueSource
SCADA b1a076df-b20d-490d-81a5-6e55efbf403c cim:MeasurementValueSource 5d0f3607-8bac-4f08-94e2-c230387560df cim:MeasurementValueSource
TATL 681a267a-5a55-11eb-a658-74e5f963e191 cim:OperationalLimitType f1769a3f-9aeb-11e5-91da-b8763fd99c5f cim:OperationalLimitType
TATL 681a267a-5a55-11eb-a658-74e5f963e191 cim:OperationalLimitType f1769a40-9aeb-11e5-91da-b8763fd99c5f cim:OperationalLimitType

The issue Nordic44#62 proposes a disposition of the above results, eg:

  • MeasurementValueSource and OperationalLimitType could remain different
  • "ARENDAL T1" must be merged

Ontology Terms

This query finds all ontology terms (properties, classes and enumeration values) that are used by Telemark-120: there are 539.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dcat: <http://www.w3.org/ns/dcat#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX cim: <https://cim.ucaiug.io/ns#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

select distinct ?x {
  {         # properties
    [] ?x []
    filter(!strstarts(str(?x),str(rdf:)))
  } UNION { # classes
    [] a ?x
  } UNION { # enumeration values
    [] ?prop ?x
    filter(isIri(?x) && regex(str(?x),"cim|entsoe") &&
      ?prop not in (dcterms:conformsTo, dcterms:spatial, dcterms:accessRights, dcat:isVersionOf, skos:exactMatch))
  }
} order by ?x

This query finds ontology terms used in Telemark-120 but not defined in CIM/NC ontologies. There are 217.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dcat: <http://www.w3.org/ns/dcat#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX cim: <https://cim.ucaiug.io/ns#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

select * {
  {select distinct ?x {
    {         # properties
      [] ?x []
      filter(!strstarts(str(?x),str(rdf:)))
    } UNION { # classes
      [] a ?x
    } UNION { # enumeration values
      [] ?prop ?x
      filter(isIri(?x) && regex(str(?x),"cim|entsoe") &&
        ?prop not in (dcterms:conformsTo, dcterms:spatial, dcterms:accessRights, dcat:isVersionOf, skos:exactMatch))
    }
  } order by ?x}
  filter not exists {
    service <repository:nordic44> {
      ?x a []
    }
  }
}

Missing CIM/NC Ontology Terms

The complete list of undefined terms is Telemark-120-missing-ontology-terms.txt. This and following subsections include an analysis of these omissions.

Classes and Props. In some cases we also include links to online CIM documentation:

Enum values and Enumeration Classes (shown as "+1" below).

  • 3+1 cim:AccumulationKind (all are at IEC61968/Metering/AccumulationKind)
  • 1+1 cim:AggregateKind
  • 2+1 cim:AmiBillingReady
  • 1+1 cim:CommodityKind
  • 1+1 cim:ConnectionState
  • 1 cim:InUseStateKind.inUse. This is also used in Nordic44 but not defined?
  • 1 cim:MacroPeriodKind.sixtyMinute (not found on IEC61968/Metering/MacroPeriodKind?)
  • 3 cim:MeasurementKind (only last one found on IEC61968/Metering/MeasurementKind)
  • 1 cim:PotentialTransformerKind.capacitiveCoupling
  • 1 cim:RemoteUnitType.IED
  • 1 cim:TransformerControlMode.volt

Missing External Terms

External terms:

  • 1 dcterms:PeriodOfTime: need to copy definition from DCT
  • 6 GeoSPARQL: need to copy definitions from GeoSPARQL.
geo:Feature
geo:Geometry
geo:asGML
geo:asGeoJSON
geo:asWKT
geo:hasGeometry
  • Furthermore, need to define GeoSPARQL magic predicates and/or functions, and describe which to use in cims:pragmatics
geo:sfWithin vs geof:sfWithin
# etc

Missing NC-NO Ontology

Missing Asset-Related Ontology Terms

A number of terms are related to Assets.

The full list of asset terms used in Telemark-120 is as follows:

  • Asset
  • Asset.PowerSystemResources
  • Asset.baselineCondition
  • Asset.baselineLossOfLife
  • Asset.lifecycleState
  • Asset.lotNumber
  • Asset.position
  • Asset.purchasePrice
  • Asset.type
  • Asset.utcNumber
  • AssetDeployment.BaseVoltage
  • AssetDeployment.deploymentState
  • AssetKind.other
  • AssetKind.transformer
  • AssetLifeCycleStateKind.received
  • AssetModelCatalogueItem <<< This is unique to Telemark-120
  • AssetModelCatalogueItem.unitCost
  • CableInfo
  • CableInfo.constructionKind
  • CableInfo.outerJacketKind
  • CableOuterJacketKind.pvc
  • CableShieldMaterialKind.aluminum
  • CableConstructionKind.stranded
  • Manufacturer
  • Manufacturer.ProductAssetModel
  • PowerSystemResource.AssetDatasheet
  • PowerTransformerInfo
  • ProductAssetModel
  • ProductAssetModel.AssetModelCatalogueItem
  • ProductAssetModel.drawingNumber
  • ProductAssetModel.instructionMnaual
  • ProductAssetModel.modelVersion
  • ProductAssetModel.weightTotal
  • WireInfo.radius
  • WireInfo.ratedCurrent
  • WireInsulationKind.other
  • WireMaterialKind.aluminum

I wrote a script in CIM4Enterprise/pull/6/commit to count term definitions of Telemark-120 across CIM4Enterprise ontologies. TODO: move to some better location.

Here is the count by descending number of definitions:

term Asset.ttl AssetCatalogue.ttl ElectricalProperties.ttl Functional.ttl Statnett_CDPSM_ED2.ttl TOTAL
CableOuterJacketKind.pvc 1 1 1 1 1 5
CableShieldMaterialKind.aluminum 1 1 1 1 1 5
CableConstructionKind.stranded 1 1 1 1 1 5
WireInsulationKind.other 1 1 1 1 1 5
WireMaterialKind.aluminum 1 1 1 1 1 5
Asset 1 1 2
Asset.PowerSystemResources 1 1 2
Asset.lotNumber 1 1 2
Asset.type 1 1 2
CableInfo 1 1 2
CableInfo.constructionKind 1 1 2
Manufacturer 1 1 2
PowerSystemResource.AssetDatasheet 1 1 2
PowerTransformerInfo 1 1 2
ProductAssetModel 1 1 2
ProductAssetModel.modelVersion 1 1 2
WireInfo.radius 1 1 2
WireInfo.ratedCurrent 1 1 2
Manufacturer.ProductAssetModel 1 1
Asset.baselineCondition
Asset.baselineLossOfLife
Asset.lifecycleState
Asset.position
Asset.purchasePrice
Asset.utcNumber
AssetDeployment.BaseVoltage
AssetDeployment.deploymentState
AssetKind.other
AssetKind.transformer
AssetLifeCycleStateKind.received
AssetModelCatalogueItem
AssetModelCatalogueItem.unitCost
CableInfo.outerJacketKind
ProductAssetModel.AssetModelCatalogueItem
ProductAssetModel.drawingNumber
ProductAssetModel.instructionMnaual
ProductAssetModel.weightTotal
TOTAL 9 14 5 6 18

As you can see, about half the terms are not yet defined:

  • Asset.baselineCondition
  • Asset.baselineLossOfLife
  • Asset.lifecycleState
  • Asset.position
  • Asset.purchasePrice
  • Asset.utcNumber
  • AssetDeployment.BaseVoltage
  • AssetDeployment.deploymentState
  • AssetKind.other
  • AssetKind.transformer
  • AssetLifeCycleStateKind.received
  • AssetModelCatalogueItem
  • AssetModelCatalogueItem.unitCost
  • CableInfo.outerJacketKind
  • ProductAssetModel.AssetModelCatalogueItem
  • ProductAssetModel.drawingNumber
  • ProductAssetModel.instructionMnaual
  • ProductAssetModel.weightTotal

There is also one misspelling: ProductAssetModel.instructionMnaual

Telemark-120 Errors

This section describes general data problems with Telemark-120

Missing/Wrong Prefixes

Issue #369: Prefixes for these namespaces are not specified in Telemark-120:

Issue #371: in fact the latter is wrong and should be replaced with the former. There are 6 terms that use this namespace, shown with counts:

PREFIX eunc: <http://entsoe.eu/ns/nc#>
select ?x (count(*) as ?c) where {
    {[] a ?x} union {[] ?x []}
    filter(strstarts(str(?x),str(eunc:)))
} group by ?x
x c
http://entsoe.eu/ns/nc#Name.NameType 6
http://entsoe.eu/ns/nc#Name.mRID 6
http://entsoe.eu/ns/nc#NameTypeAuthority.mRID 1
http://entsoe.eu/ns/nc#NameType.NameTypeAuthority 1
http://entsoe.eu/ns/nc#NameType.mRID 1

There are also 4 terms with wrong namespace http://cim4.eu/ns/nc# (should be https).

Conflicting NameTypes

Issue #370.

urn:uuid:3868b80f-7e64-4fc0-a851-ce6835676a6e (cim:NameTypeAuthority) has conflicting data:

  • In model urn:uuid:2e4ac4ff-692d-48e5-9837-cc0db61ee3dd it has cim:NameTypeAuthority.name "companyNis"
  • In model urn:uuid:f1d9a88d-0ff5-4e4b-9d6a-c353fe8232c3 it has cim:NameTypeAuthority.name "source"

urn:uuid:d56ca01d-7801-4e1b-ac69-c2059143475f (cim:NameType) has conflicting data:

  • In model urn:uuid:2e4ac4ff-692d-48e5-9837-cc0db61ee3dd it has cim:NameType.name "companyNisId"
  • In model urn:uuid:f1d9a88d-0ff5-4e4b-9d6a-c353fe8232c3 it has cim:NameType.name "sourceId"

This problem together with Issue #371 is illustrated by this query:

PREFIX cim: <https://cim.ucaiug.io/ns#>
PREFIX nc:   <http://cim4.eu/ns/nc#>
PREFIX eunc: <http://entsoe.eu/ns/nc#>

select *  {
    ?x a cim:Name
    optional {?x   nc:Name.NameType/cim:NameType.name ?type1}
    optional {?x eunc:Name.NameType/cim:NameType.name ?type2}
    optional {?x cim:Name.name ?name}
}
x type1 type2 name
urn:uuid:1fb68b4a-5705-435d-9f28-1a70154181bb sourceId 6573456
urn:uuid:1fb68b4a-5705-435d-9f28-1a70154181bb companyNisId 6573456
urn:uuid:25d820b5-f930-42c7-809a-0c1706dd62fe sourceId 454613
urn:uuid:25d820b5-f930-42c7-809a-0c1706dd62fe companyNisId 454613
urn:uuid:57ae9503-f0f0-4498-bf9f-a7d4e77b4b74 sourceId 65745245
urn:uuid:57ae9503-f0f0-4498-bf9f-a7d4e77b4b74 companyNisId 65745245
urn:uuid:fd353b3b-bb97-498d-bdcc-2c8ce9b01378 heightReference base
urn:uuid:12ba87f6-d635-41a8-add4-c917db73953d sourceId 6573456
urn:uuid:12ba87f6-d635-41a8-add4-c917db73953d companyNisId 6573456
urn:uuid:a5cd373a-70b5-4c49-baa1-5bd21a2816b2 sourceId 6534512
urn:uuid:a5cd373a-70b5-4c49-baa1-5bd21a2816b2 companyNisId 6534512
urn:uuid:ba68a6ec-a706-465b-8c36-7a875de5d3c9 sourceId 8345723
urn:uuid:ba68a6ec-a706-465b-8c36-7a875de5d3c9 companyNisId 8345723
urn:uuid:c229b6a8-03ef-499b-9b3d-f661a92b8d6a sourceId 653497324
urn:uuid:c229b6a8-03ef-499b-9b3d-f661a92b8d6a companyNisId 653497324
urn:uuid:cd0ec51f-f672-48e0-b1fd-5a0c65be4aee sourceId 65767234
urn:uuid:cd0ec51f-f672-48e0-b1fd-5a0c65be4aee companyNisId 65767234
urn:uuid:e08e14be-3cb2-4f79-a54a-62b54085aa06 sourceId 27785734
urn:uuid:e08e14be-3cb2-4f79-a54a-62b54085aa06 companyNisId 27785734
  • The same name appears as both companyNisId and sourceId
  • ?type1 (the correct namespace) should be populated in all rows, ?type2 (the wrong namespace) should not be populated

Questionable Modeling of OverheadStructure

Issue #372.

urn:uuid:1f521353-04da-47f7-bcc9-17e1aefb7beb is nc-no:OverheadStructure with nc-no:OverheadStructure.height 20.04 and nc-no:OverheadStructure.maxHeight 21.04.

  • It also has "heightReference"="base".
    • This is expressed as a cim:Name with cim:Name.name "base" and nc:Name.NameType/cim:NameType.name "heightReference".
    • However, "base" is not a name or identifier of that OverheadStructure! It is a qualifier for its two attributes height and maxHeight
    • So this is an improper use of cim:Name
    • As per AviationObstacleReporting.adoc, this comes from original field referanse.komponentkodeverdi
    • But you should use a dedicated field such as OverheadStructure.heightReference, with an appropriate enum
  • Nothing says that the unit of measurement is Meters.

Obstacles to Aviation is not well modeled

CIM4NoUtility#383 Obstacles to Aviation is not well modeled (need superclass AviationObstacle).

For this question:

List all obstacles to aviation, with name, description, lighting and marking kind, dimensions (length, width, height etc), WKT coordinates, location method

I had to write this query:

PREFIX cim:     <https://cim.ucaiug.io/ns#>
PREFIX nc-no:   <https://cim4.eu/ns/nc-no#>
PREFIX geo:     <http://www.opengis.net/ont/geosparql#>

select ?name ?descr ?lighting ?marking ?length ?spanLength ?maxWidth ?height ?maxHeight ?coords ?wkt ?locationMethod {
  ?x cim:IdentifiedObject.name ?name;
    nc-no:Guy.aviationObstacleLightingKind|nc-no:ACLineSegmentSpan.aviationObstacleLightingKind|nc-no:OverheadStructure.aviationObstacleLightingKind ?lighting;
    nc-no:Guy.aviationObstacleMarkingKind|nc-no:ACLineSegmentSpan.aviationObstacleMarkingKind|nc-no:OverheadStructure.aviationObstacleMarkingKind ?marking;
    geo:hasGeometry/geo:asWKT ?wkt.
  optional {?x cim:IdentifiedObject.description ?descr}
  optional {?x nc-no:Guy.length ?length}
  optional {?x nc-no:OverheadStructure.height ?height}
  optional {?x nc-no:Guy.maxHeight|nc-no:ACLineSegmentSpan.maxHeight|nc-no:OverheadStructure.maxHeight ?maxHeight}
  optional {?x nc-no:Guy.maxWidth|nc-no:ACLineSegmentSpan.maxWidth ?maxWidth}
  optional {?x nc-no:ACLineSegmentSpan.spanWireLength ?spanLength}
  optional {?x nc-no:PowerSystemResource.locationMethod|nc-no:LocationResource.locationMethod ?locationMethod}
}

Problems:

  • there's no superclass AviationObstacle so the query resorts to finding them by the presence of props aviationObstacleLightingKind, aviationObstacleMarkingKind
  • the descriptive props have the same meaning, but different per-class URLs: see all the alternate prop paths | above. Another way of saying this is: many things can have a maxHeight. You want to use the same prop, rather than a gazillion props per class

This proposed superclass may need to be a secondary parent of the respective classes. RDF supports multiple inheritance, though I haven't seen it used in CIM.

Ontology-related Errors

Wrong terms in Telemark-120 data:

  • ActivePower.value, ReactivePower.value: CIM4NoUtility#364 parasitic blank nodes with attributes like cim:ReactivePower.value, cim:ActivePower.value
  • Wrong use of cim:FlowDirectionKind.forward as enum value? CIM4NoUtility#375
  • wrong enum value PhaseCode.phaseA, should be cim:PhaseCode.A: CIM4NoUtility#377
  • prop cim:RemotePoint.RemoteUnit should be cim:RemoteSource.RemoteUnit: CIM4NoUtility#378
  • wrong units UnitSymbol.Deg, UnitSymbol.VAR. The correct spelling is cim:UnitSymbol.deg, cim:UnitSymbol.VAr: CIM4NoUtility#379
  • Feeder's CapacitySchedule uses wrong props, lacks URI and type: CIM4NoUtility#380