Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ondersteunen aspect min/max voor getallen #109

Closed
architolk opened this issue Oct 10, 2019 · 27 comments · Fixed by #295
Closed

Ondersteunen aspect min/max voor getallen #109

architolk opened this issue Oct 10, 2019 · 27 comments · Fixed by #295
Assignees
Labels
1.2 Issue meenemen in versie 1.2 aanvulling Nieuwe functionaliteit of verzoek prio3 Onbelangrijk, maar urgent y-issue MINOR-versie: nieuwe functionaliteit achterwaarts compatibel

Comments

@architolk
Copy link
Contributor

Zie ook #72 : voorstel vanuit DUO om ook het aspect min/max te ondersteunen zoals ook beschikbaar in SHACL.

@lennartvanbergen
Copy link
Collaborator

Iets meer info?

@architolk
Copy link
Contributor Author

Zie #72. Het gaat er in dit geval om dat aan de constraints de mogelijkheid wordt toegevoegd om een minimum of maximum waarde te kunnen neerzetten, bijvoorbeeld: waarde moet liggen tussen 0 en 5.

@lennartvanbergen lennartvanbergen self-assigned this Jan 7, 2020
@architolk
Copy link
Contributor Author

Voorstel: opnemen zoals voorgesteld.

@architolk architolk self-assigned this Jan 7, 2020
@lennartvanbergen
Copy link
Collaborator

Ja, is eerder besproken als wens. Zodra iemand concreet een informatiemodel wilt maken waarin dit nodig is, gingen we deze toevoegen.

Als je een praktijk voorbeeld noemt dan nemen we die ook op, dan kunnen mensen naar jouw informatiemodel gaan kijken hoe dat daar gedaan is.

@lennartvanbergen
Copy link
Collaborator

Nagevraagd. Voor de BAG en voor de BRK hebben wij geen voorbeelden en dus ook niet zo zeer een voorstel hoe dit te specificeren. Wellicht dat de BRO of een model van TNO vaker met dit bijltje heeft gehakt?

Zo nee, dan zou ik zeggen, geef een concreet voorbeeld en doe een voorstel voor de uitwerking.

Er is even over nagedacht. Wat meespeelt:

De kern van een informatiemodel is om de betekenis en de structuur van de informatie te specificeren. Een definitie van een gegevens, of het een String is, of de structuur van de String moet voldoen aan een patroon.

Een minimum waarde zit in een grijs gebied. Dat geeft eigenlijk meer een bereik aan aan waaraan de data moet voldoen. Dat is niet zozeer betekenis of structuur, maar een waardebereik. Daarom een grijs gebied.

Een bedrijfsregel: verzoeken mogen tot 18u worden aangeleverd, of de geometrie van dit object moet liggen binnen Nederland, of binnen een andere geometrie ... of de geometrie moet voldoen aan srs 28992 etc ... zijn ook zaken die niet bij de kern van een informatiemodel horen, en die we in feite ook niet modelleren. We bieden hiervoor de "catch all extra": een constrain language, OCL.

Een minimum waarde is ook vrij complex, want voor een String moet dit anders gespecificeerd worden dan voor een Integer of een Decimal of een Date, of voor een zelf gedefinieerd datatype. waarbij de waarde zelf ook weer soms dus een String, Integer, Decimal of Date is.

Ik ben hier dan ook vrij terughoudend in. Het lijkt veel werk om iets te specificeren wat vrij diep in de implementatie zit (en waar al een andere mogelijkheid voor is: constraint).

De intentie van het informatiemodel is in ieder geval niet de volledige mogelijkheden van alle technische formaten te ondersteunen (XSD, SHACL, JSON schema enz).

Ben benieuwd hoe andere hier tegen aankijken.

@lennartvanbergen
Copy link
Collaborator

@architolk

Voorstel voor MIM 1.1. - nog niet opnemen, opnemen zodra het nodig is en goed uitgewerkt is. Oftewel, MIM 1.11 of zo.

@lennartvanbergen lennartvanbergen added enhancement prio3 Onbelangrijk, maar urgent labels Jan 27, 2020
@lennartvanbergen lennartvanbergen changed the title Ondersteunen aspect min/max Ondersteunen aspect min/max voor getallen Jul 1, 2021
@lennartvanbergen
Copy link
Collaborator

lennartvanbergen commented Jul 1, 2021

Hierbij zit ook de trade off: moet alles wat je in XSD kan ook in UML gemodelleerd worden? Er is al OCL. Er is al reguliere expressie/patroon. Is het dan nog nodig om min/max te doen?

Let a.u.b. wel op dat we in MIM niet twee verschillende modelleringen hebben voor hetzelfde. Dat willen we namelijk uitdrukkelijk niet.

@JanCampschroer
Copy link

Ik zou dit onderbrengen bij 'Kardinaliteit'. Daar heb je nu de mogelijke waarden: 1, 1.., 0..1 en 0...
Daar kun je de mogelijke waarden n..m aan toevoegen, waarbij n kleiner (of gelijk) is dan m. Dit komt dan overeen met de sh:minCount "n" ; sh:maxCount "m".

Dus in 2.8.2.12 de tekst onder toelichting aanvullen met:
"n..m: een object heeft dit kenmerk minimaal m keer, en het kenmerk kan maximaal m keer voorkomen. "

Een goed voorbeeld ontbreekt nog.

Op MIM-2 niveau zou ik dit interpreteren als een uitspraak over de werkelijkheid. Voor een (natuurlijk) Persoon heeft geboorteDatum kardinaliteit 1. (iedere persoon heeft precies één geboortedatum).
Op MIM 3 niveau zou ik dit interpreteren als een uitspraak over de geregistreerd: 1 betekent dan dat voor iedere geregistreerde persoon óók de geboortedatum is geregistreerd. Op dat niveau kan ook 0..1 worden aangegeven. Dan hoeft de registratie op die eigenschap niet volledig te zijn.

@PalmJanssen
Copy link
Contributor

PalmJanssen commented Oct 14, 2021

Lever drie voorbeelden:
SHACL: Pano
XSD: Lennart
OCL: Paul

@pmaria
Copy link
Contributor

pmaria commented Oct 14, 2021

Ik had het mis. In SHACL wordt dit wel ondersteund. Er wordt dezelfde terminologie gebruikt als in XML Schema.

  • minInclusive - minInclusive is the ·inclusive lower bound· of the ·value space· for a datatype with the ·ordered· property. The value of minInclusive ·must· be in the ·value space· of the ·base type·.
  • maxInclusive - maxExclusive is the ·exclusive upper bound· of the ·value space· for a datatype with the ·ordered· property. The value of maxExclusive ·must· be in the ·value space· of the ·base type· or be equal to {value} in {base type definition}.
  • minExclusive - minExclusive is the ·exclusive lower bound· of the ·value space· for a datatype with the ·ordered· property. The value of minExclusive ·must· be in the ·value space· of the ·base type· or be equal to {value} in {base type definition}.
  • maxExclusive - maxExclusive is the ·exclusive upper bound· of the ·value space· for a datatype with the ·ordered· property. The value of maxExclusive ·must· be in the ·value space· of the ·base type· or be equal to {value} in {base type definition}.

Dit aspect kan in XML Schema voorkomen op:

  • decimal
  • float
  • double
  • duration
  • dateTime
  • time
  • gYearMonth
  • gYear
  • gMonthDay
  • gDay
  • gMonth
  • integer (en subtypes)

In SHACL worden deze aspecten met dezelfde term geduid.

Bijv. als je wilt uitdrukken dat leeftijd >= 10 en <= 21 moet zijn:

[
  sh:property [
    sh:path ex:leeftijd ;
    sh:minInclusive 10 ;
    sh:maxInclusive 21 ;
  ]
]

In theorie belemmert SHACL niet op welke datatypes je dit zou kunnen gebruiken. In de praktijk gebruiken alle SHACL implementaties onder water SPARQL.

In SPARQL kan dit standaard ondersteund worden voor:

  • xsd:decimal
  • xsd:float
  • xsd:double
  • xsd:dateTime
  • xsd:integer (en subtypes)

@dkrijtenburg-GNM dkrijtenburg-GNM added the 1.1.1 Issue meenemen in versie 1.1.1 label Oct 26, 2021
@lennartvanbergen
Copy link
Collaborator

lennartvanbergen commented Oct 26, 2021

@wilkoquak weet jij een ISO standaard hiervoor analoog aan GM interfaces zoals Surface en GML/GeoJSON? Of is het echt: zie XML (XML voel te technisch)?

@kad-mesdat
Copy link
Contributor

Ik kon het niet laten om het even op te zoeken. Ik zat nog te denken aan de interval notatie van de wiskunde:

Bij een open interval tellen de grenzen niet mee. Een open interval noteren we als: ⟨a,b⟩. Bij het tekenen van een open interval op een lijn gebruiken we open bolletjes. Als je bijvoorbeeld alle getallen van 3 tot 5 wil tekenen zonder dat 3 en 5 zelf hierbij meetellen, dan gebruik je ⟨3,5⟩

intervallen en stijgingen en dalingen

Gesloten interval

Bij een gesloten interval tellen de grenzen wel mee. Een gesloten interval noteren we als: [a,b]. Bij het tekenen van een open interval op een lijn gebruiken we in gekleurde bolletjes. Als je alle getallen van 3 tot 6 wil weergeven en dat ze zelf ook meetellen, dan gebruik je [3,6]

Dat kun je heel mooi mappen op:

  • minInclusive '['
  • minExlusive '<'
  • maxInclusive ']'
  • maxExclusive '>'

Meerdere bereiken kun je dan scheiden met een puntkomma dus: [2,4];[6-8]

@wilkoquak
Copy link
Member

Ik heb nog geen ISO standaard gevonden die hier iets over zegt. Ik moet zeggen dat ik zelf wel blij ben met de manier waarop het semantisch in Shacl en XML-Schema zit. Qua syntax vind ik de wiskundige notatie zoals hierboven ook wel mooi!

@pmaria
Copy link
Contributor

pmaria commented Dec 21, 2021

Nog te doen:

  • toelichtingen bij beschrijving metagegevens
  • bepalen en beschrijven icm welke datatypes dit gebruikt kan worden
  • tekstuele beschrijving LD transformatie
  • validatie LD transformatie

Voorstel

Toevoeging aan 2.8.2 Specificatie metagegevens modelelementen

Metagegeven Minimumwaarde inclusief

Definitie: Minimumwaarde inclusief

Minimumwaarde inclusief (<=) is de ondergrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, inclusief die waarde zelf. De minimumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

Toelichting

Bijvoorbeeld de minimale waarde voor een geldigheidsdatum.

Toepassing

Gebruik op attribuutsoorten en data elementen met een primitief datatype van het type:

  • Integer
  • Decimal
  • Float
  • Real
  • DateTime
  • Date

Een modelelement mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben.

Metagegeven Minimumwaarde exclusief

Definitie: Minimumwaarde exclusief

Minimumwaarde exclusief (<) is de ondergrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, exclusief die waarde zelf. De minimumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

Toelichting

Bijvoorbeeld de minimale inhoud van een bouwwerk.

Toepassing

Gebruik op attribuutsoorten en data elementen met een primitief datatype van het type:

  • Integer
  • Decimal
  • Float
  • Real
  • DateTime
  • Date

Een modelelement mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben.

Metagegeven Maximumwaarde inclusief

Definitie: Maximumwaarde inclusief

Maximumwaarde inclusief (>=) is de bovengrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, inclusief die waarde zelf. De maximumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

Toelichting

Bijvoorbeeld de minimale waarde voor een geldigheidsdatum.

Toepassing

Gebruik op attribuutsoorten en data elementen met een primitief datatype van het type:

  • Integer
  • Decimal
  • Float
  • Real
  • DateTime
  • Date

Een modelelement mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben.

Metagegeven Maximumwaarde exclusief

Bijvoorbeeld de maximale waarde voor de leeftijd van een persoon.

Definitie: Maximumwaarde exclusief

Maximumwaarde exclusief (>) is de bovengrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, exclusief die waarde zelf. De maximumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

Toelichting

Bijvoorbeeld de maximale waarde voor een geldigheidsdatum.
TODO

Toepassing

Gebruik op attribuutsoorten en data elementen met een primitief datatype van het type:

  • Integer
  • Decimal
  • Float
  • Real
  • DateTime
  • Date

Een modelelement mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben.


Toevoeging aan 3.2.1 Modellering metagegevens voor objecten en attributen in UML

Bij Specificatie voor «Attribuutsoort»

Aspect Kardinaliteit Toelichting In UML 2.5 in EA
Minimumwaarde inclusief 0..1 Algemeen metagegeven. Een attribuutsoort mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben. Tagged value
Minimumwaarde exclusief 0..1 Algemeen metagegeven. Een attribuutsoort mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben. Tagged value
Maximumwaarde inclusief 0..1 Algemeen metagegeven. Een attribuutsoort mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben. Tagged value
Maximumwaarde exclusief 0..1 Algemeen metagegeven. Een attribuutsoort mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben. Tagged value

3.2.4 Specificatie metagegevens voor datatypen

Toevoeging aan 3.2.4 Specificatie metagegevens voor datatypen

Bij Specificatie voor «Attribuutsoort»

Aspect Kardinaliteit Toelichting In UML 2.5 in EA
Minimumwaarde inclusief 0..1 Algemeen metagegeven. Een data element mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben. Tagged value
Minimumwaarde exclusief 0..1 Algemeen metagegeven. Een data element mag maar één voorkomen van metagegeven Minimumwaarde inclusief of Minimumwaarde exclusief hebben. Tagged value
Maximumwaarde inclusief 0..1 Algemeen metagegeven. Een data element mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben. Tagged value
Maximumwaarde exclusief 0..1 Algemeen metagegeven. Een data element mag maar één voorkomen van metagegeven Maximumwaarde inclusief of Maximumwaarde exclusief hebben. Tagged value

Toevoeging aan 6.4.2 Gebruikte functies:

Functie Specificatie
t:cast Transformeert het datatype van een waarde naar het gegeven datatype. Deze functie verwacht twee parameters: t:cast(?waarde, ?datatype). De ?waarde parameter is de waarde waarvoor een datatype gezet moet worden. ?dataype is het datatype wat ?waarde moet krijgen. Op basis van ?datatype bepaalt deze functie het juiste datatype om te zetten.

**Toevoeging aan 4.3 Nadere specificatie metagegevens in LD

MIM metagegeven Meta-eigenschap in RDF RDF type Grondslag
Minimumwaarde inclusief mim:minimumwaardeInclusief owl:DatatypeProperty grondslag
Minimumwaarde exclusief mim:minimumwaardeExclusief owl:DatatypeProperty grondslag
Maximumwaarde inclusief mim:maximumwaardeInclusief owl:DatatypeProperty grondslag
Maximumwaarde exclusief mim:maximumwaardeExclusief owl:DatatypeProperty grondslag

Toevoeging aan 4.3.1 Modellering metagegevens voor objecten en attributen in LD:

bij Specificatie voor mim:Attribuutsoort

MIM metagegeven Meta-eigenschap in RDF Kardinaliteit Datatype of Klasse
Minimumwaarde inclusief mim:minimumwaardeInclusief 0..1 tekst
Minimumwaarde exclusief mim:minimumwaardeExclusief 0..1 tekst
Maximumwaarde inclusief mim:maximumwaardeInclusief 0..1 tekst
Maximumwaarde exclusief mim:maximumwaardeExclusief 0..1 tekst

bij Specificatie voor mim:DataElement

MIM metagegeven Meta-eigenschap in RDF Kardinaliteit Datatype of Klasse
Minimumwaarde inclusief mim:minimumwaardeInclusief 0..1 tekst
Minimumwaarde exclusief mim:minimumwaardeExclusief 0..1 tekst
Maximumwaarde inclusief mim:maximumwaardeInclusief 0..1 tekst
Maximumwaarde exclusief mim:maximumwaardeExclusief 0..1 tekst

Toevoeging aan 6.4.9 Properties

transformatie: Minimumwaarde inclusief

De ondergrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, inclusief die waarde zelf. De minimumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

De mim:minimumwaardeInclusief wordt vertaald naar sh:minInclusive. De datatype van de waarde van sh:minInclusive wordt afgeleid op basis van het primitief datatype wat het mim:type is van het modelelement waarvoor de mim:minimumwaardeInclusief gespecificeerd is.

CONSTRUCT {
  ?propertyshape sh:minInclusive ?minInclusive.
}
WHERE {
  ?modelelement mim:minimumwaardeInclusief ?minimumwaardeInclusief .
  ?modelelement mim:type ?datatype .
  ?propertyshape mim:equivalent ?modelelement .
  ?datatype a mim:PrimitiefDatatype .
  bind(t:cast(?minimumwaardeInclusief, ?datatype) as ?minInclusive)
}

transformatie: Minimumwaarde exclusief

De ondergrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, exclusief die waarde zelf. De minimumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

De mim:minimumwaardeExclusief wordt vertaald naar sh:minExclusive. De datatype van de waarde van sh:minExclusive wordt afgeleid op basis van het primitief datatype wat het mim:type is van het modelelement waarvoor de mim:minimumwaardeExclusief gespecificeerd is.

CONSTRUCT {
  ?propertyshape sh:minExclusive ?minExclusive.
}
WHERE {
  ?modelelement mim:minimumwaardeExclusief ?minimumwaardeExclusief .
  ?modelelement mim:type ?datatype .
  ?propertyshape mim:equivalent ?modelelement .
  ?datatype a mim:PrimitiefDatatype .
  bind(t:cast(?minimumwaardeExclusief, ?datatype) as ?minExclusive)
}

transformatie: Maximumwaarde inclusief

De bovengrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, inclusief die waarde zelf. De maximumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

De mim:maximumwaardeInclusief wordt vertaald naar sh:maxInclusive. De datatype van de waarde van sh:maxInclusive wordt afgeleid op basis van het primitief datatype wat het mim:type is van het modelelement waarvoor de mim:maximumwaardeInclusief gespecificeerd is.

CONSTRUCT {
  ?propertyshape sh:maxInclusive ?maxInclusive.
}
WHERE {
  ?modelelement mim:maximumwaardeInclusief ?maximumwaardeInclusief .
  ?modelelement mim:type ?datatype .
  ?propertyshape mim:equivalent ?modelelement .
  ?datatype a mim:PrimitiefDatatype .
  bind(t:cast(?maximumwaardeInclusief, ?datatype) as ?maxInclusive)
}

transformatie: Maximumwaarde exclusief

De bovengrens van het waardebereik voor een attribuutsoort of data element getypeerd met een primitief datatype, exclusief die waarde zelf. De maximumwaarde moet van hetzelfde primitieve datatype zijn als het datatype van het modelelement waar het voor geldt.

De mim:maximumwaardeExclusief wordt vertaald naar sh:maxExclusive. De datatype van de waarde van sh:maxExclusive wordt afgeleid op basis van het primitief datatype wat het mim:type is van het modelelement waarvoor de mim:maximumwaardeExclusief gespecificeerd is.

CONSTRUCT {
  ?propertyshape sh:maxExclusive ?maxExclusive.
}
WHERE {
  ?modelelement mim:maximumwaardeExclusief ?maximumwaardeExclusief .
  ?modelelement mim:type ?datatype .
  ?propertyshape mim:equivalent ?modelelement .
  ?datatype a mim:PrimitiefDatatype .
  bind(t:cast(?maximumwaardeExclusief, ?datatype) as ?maxExclusive)
}

@lennartvanbergen
Copy link
Collaborator

Graag matchen op deze:

https://docs.geostandaarden.nl/mim/def-st-mim-20201023/#primitive-datatypes

Bij twijfel (vanwege laatste behandeldag voor bevriezen release inhoud) een type nog even weglaten, kan later worden toegevoegd. Bv. GM types en Boolean nog even niet.

@lennartvanbergen
Copy link
Collaborator

Definitie:
bevat attribuutsoort en data element
en bevat getypeerd met een primitief datatype

@pmaria
Copy link
Contributor

pmaria commented Dec 21, 2021

@architolk zou jij voor #109 (comment) kunnen beoordelen of de beschreven transformatie zo duidelijk is?

@architolk
Copy link
Contributor Author

@pmaria : transformatie helemaal duidelijk, en lijkt me ook helemaal goed zo. Prima om deze door te voeren.

@PalmJanssen PalmJanssen removed the 1.1.1 Issue meenemen in versie 1.1.1 label Jan 25, 2022
@PalmJanssen
Copy link
Contributor

@pmaria @architolk @dkrijtenburg-GNM @lennartvanbergen-kadaster

Deze zit nog niet in done kolom en wordt niet meegenomen voor v 1.1.1.
Blijft staan voor 1.1.2

@pmaria
Copy link
Contributor

pmaria commented Jan 25, 2022

Met de review van @architolk kan hij denk ik nu naar done. Prima om met 1.1.2 mee te nemen wat mij betreft.

@dkrijtenburg-GNM dkrijtenburg-GNM added y-issue MINOR-versie: nieuwe functionaliteit achterwaarts compatibel 1.2 Issue meenemen in versie 1.2 labels Nov 16, 2022
@pmaria
Copy link
Contributor

pmaria commented Jan 18, 2023

@pmaria maakt een PR

@ArjanLoeffen
Copy link

Twee vragen:

  1. Waarom worden mix/max grenzen niet toegestaan op primitieve datatypen? Bijv. Leeftijd >= 0.
  2. Waarom worden gezet min/max grenzen gespecificeerd op referentie elementen? En als dat verklaarbaar is, waarom dan niet op codelijst?

Dit in het kader van Imvertor/Imvertor-Maven#448

@PalmJanssen
Copy link
Contributor

MIM 1.2 stelt het zoals het nu gesteld wordt. Dat zou ik aanhouden. Daarnaast blijft het een valide issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
1.2 Issue meenemen in versie 1.2 aanvulling Nieuwe functionaliteit of verzoek prio3 Onbelangrijk, maar urgent y-issue MINOR-versie: nieuwe functionaliteit achterwaarts compatibel
Projects
Status: Verwerkt in documentatie
Development

Successfully merging a pull request may close this issue.