Skip to content

SHACL: explore and try to eliminate SPARQL EXISTS #119

Description

@VladimirAlexiev

CIM SHACL SPARQL uses EXISTS a lot:

grep -i exists * | wc -l
171

Thsi happens in 76 files:

grep -ci exists *|grep -v :0 | wc -l
76
Here's the full list: ``` grep -ci exists *|grep -v :0 | sort -rn -t: -k2 BoundaryPoint-bppl3.rq:19 PowerShiftKeySchedule-associations.rq:10 PowerBidScheduleTimePoint-attributes.rq:7 PowerFlowResult-topologicalNode.rq:5 AssessedElement-associations.rq:5 AreaDispatchableUnit-associations.rq:5 PowerFlowResult-voltageAndAngle.rq:4 PowerBidDependency.kind-exclusive.rq:4 EnergyComponent-associations.rq:4 reverseDifferencePreviousVersion-dependency.rq:3 Terminal-EXCH8TopologicalNode.rq:3 SynchronousMachine-aggregate.rq:3 RemedialActionScheduleDependency-associations.rq:3 PowerFlowResult.value.rq:3 GeneratingUnit-typeDependency.rq:3 forwardReverse-dependency.rq:2 alternativeVersionAndPreferredVersion-dependency.rq:2 Terminal.phases-consistencyConnectivityNode.rq:2 SynchronousMachine-reactiveLimits.rq:2 Switch-connection.rq:2 StaticVarCompensator-controlMode.rq:2 RemedialActionScheduleResponse.rejectionReasonKind-required.rq:2 RemedialActionScheduleResponse.rejectionReason-applicability.rq:2 RemedialActionScheduleGroup-dependency.rq:2 RemedialActionScheduleDependency.kind-applicability.rq:2 RemedialActionSchedule-proposingEntity.rq:2 RemedialActionOutcomeValue-associations.rq:2 RemedialActionImpact-associations.rq:2 PowerTransformerEnd.ratedS-valueRange2winding.rq:2 PowerShiftKeySchedule.ParticipationFactorTimePoint-dependency.rq:2 PowerShiftKeyDistribution-associations.rq:2 PowerSchedule-dcassociations.rq:2 PowerBidSchedule-associations.rq:2 PowerBidDependency.startToStartLagKind-required.rq:2 PowerBidDependency.overlapKind-required.rq:2 PowerBidDependency.finishToStartLagKind-required.rq:2 PowerBidDependency.finishToFinishLagKind-required.rq:2 InfeedLimit-requiredAttributes.rq:2 GridStateAlteration-associations.rq:2 GeneratingUnit.nominalP-valueRangePair.rq:2 CurveData.xvalue-value.rq:2 Circuit-associations.rq:2 AvailabilityEnabled-associations.rq:2 AsynchronousMachine-aggregate.rq:2 TapChanger.ltcFlag-tapChangerControl.rq:1 SynchronousMachine.type-condenser.rq:1 RotatingMachine.q-limits.rq:1 RotatingMachine.p-limits.rq:1 RemedialActionScheduleDependency.kind-cardinality.rq:1 RemedialActionApplied.StageForRemedialActionScheme-cardinality.rq:1 RegulatingControl-terminalConnectivityNode.rq:1 RegulatingControl-point.rq:1 ReactiveCapabilityCurve-units.rq:1 ReactiveCapabilityCurve-reactiveCountP.rq:1 PowerTransformerEnd.x-value.rq:1 PowerTransformerEnd.ratedU-valueRange.rq:1 PowerTransformerEnd.r-valueRange.rq:1 PowerTransformer-twoWinding.rq:1 PowerTransformer-associationNotUsed.rq:1 PowerFlowResult-VoltageLimit.rq:1 PowerFlowResult-VoltageAngleLimit.rq:1 PowerFlowResult-ReactivePowerLimit.rq:1 PowerFlowResult-CurrentLimit.rq:1 PowerFlowResult-ApparentPowerLimit.rq:1 PowerFlowResult-ActivePowerLimit.rq:1 OperationalLimitType.isInfiniteDuration-usage.rq:1 OperationalLimitType.acceptableDuration-usage.rq:1 OperationalLimitSet-limits.rq:1 OperationalLimit.AssessedElement-required.rq:1 LimitKind.tc-duration.rq:1 DanglingReferences.rq:1 DCConverterUnit-cscPowerTransformer.rq:1 CurveData-equationY2.rq:1 CurveData-equationY1.rq:1 ConductingEquipment.BaseVoltage-usage.rq:1 BoundaryPoint-bppl1Bppl2.rq:1 ```
What's wrong with EXISTS? it is often unnecessary and can be replaced with standard SHACL. Let's look at a few cases:
  sh:path [sh:alternativePath (nc:EnergyComponent.GeneratingUnit nc:EnergyComponent.PowerElecronicsUnit nc:EnergyComponent.EnergyConsumer nc:EnergyComponent.HydroPump)];
  sh:minCount 1
  • PowerBidDependency.startToStartLagKind-required

    If PowerBidDependency.startToStartLag is present PowerBidDependency.startToStartLagKind is required.

sh:targetSubjectsOf nc:PowerBidDependency.startToStartLag;
sh:property [sh:path nc:PowerBidDependency.startToStartLagKind; sh:minCount 1]
  • PowerFlowResult-VoltageLimit

    PowerFlowResult.valueV is required attribute if a VoltageLimit is referenced by the association end PowerFlowResult.OperationalLimit.

sh:target [sh:select "select $this {$this nc:PowerFlowResult.OperationalLimit cim:VoltageLimit}"];
sh:property [sh:path nc:PowerFlowResult.valueV; sh:minCount 1]

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions