instances: alignement BR-013 de SODH, migration v1.1 terminee. 10 metriques meres, 132 data elements dont 95 computedBy et 37 represents, 15 concepts, 12 business objects. Grain sur les 4 dimensions seulement, celui des faits restant porte par references. Validation SHACL conforme, zero violation. Scripts rendus idempotents : des blocs dupliques sont invisibles a SHACL car les triplets identiques fusionnent

This commit is contained in:
Bastien Gourdon
2026-07-27 20:53:21 +02:00
parent c8693b63bb
commit 45ca9ffb68
4 changed files with 1662 additions and 355 deletions
+30 -2
View File
@@ -236,13 +236,41 @@ def main():
meta_shacl=False,
)
def shape_label(g, res, SH):
"""
A readable name for the shape that fired.
sh:sourceShape on a property constraint is a blank node, which prints as
'ne775aabb...' and tells the reader nothing. Fall back, in order, to the
constrained path, then to the named NodeShape that owns the blank node,
then to the constraint component.
"""
shape = g.value(res, SH.sourceShape)
if shape is not None and not str(shape).startswith("n"):
name = str(shape).rsplit("/", 1)[-1]
if name and not name.startswith("N"):
return name
path = g.value(res, SH.resultPath)
if path is not None:
owner = None
for s_, p_, o_ in g.triples((None, SH.property, shape)):
owner = s_
break
base = str(path).rsplit("/", 1)[-1].rsplit("#", 1)[-1]
if owner is not None and not str(owner).startswith("n"):
return "%s / %s" % (str(owner).rsplit("/", 1)[-1], base)
return "path %s" % base
comp = g.value(res, SH.sourceConstraintComponent)
if comp is not None:
return str(comp).rsplit("#", 1)[-1]
return "(unnamed shape)"
rows = []
for res in results.subjects(RDF.type, SH.ValidationResult):
sev = str(results.value(res, SH.resultSeverity)).rsplit("#", 1)[-1]
focus = str(results.value(res, SH.focusNode)).rsplit("/", 1)[-1]
msg = str(results.value(res, SH.resultMessage) or "")
src = str(results.value(res, SH.sourceShape) or "").rsplit("/", 1)[-1]
rows.append((sev, src, focus, msg))
rows.append((sev, shape_label(results, res, SH), focus, msg))
violations = sum(1 for r in rows if r[0] == "Violation")
warnings = len(rows) - violations