Kwaliteitsregeltaal
Een formele, leesbare taal voor het beschrijven van kwaliteitsregels voor gegevens
Inleidingbewerken
De Kwaliteitsregeltaal (KRT) is een gestructureerde, formele taal waarmee je regels kunt opstellen om de kwaliteit van gegevens te toetsen. Het doel is om zowel voor mensen als machines begrijpelijk te zijn: iemand zonder technische kennis kan regels lezen, schrijven en begrijpen en softwaresystemen kunnen de regels automatisch uitvoeren. Het doel is om de kloof tussen de wereld van de business en de wereld van de techniek te overbruggen. Kwaliteitsregels moeten eenvoudig uitgedrukt en begrepen kunnen worden.
KRT fungeert als een contract: een formele afspraak over hoe data eruit moet zien, opgeschreven in begrijpelijke taal. De taal is een vereenvoudiging van talen zoals SPARQL, SHACL en SQL. KRT is zelf alleen bedoeld om beperkingsregels te beschrijven en is dus géén querytaal. De taal biedt een minimale set aan krachtige concepten die de belangrijkste soorten kwaliteitsregels kunnen beschrijven.
Een regel in KRT beschrijft aan welke voorwaarden gegevens moeten voldoen. Een softwaresysteem voert die regel daarna uit voor elk object in de dataset. Slaagt een object niet voor de regel, dan is er een mogelijk kwaliteitsprobleem gedetecteerd. In een deel van de gevallen zijn dit echt fouten en zou je de gegevens liefst al eerder hebben afgewezen bij registratie. Andere gevallen zijn meer een indicatie van een mogelijke fout en duiden op een inplausibele waarde.
KRT is bedoeld om regels expliciet te maken van de gegevenselementen van een dataset die expliciet worden gecontroleerd op hun kwaliteit. Daarbij ligt de focus op de belangrijkste regels en de belangrijkste gegevenselementen (kritieke gegevenselementen).
In gegevensmodellen en schema's worden ook regels gedefinieerd. Deze regels kunnen grotendeels ook met KRT worden beschreven. Dat is relevant als deze modellen en schema's ontbreken of onvolledig zijn. Daarnaast is het mogelijk om in KRT regels uit te drukken die niet standaard onderdeel zijn van dit soort modellen of schema's. Denk daarbij vooral aan regels die uitspraken doen over de relaties tussen gegevens of over het geheel van gegevens. KRT is daardoor ook een goede aanvulling op bijvoorbeeld het Metamodel Informatie Modellering, dat vrij laat hoe beperkingsregels precies worden vastgelegd.
KRT is een aanvulling op het NORA Raamwerk gegevenskwaliteit dat beschrijft welke aspecten van kwaliteit kunnen worden gemeten. Het is ook mogelijk om een regel in KRT direct te relateren aan een kwaliteitsmetriek in het NORA raamwerk. Tools kunnen hieruit ook de van toepassing zijnde kwaliteitdimensie en kwaliteitsattribuut afleiden. In kwaliteitsrapportages conform het NORA raamwerk kan ook worden verwezen naar regels in KRT.
De basis van KRT is taalonafhankelijk en kan gebruikt worden voor elke vorm van gegevenskwaliteitscontrole. Voor projecten die werken met geo-informatie biedt KRT een optionele ruimtelijke extensie.
Er zijn tools ontwikkeld die regels in KRT kunnen vertalen en controleren. Deze tools zijn nadukkelijk bedoeld als demonstrator en kunnen fouten bevatten. De vertaler kan kwaliteitsregels die zijn opgesteld in KRT vertalen naar (Geo)SPARQL en SQL. De validator ondersteunt het valideren van kwaliteitsregels. Er is een tool beschikbaar dat een SHACL specificatie omzet naar regels in Kwaliteitsregeltaal. De gegevenskwaliteitsregistratie is uitgebreid met de mogelijkheid om kwaliteitsregels conform KRT in te voeren, te beheren en te koppelen aan meetresultaten. Al deze tools zijn beschikbaar op de GitLab omgeving van het Federatief Datastelsel.
KRT is opgesteld door Danny Greefhorst vanuit zijn rol bij Bureau Architectuur Digitale Overheid van het ministerie van Binnenlandse zaken. De standaard heeft geen formele status.
Basisstructuurbewerken
Elke KRT-regel richt zich primair op instanties van objecttypes, zoals persoon of adres. De regel wordt niet op de klasse als geheel toegepast, maar op elk afzonderlijk object. Vanuit dat object verwijs je naar haar kenmerken via een pad: een punt-gescheiden reeks van namen (identifiers) die door de datastructuur navigeert. Het is echter ook mogelijk om controles uit te voeren op de gehele populatie van een objecttype.
De regels worden gebruikt om controles uit te voeren en ze bevatten expressies die leiden tot een WAAR of ONWAAR uitkomst. Expressies bestaan uit operatoren en operanden. Een operator kun je zien als een soort functie, die invoerparameters (operanden) krijgt en tot een resultaat leidt. Operanden zijn attributen van objecten, van paden of van vaste waarden. Je kunt expressies met logische operatoren zoals EN en OF samenvoegen tot een grotere expressie.
De algemene structuur van een regel ziet er als volgt uit:
VOOR [ POPULATIE ] ObjectType
{ [ OMSCHRIJVING "Tekst" ] | [ MELDING "Tekst met {variable}" ] |
[ ERNST fout | waarschuwing | informatie ] | [ METRIEK Metriek ] }* :
RegelBody
RegelBody ::= Expressie | STARTCODE Taal ... EINDCODE
| Onderdeel | Betekenis | Voorbeelden |
|---|---|---|
REGEL |
Sleutelwoord dat de start van een regel aangeeft | REGEL
|
Identifier |
Een unieke, beschrijvende naam voor de regel | PostcodeVerplicht
|
VOOR [ POPULATIE ] ObjectType |
De eenheid waarop de regel van toepassing is. | VOOR Adres of VOOR POPULATIE Gebouw
|
[ OMSCHRIJVING "Tekst" ] |
Optionele functionele omschrijving van de regel. | OMSCHRIJVING "Een adres moet een postcode hebben"
|
[ MELDING "Tekst" ] |
Optionele meldingstekst die wordt getoond als een object niet voldoet aan de regel. | MELDING "Adres {id} heeft ongeldige postcode {postcode}"
|
[ ERNST fout/waarschuwing/informatie ] |
Optionele aanduiding van de ernst van een overtreding. | ERNST informatie
|
[ METRIEK Metriek ] |
Optionele verwijzing naar een kwaliteitsmetriek uit een kwaliteitsraamwerk. | METRIEK AttribuutCompleetheidMetric
|
RegelBody |
De eigenlijke validatielogica | postcode IS NIET LEEG
|
Een KRT regel start altijd op een nieuwe tekstregel. Regeleinden en spaties hebben geen betekenis in KRT. KRT regels kunnen dus over meerdere tekstregels heen gedefinieerd worden. Commentaar kan tussen "(*" en "*)" op willekeurige plaatsen in de regeltekst worden geplaatst.
Een voorbeeld van een regel voor individuele objecten is:
REGEL persoon_heeft_naam VOOR Persoon:
HEEFT naam
Een voorbeeld van een regel die van toepassing is op een populatie van objecten is:
REGEL minimum_aantal_gebouwen VOOR POPULATIE Gebouw:
HEEFT AANTAL >= 100
Een populatie kan worden beperkt met een filter met de vorm ALS ... DAN .... De expressie achter ALS bepaalt welke instanties worden meegenomen in de populatie-analyse; de controle achter DAN is het filter dat over de gehele populatie heen wordt gehaald. Zie bijvoorbeeld de volgende regel:
REGEL minimum_aantal_gebouwen VOOR POPULATIE Gebouw:
ALS bouwjaar > 2000
DAN HEEFT AANTAL >= 100
Het sleutelwoord OMSCHRIJVING kan worden gebruikt om een functionele omschrijving van de regel toe te voegen. Dit is met name relevant om de bedoeling van de regel vast te leggen op een manier die begrijpelijk is voor niet-technische gebruikers. Het sleutelwoord MELDING kan worden gebruikt om een gestandaardiseerde meldingstekst te definiëren die aan gebruikers wordt getoond wanneer een object niet aan de regel voldoet. De meldingstekst kan variabelen bevatten tussen accolades, zoals {postcode}, die bij het tonen van de overtreding worden vervangen door de daadwerkelijke waarden in het object. Het sleutelwoord ERNST geeft aan hoe ernstig een overtreding van de regel is en kan de waarde fout, waarschuwing of informatie aannemen.
Er kan daarnaast het sleutelwoord METRIEK een verwijzing naar een kwaliteitsmetriek in een kwaliteitsraamwerk worden gemaakt. Er is in KRT een voorkeur voor het gebruik van het NORA raamwerk gegevenskwaliteit en de standaard kwaliteitsmetrieken uit dat raamwerk worden daarom ook herkend. Hiervoor is geen prefix noodzakelijk, maar kan gewoon de naam van de metriek zelf als identifier worden gebruikt zoals ThematischeJuistheidMetric. Tools kunnen op basis van de relatie naar de kwaliteitsmetriek ook de bovenliggende kwaliteitsattribuut en kwaliteitsdimensie achterhalen.
De RegelBody is typisch de specificatie van de regel zelf in KRT. Het is echter ook mogelijk een specificatie in een willekeurige andere regeltaal te incorporeren in de KRT structuur. Hiervoor kan er tussen regels met de tekst "STARTCODE" en "EINDCODE" een regelspecificatie in een andere taal worden opgenomen. De gekozen taal staat achter de het sleutelwoord "STARTCODE". Standaard worden hierin herkend: Tekst, SHACL, SPARQL, SQL en OCL. Het voordeel van deze constructie is dat regels die te complex zijn om in KRT uit te drukken, toch op dezelfde manier en plaats als de rest van de KRT regels kunnen worden beheerd.
Waarden en datatypesbewerken
Een expressie in KRT bestaat uit operatoren en operanden. Een operator kun je zien als een functie, die op basis van bepaalde invoerparameters (de operanden) tot een bepaalde waarde komt. Een expressie leidt daarbij tot het resultaat WAAR of ONWAAR. Operanden zijn dus de parameters van de operatoren. Dat kunnen concrete waarden zijn, maar kunnen ook verwijzingen zijn naar gegevens in de vorm van identifiers of paden (zie verderop). KRT hanteert een strikt typesysteem om semantische fouten te voorkomen.
De volgende datatypes worden door KRT onderscheiden.
| Type | Notatie | Omschrijving | Voorbeeld |
|---|---|---|---|
TEKST |
Dubbele aanhalingstekens | Alfanumerieke reeksen | "Amsterdam", "Actief"
|
GETAL |
Punt als decimaalscheiding | Hele of decimale getallen, ook negatief | 18, 52.37, -5
|
BOOLEAN |
Verplicht in hoofdletters | Waar/onwaar-waarden | WAAR, ONWAAR
|
DATUM |
DD-MM-JJJJ of dynamisch |
Harde datums of relatieve waarden | 31-12-1972, VANDAAG
|
TIJD |
UU:MM:SS of dynamisch |
Tijdstippen of relatieve waarden | 14:30:00, NU
|
DATUMTIJD |
JJJJ-MM-DD UU:MM:SS of dynamisch |
Combinatie van datum en tijd | 1972-12-31 14:30:00, NU
|
TIJDSDUUR |
ISO 8601-duur | Relatieve tijdsperiode voor rekenen met datum/tijd | P30D, PT2H, P18Y
|
URI |
Punthaakjes <...> |
Web-verwijzingen naar concepten of bronnen | <https://data.overheid.nl/id/concept/adres>
|
GEOMETRIE |
Zie ruimtelijke extensie | ||
Merk op dat er in KRT geen onderscheid wordt gemaakt tussen gehele getallen en getallen met een komma. Er is in KRT een speciale operator (HEEFT PRECISIE) waarmee het aantal getallen achter de komma expliciet wordt gemaakt. Een geheel getal is dan een getal met een precisie van 0 getallen achter de komma.
Identifiersbewerken
Er wordt naar gegevens verwezen met identifiers en paden. Een identifier is een unieke naam van een bepaald soort gegeven, zoals een objecttype of een attribuut. Een objecttype is de typering van een groep objecten die binnen een domein relevant zijn en als gelijksoortig worden beschouwd. Een attribuut (ook wel: attribuutsoort) is de typering van gelijksoortige gegevens die voor een objecttype van toepassing is. Een voorbeeld van een objecttype is persoon. Een voorbeeld van een attribuut is naam.
Identifiers bestaan meestal uit een verzameling letters, zonder spaties. In KRT zijn identifiers algemener gedefinieerd zodat ook Uniform Resource Identifiers (URI's) als identifier kunnen worden gebruikt. Dit soort identifiers starten typisch met "https://...". Hierdoor is het mogelijk om wereldwijd unieke namen toe te kennen. Het sluit ook goed aan op de context van Linked Data, waarbij alle gegevens voorzien zijn van een dergelijke URI.
Er kan ook gebruik worden gemaakt van prefixes in identifiers. Een prefix is een standaard voorvoegsel dat voor een naam wordt geplaatst. In de context van Linked Data verwijst dit typisch naar een weblocatie voor een bepaald gegeven en is het dus een URI-prefix. De prefix wordt gescheiden van de naam middels een dubbele punt (:). Het gebruik van prefixen is optioneel en vooral relevant als de regels worden gebruikt in de context van Linked Data. De inhoud van de prefixes kunnen niet in KRT worden uitgedrukt, en moeten later in de keten worden toegevoegd. Identifiers die niet zijn voorzien van een specifieke prefix kunnen daarbij automatisch een standaard prefix krijgen.
Bij het gebruik van een identifier voor een attribuut of relatie moet expliciet rekening gehouden worden met situaties waarin er meerdere instanties van deze identifier kunnen bestaan. Voor veel van deze situaties is een expliciete VOOR ELK constructie nodig, zodat per instantie wordt getoetst of aan condities wordt voldaan.
Het is mogelijk om in expressies te verwijzen naar het huidige object. Een voorbeeld hiervan is het uitsluiten van reflexiviteit: een concept of object mag in een taxonomie of hiërarchie nooit naar zichzelf verwijzen. Hiervoor wordt gebruik gemaakt van het sleutelwoord id. Dit sleutelwoord mag uitsluitend worden gebruikt als rechterlid binnen een vergelijking. Het kan ook gebruikt worden in combinatie met BESTAAT IN, waarbij Objecttype.id verwijst naar de identifier van het objecttype.
Voorbeelden van het gebruik van dit sleutelwoord is:
VOOR ELK b IN broader: b <> id
VOOR ELK attr IN attribuut: attr BESTAAT IN Attribuutsoort.id
Padenbewerken
Om bij gegevens te komen waarvoor door de gegevensstructuur heen moet worden genavigeerd, maakt KRT gebruik van paden. Een pad is een manier om door de gegevensstructuur heen gaan door het volgen van een verzameling van identifiers. De eerste identifier in een pad verwijst typisch naar een relatie. De volgende identifier verwijst naar een specifiek attribuut of naar een andere relatie. Paden bestaan uit een verzameling identifiers gescheiden door een punt (.). Het softwaresysteem dat KRT interpreteert zal deze paden vertalen naar verbindingen tussen objecten, zoals JOIN's in de context van SQL.
Een voorbeeld van een pad is:
Net zoals geldt voor identifiers vragen multi-waardige identifiers aandacht. Deze mogen niet voorkomen in een pad en moeten vertaald worden naar VOOR ELK constructies.
Soms moet je een relatie in omgekeerde richting volgen. Bijvoorbeeld: in plaats van "welk concept heeft deze narrower?" wil je weten "welke concepten hebben dit concept als narrower?". Hiervoor gebruik je het sleutelwoord INVERSE. gevolgd door de relatie.
Een voorbeeld:
Deze verwijst naar een object dat dit concept als broader heeft én ermee identiek is. Het pad INVERSE.broader navigeert van een object terug naar alle objecten die via broader naar dit concept verwijzen. Het sleutelwoord INVERSE. kan op elke positie in een pad worden gebruikt en mag meerdere keren voorkomen.
Het INVERSE.-sleutelwoord kan ook worden gecombineerd met verdere padsegmenten, maar ook dan geldt: bevat het pad een multi-waardige relatie, gebruik expliciet kwantificering:
Het is ook mogelijk gegevens te spiegelen aan de rest van de dataset. Dat is bijvoorbeeld handig voor het detecteren van uitbijters. Hiervoor wordt gebruik gemaakt van het sleutelwoord "POPULATIE" als eerste deel van een pad. Voorafgaand aan dat sleutelwoord kan respectievelijk "SOM VAN", "MIN VAN ", "MAX VAN" of "GEMIDDELDE VAN" staan om aan te geven welke berekening op de populatie moet worden gedaan.
Een voorbeeld van het gebruik van deze constructie is:
Deze constructie stelt dat de prijs niet meer dan 20% boven het gemiddelde mag liggen.
Een andere constructie die hier dicht tegen aan ligt is als identifiers in een pad verwijzen naar dingen waarvan er meerdere instanties zijn. In dat geval kan ook de som, minimum, maximum of gemiddelde worden bepaald. De structuur en formulering wijkt echter af van voorgaande, maar volgt die van de manier waarop regels worden geformuleerd die over de populatie als geheel gaan.
Logische operatorenbewerken
Condities kun je met elkaar combineren via logische operatoren. Om dubbelzinnigheid te voorkomen, hanteert KRT een strikte prioriteitsvolgorde (precedentie). Operatoren die hoger in de lijst staan, worden als eerste verwerkt. Je kunt altijd ronde haakjes ( ) gebruiken om de standaardvolgorde handmatig aan te passen of als je twijfelt aan de evaluatievolgorde.
De standaard prioriteitsvolgorde van logische operatoren is:
| Operator | Precedentie | Betekenis |
|---|---|---|
ALS ... DAN ... ANDERS |
1 (hoogste) | Conditionele vertakking. Als de conditie achter ALS waar is, moet de expressie achter DAN slagen. Is de conditie onwaar, dan moet de expressie achter ANDERS slagen.
|
OF |
2 | Inclusieve disjunctie: de regel slaagt als minstens één van de deelcondities waar is. |
XOR |
3 | Exclusieve disjunctie: de regel slaagt als exact één van beide deelcondities waar is en de andere onwaar. A XOR B is semantisch gelijk aan (A EN NIET B) OF (NIET A EN B).
|
EN |
4 | Conjunctie: alle deelcondities moeten gelijktijdig waar zijn. |
NIET |
5 (laagste) | Unaire negatie: keert een ware conditie om naar onwaar en vice versa. |
Vergelijkingsoperatorenbewerken
Een vergelijking toetst twee expressies aan elkaar met een vergelijkingsoperator. Het resultaat is altijd WAAR of ONWAAR.
| Operator | Betekenis |
|---|---|
= |
Gelijk aan |
<> |
Niet gelijk aan |
< |
Kleiner dan |
> |
Groter dan |
<= |
Kleiner dan of gelijk aan |
>= |
Groter dan of gelijk aan |
Numerieke operatorenbewerken
Wanneer operanden van het type GETAL zijn, kunnen ze gekoppeld worden met +, -, * en / voor reguliere wiskundige berekeningen.
Er is een speciale operator gedefinieerd om de precisie van een getal expliciet te maken. Hiermee kun je ook uitdrukken dat een getal altijd een geheel getal moet zijn (deze heeft dan een precisie van 0). Een vergelijkingsoperator zoals = of <> is daarbij optioneel.
| Syntax | Werking |
|---|---|
Pad HEEFT PRECISIE [VergelijkingsOperator] GetalWaarde |
Valideert het maximale aantal toegestane decimalen achter de komma. |
Tekstoperatorenbewerken
Binnen KRT is het mogelijk om tekstfragmenten samen te voegen met behulp van het + teken. Een voorbeeld daarvan is:
Er zijn verder in KRT operatoren gedefinieerd waarmee je eigenschappen van teksten kunt controleren.
| Syntax | Werking |
|---|---|
Pad START MET StringWaarde |
Controleert of een tekst begint met het opgegeven tekstfragment. |
Pad EINDIGT OP StringWaarde |
Controleert of een tekst eindigt met het opgegeven tekstfragment. |
Pad BEVAT StringWaarde |
Controleert of het opgegeven tekstfragment ergens in een tekst voorkomt. |
Pad HEEFT LENGTE GetalWaarde |
Telt het exacte aantal tekens van een tekst. |
Pad HEEFT TAAL StringWaarde |
Geeft het label van de taal van de tekst. |
VOLGT PATROON StringWaarde |
Controleert of een tekst voldoet aan een bepaalde reguliere expressie. |
De taal wordt uitgedrukt in termen van de IANA Subtags zoals "nl", "en" of "de". Merk op dat deze operator alleen wordt ondersteund door talen zoals SPARQL die teksten expliciet voorzien van een taal.
Een voorbeeld van de toepassing van de VOLGT PATROON operator is:
Tekstfunctiesbewerken
De volgende functies transformeren tekstwaarden:
| Functie | Werking |
|---|---|
SUBSTRING(WaardeExpressie, start, lengte) |
Selecteert een deel van een tekst vanaf een startpositie met een bepaalde lengte |
KLEINE_LETTERS(WaardeExpressie) |
Zet alle letters om naar kleine letters (lowercase) |
HOOFDLETTERS(WaardeExpressie) |
Zet alle letters om naar hoofdletters (uppercase) |
WITRUIMTE_SCHOON(WaardeExpressie) |
Verwijdert voorloop- en volgspaties en vervangt binnenkomende witruimte-reeksen door enkele spaties (trim + normaliseer spaties) |
VERVANG(WaardeExpressie, oud, nieuw) |
Vervangt alle voorkomens van een deelstring (oud) door een nieuwe deelstring (nieuw) |
SPLITS(WaardeExpressie, scheidingsteken) |
Splitst een tekst op basis van een scheidingsteken en retourneert het aantal delen |
Deze functies kunnen overal worden gebruikt waar een expressie kan staan, zoals in vergelijkingen. Voorbeelden:
Datum- en tijdoperatorenbewerken
KRT biedt ondersteuning voor het rekenen met datums, tijden en tijdsduren. Dit maakt het mogelijk om regels te formuleren zoals "de geboortedatum mag niet in de toekomst liggen", "de registratie moet binnen 30 dagen zijn gewijzigd" of "de einddatum moet na de startdatum vallen".
Datum- en tijdstypenbewerken
KRT onderscheidt drie temporele datatypes en één duurtype:
| Type | Notatie | Omschrijving | Voorbeeld |
|---|---|---|---|
DATUM |
DD-MM-JJJJ |
Een specifieke datum (dag, maand, jaar) | 31-12-1972
|
TIJD |
UU:MM:SS |
Een tijdstip op de klok (uren, minuten, seconden) | 14:30:00
|
DATUMTIJD |
JJJJ-MM-DD UU:MM:SS |
Een volledig tijdstip (datum + tijd) | 1972-12-31 14:30:00
|
TIJDSDUUR |
ISO 8601-duur | Een relatieve tijdsperiode | P30D
|
KRT kent twee dynamische waarden voor datum en tijd:
| Waarde | Type | Werking |
|---|---|---|
VANDAAG |
DATUM | De huidige datum (afgeleid van systeemklok) |
NU |
TIJD of DATUMTIJD | Het huidige tijdstip: is het linkeroperand van type DATUMTIJD? Dan DATUMTIJD(NOW()), anders TIME(NOW())
|
Tijdsduurbewerken
Een tijdsduur (TIJDSDUUR) wordt uitgedrukt in het ISO 8601-formaat voor durations. Dit formaat gebruikt de letter P (period) gevolgd door een combinatie van datum- en tijdaanduidingen:
Onderdelen van de ISO 8601-duur:
| Onderdeel | Betekenis | Voorbeelden |
|---|---|---|
P |
Start van een duur (verplicht) | P
|
nY |
Aantal jaren | P1Y (1 jaar), P18Y (18 jaar)
|
nM |
Aantal maanden (voor de T) | P3M (3 maanden)
|
nD |
Aantal dagen | P30D (30 dagen), P7D (7 dagen)
|
T |
Scheiding tussen datum- en tijdgedeelte | PT
|
nH |
Aantal uren (na de T) | PT2H (2 uur)
|
nM |
Aantal minuten (na de T) | PT30M (30 minuten)
|
nS |
Aantal seconden (na de T) | PT45S (45 seconden)
|
Voorbeelden van geldige tijdsduren:
| ISO 8601 || Betekenis
|-
| P30D || 30 dagen
|-
| P18Y || 18 jaar
|-
| PT2H || 2 uren
|-
| P1Y6M || 1 jaar en 6 maanden
|-
| P7DT30M || 7 dagen en 30 minuten
|-
| PT45M30S || 45 minuten en 30 seconden
Rekenen met datums en tijdenbewerken
Datums, tijden en datums+tijden kunnen worden vergeleken met de standaard vergelijkingsoperatoren (=, <>, <, >, <=, >=). Daarnaast ondersteunt KRT het optellen en aftrekken van tijdsduren:
| Syntax | Werking | Voorbeeld |
|---|---|---|
DatumOperand + TIJDSDUUR |
Telt een duur op bij een datum/tijd | geboortedatum + P18Y <= VANDAAG
|
DatumOperand - TIJDSDUUR |
Trekt een duur af van een datum/tijd | wijzigingsdatum >= VANDAAG - P30D
|
TijdOperand + TIJDSDUUR |
Telt een duur op bij een tijdstip | starttijd + PT2H <= eindtijd
|
TijdOperand - TIJDSDUUR |
Trekt een duur af van een tijdstip | tijdstipMelding >= NU - PT1H
|
DatumOperand - DatumOperand |
Berekent het verschil tussen twee datums | einddatum - startdatum >= P30D
|
Het verschil tussen twee datums of tijden (operand - operand) resulteert in een TIJDSDUUR-waarde die kan worden vergeleken met een andere TIJDSDUUR.
geboortedatum <= VANDAAG
wijzigingsdatum >= VANDAAG - P30D
geboortedatum + P18Y <= VANDAAG
(tijdstipAfhandeling - tijdstipMelding) <= PT2H
registratieTijdstip IS DATUMTIJD
startdatum < einddatum
(einddatum - startdatum) >= P7D
(einddatum - startdatum) >= P30D
Bestaan, leegte en typesbewerken
Om te controleren of gegevens technisch correct zijn aangeleverd, kent KRT drie afzonderlijke constructies.
| Constructie | Wat wordt gecontroleerd |
|---|---|
HEEFT Pad |
Controleert of de eigenschap of relatie aanwezig is ongeacht de inhoud ervan. |
Pad IS [NIET] LEEG |
Controleert de inhoudelijke vulling. Een veld is leeg als het bestaat maar een lege tekst "" of een NULL-waarde bevat.
|
Pad IS [NIET] BasisType |
Controleert of het aanwezige datatype van de waarde overeenkomt met het verwachte datatype (of niet). |
Pad IS [NIET] TYPE ObjectType |
Controleert of het object waarnaar het pad verwijst van het opgegeven objecttype is (of niet). |
Pad IS [NIET] LITERAL |
Controleert of het object een concrete waarde is en geen verwijzing naar een ander object. Combineer bij mapping naar RDF met IS NIET URI om te bepalen of het pad een blank node is. |
Pad BESTAAT |
Controleert of het object waarnaar het pad verwijst daadwerkelijk bestaat in de database. |
Voorbeelden:
Uniciteit en relatie-integriteitbewerken
Om de samenhang en exclusiviteit van gegevens over een dataset te bewaken, kent KRT de volgende operatoren.
| Operator | Werking |
|---|---|
UNIEK AttribuutLijst |
Werkt als een primaire sleutel. Dwingt af dat de waarde (of de combinatie van waarden) van de opgegeven attributen in de gehele dataset maar één keer mag voorkomen. |
UNIEK AttribuutLijst PER GroepsAttribuut |
Introduceert lokale groepsuniciteit. De waarde hoeft niet uniek te zijn in de hele dataset, maar mag geen duplicaten bevatten binnen de subset van objecten die hetzelfde groepsattribuut delen. |
Pad BESTAAT IN ObjectType.Identifier |
Handhaaft referentiële integriteit. De waarde van het pad moet als geldige identificatie of sleutel bestaan binnen de vermelde doelklasse — vergelijkbaar met een foreign key-constraint. |
Pad IS SYMMETRISCH |
Exclusief voor relaties tussen objecten. Dwingt af dat als Object A via deze relatie naar Object B verwijst, Object B verplicht via exact dezelfde relatiestructuur terugverwijst naar Object A. |
Pad IS INVERSE VAN Pad |
Dwingt af dat de relatie de inverse is van een tweede relatie. Als Object A via het eerste pad naar Object B verwijst, dan moet Object B verplicht via het tweede pad terugverwijzen naar Object A. Dit is de asymmetrische tegenhanger van IS SYMMETRISCH: twee verschillende relaties worden als inversen van elkaar gedefinieerd.
|
Voorbeelden:
Waardelijstenbewerken
Controleert of een waarde voorkomt in een statische opsomming van toegestane waarden. Het gecontroleerde pad en alle opgesomde waarden moeten van een identiek datatype zijn.
Een voorbeeld hiervan is:
Operatoren op verzamelingenbewerken
Er zijn drie situaties waarbij operatoren op verzamelingen van gegevens werken:
Situatie 1. Als er in de regel zelf, direct na het sleutelwoord "VOOR" het sleutelwoord "POPULATIE" staat. In dit geval gaat de regel over de verzameling van alle gegevens van een bepaald objecttype.
Bijvoorbeeld:
HEEFT AANTAL >= 100
Situatie 2. Als het pad in een expressie start met het sleutelwoord "POPULATIE". In dit geval wordt een operator toegepast op alle waarden van een bepaalde eigenschap in de gehele dataset. Dit heet een aggregaatberekening.
Bijvoorbeeld:
MIN VAN POPULATIE.bouwjaar > 1950
Situatie 3. Als het pad in een expressie verwijst naar iets waar meerdere instanties van zijn. In dit geval heeft een relatie of attribuut een kardinaliteit groter dan 1 en kan een operator worden gekoppeld aan alle instanties.
Bijvoorbeeld:
deur HEEFT MIN > 1
Voor alle drie de situaties zijn er operatoren beschikbaar voor het bepalen van de optelsom, het maximum, het minimum of het gemiddelde van alle gegevens. De eerste en derde situatie zijn vergelijkbaar in de wijze waarop ze worden behandeld. Zij kennen een soortgelijke formulering (HEEFT SOM/MAX/MIN/GEMIDDELDE) en kennen ook beiden een operator voor het bepalen van het aantal gegevens (HEEFT AANTAL).
De tweede situatie (aggregaatberekening) kent een wat andere structuur. Het begint met de naam van een functie (SOM/MAX/MIN/GEMIDDELDE) gevolgd door "VAN POPULATIE" en een identifier. Deze vorm kent ook niet een operator voor het bepalen van het aantal gegevens.
Voor de eerste en derde situatie gelden de volgende operatoren:
| Syntax | Werking |
|---|---|
HEEFT AANTAL [VergelijkingsOperator] GetalWaarde |
Telt het aantal gekoppelde objecten of waarden |
Pad HEEFT SOM [VergelijkingsOperator] WaardeExpressie |
Telt alle getallen op |
Pad HEEFT MAX [VergelijkingsOperator] WaardeExpressie |
Neemt de hoogste waarde |
Pad HEEFT MIN [VergelijkingsOperator] WaardeExpressie |
Neemt de laagste waarde |
Pad HEEFT GEMIDDELDE [VergelijkingsOperator] WaardeExpressie |
Berekent het gemiddelde |
Voor de derde situatie waarin een pad verwijst naar iets waar meerdere instanties van zijn, zijn er operatoren beschikbaar voor universele kwantificering (VOOR ELK) en existentiële kwantificering (ER IS). Deze operatoren kunnen binnen elkaar genest worden.
Universele kwantificering betekent dat een conditie moet gelden voor elke instantie. Een voorbeeld hiervan is:
Existentiële kwantificering betekent dat een conditie voor minimaal 1 element moet gelden.
Een voorbeeld van existentiële kwantificering is:
Ruimtelijke extensiebewerken
Deze bijlage beschrijft de optionele ruimtelijke extensie van KRT voor geografische gegevens. Deze extensie is gebaseerd op GeoSPARQL. Alle operatoren vereisen dat het pad aan de linkerkant van het type GEOMETRIE is.
Basistypen voor geografische gegevensbewerken
| Type | Notatie | Omschrijving | Voorbeeld |
|---|---|---|---|
GEOMETRIE |
WKT-formaat in aanhalingstekens | Algemene ruimtelijke vorm | "POINT(4.89 52.37)"
|
PUNT |
WKT POINT | Eendimensionale positie in ruimte | "POINT(4.89 52.37)"
|
LIJN |
WKT LINESTRING | Eendimensionale lijn (pad) | "LINESTRING(4.89 52.37, 5.0 52.4)"
|
VLAK |
WKT POLYGON | Tweedimensionale veelhoek (synoniem voor POLYGOON) | "POLYGON((4.89 52.37, 5.0 52.4, 5.0 52.3, 4.89 52.37))"
|
Topologische relatiesbewerken
Deze operatoren leggen een topologische relatie tussen twee geometrieën. Het linkerpad en de rechter operand moeten beide van het type GEOMETRIE zijn. De operatoren zijn één-op-één vertaald naar de corresponderende GeoSPARQL Simple Features-functies.
| Syntax | GeoSPARQL Functie | Werking |
|---|---|---|
Pad LIGT BINNEN Operand |
sfWithin | De geometrie van het pad valt volledig binnen de geometrie van de operand. |
Pad RAAKT Operand |
sfTouches | De geometrieën raken elkaar in ten minste één punt maar overlappen niet. |
Pad OVERLAPT Operand |
sfOverlaps | De geometrieën overlappen gedeeltelijk (zelfde dimensie). |
Pad KRUIST Operand |
sfCrosses | De geometrieën kruisen elkaar (verschillende dimensies). |
Pad DEELT GRENS MET Operand |
relate | De geometrieën delen een gemeenschappelijke grens (buren). |
Pad CONGRUENT Operand |
sfEquals | De geometrieën zijn topologisch gelijk (vorm en positie). |
Pad BEVAT Operand |
sfContains | De geometrie van het pad bevat de geometrie van de operand volledig. |
Pad DISJUNCT Operand |
sfDisjoint | De geometrieën hebben geen enkel punt gemeenschappelijk. |
Voorbeelden:
Meetoperatorenbewerken
Voor afstandsmetingen en fysieke dimensies sluit KRT aan bij de meetfuncties van GeoSPARQL. De maateenheden zijn gebaseerd op de QUDT standaard. Om de taal optimaal leesbaar en compact te houden wordt het QUDT-symbool gebruikt in plaats van de volledige URI. Het symbool (zoals m, km, of m2) wordt direct achter de getalwaarde gezet.
| Symbool | Omschrijving | Toepassing |
|---|---|---|
mm |
millimeter | afstand, lengte, omtrek |
cm |
centimeter | afstand, lengte, omtrek |
dm |
decimeter | afstand, lengte, omtrek |
m |
meter | afstand, lengte, omtrek |
dam |
decameter | afstand, lengte, omtrek |
hm |
hectometer | afstand, lengte, omtrek |
km |
kilometer | afstand, lengte, omtrek |
mm2 |
vierkante millimeter | oppervlakte |
cm2 |
vierkante centimeter | oppervlakte |
dm2 |
vierkante decimeter | oppervlakte |
m2 |
vierkante meter | oppervlakte |
dam2 |
vierkante decameter (are) | oppervlakte |
hm2 |
vierkante hectometer (hectare) | oppervlakte |
km2 |
vierkante kilometer | oppervlakte |
Let op: Alleen bovenstaande eenheden worden ondersteund. Voor niet-vermelde eenheden uit de QUDT-standaard wordt geen ondersteuning geboden. Bij een onbekend symbool wordt standaard m (meter) gebruikt.
| Syntax | GeoSPARQL Functie | Werking |
|---|---|---|
Pad HEEFT AFSTAND Operand VergelijkingsOperator GetalWaarde Identifier |
distance | Berekent de kortste afstand tussen twee geografische vormen. |
Pad HEEFT OPPERVLAKTE VergelijkingsOperator GetalWaarde Identifier |
area | Berekent de tweedimensionale grootte van een polygoon. |
Pad HEEFT LENGTE VergelijkingsOperator GetalWaarde Identifier |
length | Berekent de eendimensionale lengte van een lijn. |
Pad HEEFT OMTREK VergelijkingsOperator GetalWaarde Identifier |
length | Berekent de totale lengte van de buitenrand van een polygoon. |
Voorbeelden:
Formele grammaticabewerken
In deze paragraaf staat de formele specificatie van de taal in EBNF-grammatica (Extended Backus–Naur Form). Dit is een standaard notatie om de grammatica van een formele taal te beschrijven. Elke regel legt vast welke constructies geldig zijn. Ronde haakjes groeperen, | staat voor 'of', * betekent 'nul of meer keer' en [ ] betekent 'optioneel'. Sleutelwoorden zijn dikgedrukt en tussen enkele aanhalingstekens weergegeven.
| Regel | Definitie |
|---|---|
| ▷ Basisstructuur | |
| Regel | 'REGEL' Identifier 'VOOR' ['POPULATIE'] ObjectType { 'OMSCHRIJVING' StringWaarde | 'MELDING' StringWaarde | 'ERNST' ErnstWaarde | 'METRIEK' Metriek }* ':' RegelBody volgorde-vrij, elk 0..1× |
| RegelBody | Expressie | Constraint | PopulatieFilter | 'STARTCODE' Taal CodeFragment 'EINDCODE' |
| Taal | Identifier |
| CodeFragment | tekst in willekeurige taal |
| ▷ Logica | |
| Expressie | AlsDanAndersExpressie | LogischeOfExpressie |
| AlsDanAndersExpressie | 'ALS' Expressie 'DAN' Expressie [ 'ANDERS' Expressie ] |
| PopulatieFilter | 'ALS' Expressie 'DAN' Expressie |
| LogischeOfExpressie | LogischeXorExpressie ( 'OF' LogischeXorExpressie )* |
| LogischeXorExpressie | LogischeEnExpressie ( 'XOR' LogischeEnExpressie )* |
| LogischeEnExpressie | NietExpressie ( 'EN' NietExpressie )* |
| NietExpressie | [ 'NIET' ] PrimaireExpressie |
| PrimaireExpressie | Vergelijking | BestaanControle | PatroonControle | WaardelijstControle | TypeControle | OperatorControle | KwantificeringControle | '(' Expressie ')' |
| Vergelijking | WaardeExpressie VergelijkingsOperator VergelijkingValue |
| ▷ WaardeExpressies | |
| WaardeExpressie | EvaluatieOperand ( AlgebraïscheOperator EvaluatieOperand )* |
| EvaluatieOperand | Pad | Waarde | AggregaatBerekening | StringFunctie | '(' WaardeExpressie ')' |
| StringFunctie | 'SUBSTRING' '(' WaardeExpressie ',' WaardeExpressie ',' WaardeExpressie ')' | 'KLEINE_LETTERS' '(' WaardeExpressie ')' | 'HOOFDLETTERS' '(' WaardeExpressie ')' | 'WITRUIMTE_SCHOON' '(' WaardeExpressie ')' | 'VERVANG' '(' WaardeExpressie ',' WaardeExpressie ',' WaardeExpressie ')' | 'SPLITS' '(' WaardeExpressie ',' WaardeExpressie ')' |
| AlgebraïscheOperator | '+' | '-' | '*' | '/' | '%' |
| BestaanControle | 'HEEFT' Pad | Pad 'IS' [ 'NIET' ] 'LEEG' |
| PatroonControle | Pad 'VOLGT PATROON' StringWaarde |
| WaardelijstControle | Pad 'IN' '{' Operand ( ',' Operand )* '}' |
| TypeControle | Pad 'IS' ['NIET'] BasisType | Pad 'IS' ['NIET'] 'TYPE' ObjectType | Pad 'IS' ['NIET'] 'LITERAL' |
| ▷ Constraint regels | |
| Constraint | UniciteitControle | RelatieControle |
| UniciteitControle | 'UNIEK' AttribuutLijst [ 'PER' GroepsAttribuut ] |
| RelatieControle | Pad 'BESTAAT IN' ObjectType '.' Identifier | 'BESTAAT' | Pad 'IS SYMMETRISCH' | Pad 'IS INVERSE VAN' Pad |
| KwantificeringControle | 'VOOR' 'ELK' Identifier 'IN' Pad ':' [ '(' ] Expressie [ ')' ] | 'ER' 'IS' Identifier 'IN' Pad ':' [ '(' ] Expressie [ ')' ] |
| AggregaatBerekening | AggregaatFunctie 'VAN POPULATIE' '.' Identifier |
| AggregaatFunctie | 'SOM' | 'MAX' | 'MIN' | 'GEMIDDELDE' |
| ▷ Operatorcontroles voor tekst, getallen en kardinaliteit | |
| OperatorControle | Pad 'START MET' StringWaarde | Pad 'EINDIGT OP' StringWaarde | Pad 'BEVAT' StringWaarde | Pad 'HEEFT LENGTE' [ VergelijkingsOperator ] GetalWaarde | Pad 'HEEFT AANTAL' [ VergelijkingsOperator ] GetalWaarde | 'HEEFT AANTAL' [ VergelijkingsOperator ] GetalWaarde | Pad 'HEEFT TAAL' [ VergelijkingsOperator ] StringWaarde | Pad 'HEEFT PRECISIE' [ VergelijkingsOperator ] GetalWaarde | Pad 'HEEFT SOM' [ VergelijkingsOperator ] WaardeExpressie | Pad 'HEEFT MAX' [ VergelijkingsOperator ] WaardeExpressie | Pad 'HEEFT MIN' [ VergelijkingsOperator ] WaardeExpressie | Pad 'HEEFT GEMIDDELDE' [ VergelijkingsOperator ] WaardeExpressie | GeoControle |
| ▷ Ruimtelijke operatoren | |
| GeoControle | Pad TopologischeOperator Operand | Pad 'HEEFT AFSTAND' Operand VergelijkingsOperator GetalWaarde Eenheid | Pad 'HEEFT OPPERVLAKTE' VergelijkingsOperator GetalWaarde Eenheid | Pad 'HEEFT LENGTE' VergelijkingsOperator GetalWaarde Eenheid | Pad 'HEEFT OMTREK' VergelijkingsOperator GetalWaarde Eenheid |
| Eenheid | Identifier |
| TopologischeOperator | 'LIGT BINNEN' | 'RAAKT' | 'OVERLAPT' | 'KRUIST' | 'DEELT GRENS MET' | 'CONGRUENT' | 'BEVAT' | 'DISJUNCT' |
| ▷ Operanden en Waarden | |
| VergelijkingValue | WaardeExpressie | 'id' |
| Operand | Pad | Waarde | WaardeExpressie |
| Waarde | StringWaarde | GetalWaarde | BooleanWaarde | DatumWaarde | TijdWaarde | DatumTijdWaarde | TijdsduurWaarde | UriWaarde |
| ▷ Basiselementen | |
| VergelijkingsOperator | '=' | '<>' | '<' | '>' | '<=' | '>=' |
| BasisType | 'TEKST' | 'GETAL' | 'DATUM' | 'TIJD' | 'DATUMTIJD' | 'TIJDSDUUR' | 'BOOLEAN' | 'URI' | 'GEOMETRIE' | 'PUNT' | 'LIJN' | 'VLAK' |
| BooleanWaarde | 'WAAR' | 'ONWAAR' |
| ErnstWaarde | 'fout' | 'waarschuwing' | 'informatie' |
| ▷ Temporele waarden | |
| DatumWaarde | 'VANDAAG' | 'NU' | Dag '-' Maand '-' Jaar |
| Dag | '0' [1-9] | [1-2] [0-9] | '3' [0-1] |
| Maand | '0' [1-9] | '1' [0-2] |
| Jaar | [0-9] [0-9] [0-9] [0-9] |
| TijdWaarde | 'NU' | Uur ':' Minuut ( ':' Seconde )* |
| Uur | '0' [0-9] | '1' [0-9] | '2' [0-3] |
| Minuut | [0-5] [0-9] |
| Seconde | [0-5] [0-9] |
| ▷ Uitgebreide temporele waarden | |
| DatumTijdWaarde | 'NU' | Jaar '-' Maand '-' Dag ' ' Uur ':' Minuut ( ':' Seconde )* |
| TijdsduurWaarde | 'P' ( [0-9]+ 'Y' )? ( [0-9]+ 'M' )? ( [0-9]+ 'D' )? ( 'T' ( [0-9]+ 'H' )? ( [0-9]+ 'M' )? ( [0-9]+ 'S' )? )? |
| UriWaarde | '<' UriKarakters* '>' |
| ▷ Padnotatie en Flexibele Identifier grammatica | |
| AttribuutLijst | Pad ( ',' Pad )* |
| Pad | ( 'INVERSE' '.' )? Identifier ( '.' ( 'INVERSE' '.' )? Identifier )* |
| GroepsAttribuut | Identifier |
| ObjectType | Identifier |
| Metriek | Identifier |
| Identifier | ( Alfanumeriek | SpeciaalUriTeken )+ |
| StringWaarde | '"' ( [^"\\] | '\' . )* '"' |
| GetalWaarde | '-'? [0-9]+ ( '.' [0-9]+ )* |
| ▷ Karakters | |
| Alfanumeriek | [a-zA-Z0-9] |
| SpeciaalUriTeken | '-' | '.' | '_' | '~' | ':' | '/' | '?' | '#' | '[' | ']' | '@' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' |
| UriKarakters | Alfanumeriek | SpeciaalUriTeken | '%' [0-9a-fA-F] [0-9a-fA-F] |
Voorbeeldbewerken
Deze paragraaf geeft een voorbeeld van een verzameling van kwaliteitsregels voor het controleren van de kwaliteit van een begrippenkader. De regels zijn gedestilleerd uit beschrijvingen van het tool Skosify voor het controleren van een SKOS-gebaseerde vocabulaire.
REGEL pref_label_verplicht VOOR Concept:
HEEFT prefLabel
REGEL uniek_pref_label_per_schema VOOR Concept:
UNIEK prefLabel PER inScheme
REGEL labels_disjunct VOOR Concept:
(VOOR ELK p IN prefLabel: VOOR ELK a IN altLabel: p <> a) EN
(VOOR ELK p IN prefLabel: VOOR ELK h IN hiddenLabel: p <> h) EN
(VOOR ELK a IN altLabel: VOOR ELK h IN hiddenLabel: a <> h)
REGEL hierarchie_inverse VOOR Concept:
broader IS INVERSE VAN narrower
REGEL hierarchie_niet_reflexief VOOR Concept:
(VOOR ELK b IN broader: b <> id) EN
(VOOR ELK b IN narrower: b <> id)
REGEL related_is_symmetrisch VOOR Concept:
related IS SYMMETRISCH
REGEL gerelateerd_en_hierarchisch_disjunct VOOR Concept:
(VOOR ELK r IN related: VOOR ELK b IN broader: r <> b) EN
(VOOR ELK r IN related: VOOR ELK b IN narrower: r <> b)
REGEL top_concept_is_inverse VOOR Concept:
topConceptOf IS INVERSE VAN hasTopConcept
REGEL top_concept_in_schema VOOR Concept:
ALS HEEFT topConceptOf
DAN topConceptOf = inScheme
REGEL skos_strict_datatypes VOOR Concept:
(VOOR ELK p IN prefLabel: p IS TEKST) EN
(VOOR ELK p IN altLabel: p IS TEKST) EN
(VOOR ELK p IN hiddenLabel: p IS TEKST) EN
(VOOR ELK b IN broader: b IS URI) EN
(VOOR ELK b IN narrower: b IS URI) EN
(VOOR ELK b IN related: b IS URI) EN
(inScheme IS URI)
REGEL pref_label_taal_tag_verplicht VOOR Concept:
VOOR ELK p IN prefLabel: p HEEFT TAAL <> ""
REGEL concept_moet_in_schema VOOR Concept:
inScheme IS NIET LEEG
REGEL collection_heeft_members VOOR Collection:
VOOR ELK m IN member: m IS NIET LEEG
REGEL top_concept_heeft_geen_broader VOOR Concept:
ALS HEEFT topConceptOf
DAN broader IS LEEG
REGEL schema_moet_top_concept_hebben VOOR ConceptScheme:
hasTopConcept IS NIET LEEG
REGEL geen_directe_lus_broader VOOR Concept:
VOOR ELK a IN broader: a.broader <> id
REGEL geen_directe_lus_narrower VOOR Concept:
VOOR ELK a IN narrower: a.narrower <> id
REGEL geen_indirecte_lus_broader_3_stappen VOOR Concept:
VOOR ELK a IN broader: VOOR ELK b IN a.broader: b.broader <> id
Vergelijking met andere regeltalenbewerken
Deze paragraaf vergelijkt Kwaliteitsregeltaal (KRT) met 10 andere talen/standaarden voor regels en validatie. Een kort overzicht van de talen en het onderscheid met KRT:
- RuleSpeak – Op SBVR gebaseerde business-rule notatie van Ronald Ross. Gecontroleerde natuurlijke taal voor het beschrijven van bedrijfsregels. RuleSpeak is niet executeerbaar en ook niet ontworpen voor gegevenskwaliteit.
- SBVR (Semantics of Business Vocabulary and Rules) – OMG-standaard voor het vastleggen van bedrijfsregels in (gestructureerde) natuurlijke taal. SBVR is niet executeerbaar en ook niet ontworpen voor gegevenskwaliteit.
- RegelSpraak – Nederlandse gecontroleerde natuurlijke taal gericht op vertaling van wet- en regelgeving naar regels. Regelspraak is een standaard van de Belastingdienst en niet ontworpen voor gegevenskwaliteit.
- OCL (Object Constraint Language) – OMG-standaard, formele taal voor invarianten/pre-/postcondities op UML-objectmodellen. OCL is UML-specifiek, relatief complex en niet ontworpen voor gegevenskwaliteit.
- SodaCL (Soda Core Language) – YAML-achtige checks-taal van Soda, gericht op tabulaire data. SodaCL is tool-specifiek, minder goed leesbaar voor niet-technische gebruikers en gericht op tabulaire data.
- SHACL (Shapes Constraint Language) – W3C Recommendation voor schemavalidatie van Linked Data. SHACL is specifiek voor RDF-gebaseerde gegevens, relatief technisch en niet ontworpen voor gegevenskwaliteit.
- Schematron – ISO/IEC 19757-3 Uitgebreide taal voor validatie van XML documenten. Schematron is specifiek voor XML-gebaseerde gegevens, complex, gericht op technisch specialisten en niet ontworpen voor gegevenskwaliteit.
- SQL – ISO/IEC 9075. Brede standaard voor het definiëren en bevragen van relationele databases. SQL is specifiek voor tabulaire gegevens, relatief technisch en niet ontworpen voor gegevenskwaliteit (het is primair een querytaal).
- SPARQL – W3C Recommendation voor het definiëren en bevragen van Linked Data. SPARQL is specifiek voor RDF-gebaseerde gegevens, complex, gericht op technisch specialisten en niet ontworpen voor gegevenskwaliteit.
- XML Schema – W3C Recommendation voor schemavalidatie. XML Schema is specifiek voor XML-gebaseerde gegevens, complex, gericht op technisch specialisten en niet ontworpen voor gegevenskwaliteit.
| Aspect | KRT | RuleSpeak | SBVR | RegelSpraak | OCL | SodaCL | SHACL | Schematron | SQL | SPARQL | XML Schema |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Onafhankelijkheid | Technologie-onafhankelijk | Technologie-onafhankelijk | Technologie-onafhankelijk | Technologie-onafhankelijk | UML-specifiek | Tool-specifiek | RDF-specifiek | XML-specifiek | Specifiek voor relationele databases | RDF-specifiek | XML-specifiek |
| Doelgroep | Data steward | Business analist | Business analist | Business analist | Datamodelleur | IT-specialist | IT-specialist | IT-specialist | IT-specialist | IT-specialist | IT-specialist |
| Standaardisatie | NORA (de facto) | De facto (Ross) | OMG | Belastingdienst | OMG | Tool-specifiek | W3C Rec | ISO 19757-3 | ISO 9075 | W3C Rec | W3C Rec |
| Executeerbaar | Ja | Nee | Nee | Ja | Ja | Ja | Ja | Ja | Ja | Ja | Ja |
| Complexiteit | Laag | Laag | Hoog | Hoog | Hoog | Middel | Hoog | Hoog | Middel | Hoog | Hoog |
| Leesbaarheid | Middel | Hoog | Hoog | Hoog | Laag | Laag/Middel | Laag | Laag | Laag | Laag | Laag |
| Uitdrukkingskracht | Middel | Laag | Laag | Middel | Hoog | Middel | Middel | Hoog | Hoog | Hoog | Middel |
| Ontworpen voor gegevenskwaliteit | Ja | Nee | Nee | Nee | Nee | Ja | Nee | Nee | Nee | Nee | Nee |
20 september 2026 18:23:52
2 juli 2026 19:19:14
20 september 2026 18:23:52
289
Informatief