...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
Tabel 3: Oversigt over registre med adgangsbegrænsede data.
...
...
...
...
...
...
...
...
...
...
...
...
Datatyper
...
Understøttede operatorer
...
...
...
...
...
...
...
Boolean
...
...
...
...
Datatyper | Understøttede operatorer | PostGis Link |
Geometri | contains(koordinatsystem, geometri) | https://postgis.net/docs/ST_Contains.html |
| covers(koordinatsystem, geometri) | https://postgis.net/docs/ST_Covers.html |
| coveredBy(koordinatsystem, geometri) | https://postgis.net/docs/ST_CoveredBy.html |
| crosses(koordinatsystem, geometri) | https://postgis.net/docs/ST_Crosses.html |
| intersects(koordinatsystem, geometri) | https://postgis.net/docs/ST_Intersects.html |
| within(koordinatsystem, geometri) | https://postgis.net/docs/ST_Within.html |
| overlaps(koordinatsystem, geometri) | https://postgis.net/docs/ST_Overlaps.html |
| touches(koordinatsystem, geometri) | https://postgis.net/docs/ST_Touches.html |
...
Geometrisk operator | Omvendte operator |
contains | within |
covers | coveredBy |
coveredBy | covers |
crosses | Ingen. crosses er symmetrisk |
intersects | Ingen. intersects er symmetrisk |
within | contains |
overlaps | Ingen. overlaps er symmetrisk |
touches | Ingen. touches er symmetrisk |
...
Point POINT (3 5) Line LINESTRING (6 4, 8 2, 7 1) Polygon POLYGON (1 1, 3 3, 4 2, 4 0, 1 1) |
...
Der er to typer queries, som man kan udføre på bitemporale data:
- Interval-queries, hvor man ønsker data, der er bitemporalt gyldige i en bestemt tidsperiode.
- Point-in-time-queries, hvor man ønsker bitemporalt gyldige data pr. deres angivne tidspunkt.
...
Alle registre der understøtter bitemporal filtrering, understøtter filtrering på både virkningstidspunkt og registreringstidspunkt bortset fra CVR. CVR er det eneste register, hvor anvendere ikke kan specificere et registreringspunkt i deres query. For CVR sættes registreringstidspunktet derimod altid til tidspunktet for forespørgslen, dvs. "registreringstid = NOW()". Det er muligt at filtrere på virkningstidspunktet på sædvanlig vis.
...
GraphQL-tjenesterne understøtter paging af resultater. At resultaterne pagineres vil sige at resultaterne inddeles i "sider" og returneres én ad gangen. Anvendere vil således få én side returneret ad gangen og kan efterfølgende lave et nyt kald for at få næste side for på den måde at gennemgå hele datasættet.
Pagingen er cursor-baseret, hvilket vil sige at der returneres en reference, en såkaldt cursor, til første og sidste resultat (for edges ved hvert enkelt resultat) i det returnerede datasæt ved hvert kald. Denne cursor kan derefter bruges til at hente flere sider ved at anmode om mere data fra cursorens værdi. I praksis kan anvendere bruge cursor-værdien i en efterfølgende query, til at hente den næste side af data, startende fra den position, der er angivet ved den pågældende cursor. Paging er implementeret således at flere identiske anmodninger ved hjælp af den samme cursor vil returnere de samme data, forudsat at registrene ikke opdaterer de underliggende data i mellemtiden.
Paging er udelukkende implementeret som fremadgående paging. Det vil sige, at anvenderne kan hente den næste side af resultater fra en given cursor. Bagudgående paging understøttes ikke.
...
Paging består af tre datastrukturer: PageInfo samt nodes eller edges.
PageInfo indeholder metadata om den nuværende paging og består af følgende felter:
- hasNextPage: Dette felt angiver, om der er endnu en side med resultater.
- hasPreviousPage: Dette felt angiver, om der eksisterer en forrige side med resultater. Da vi ikke understøtter bagudgående pagination, er dette altid sat til false.
- startCursor: Dette felt er en cursor, der peger på det første datapunkt i resultatdatasættet.
- endCursor: Dette er en cursor, der peger på det sidste datapunkt i resultatsættet. Denne cursor kan bruges af anvenderen til at hente den næste side af data.
Mens metadata kan hentes via PageInfo, kan data hentes enten som en liste af nodes eller en liste af edges. Nodes og edges adskiller sig på følgende måde:
- I resultatsættet er nodes en liste af datapunkter.
- I resultatsættet er edges en liste af datapunkter med et ekstra metadatafelt: Cursoren, der matcher hver datapunkt.
Det anbefales, at anvendere benytter nodes til standard paginganmodninger, da PageInfo-metadataene er tilstrækkelige. Hvis anvenderne har brug for at paginere fra en hvilken som helst position på den aktuelle side og ikke fra slutningen af den aktuelle side, skal edges benyttes.
Det er tilladt for anvendere at specificere i deres GraphQL-queries, at de ønsker både nodes og edges returneret. Dette frarådes, da resultatsættet vil indeholde de samme data to gange.
...
Paging har to inputargumenter, der kan specificeres i en query:
- first: Dette argument angiver hvor mange resultater anvenderen ønsker returneret. Dette er sidestørrelsen og skal være et ikke-negativt tal. Hvis dette argument udelades fra query'en, returneres standardantallet af resultater.
- after: Dette argument angiver cursoren til det første datapunkt i det resulterende datasæt. Hvis dette argument udelades fra query'en, returneres den første side.
Hvis anvenderen angiver ugyldige værdier for nogen af disse argumenter, vil tjenesterne returnere en fejlmeddelelse, der informerer dem om, at de har angivet ugyldige pagingargumenter.
Standardantallet af resultater, der returneres hvis brugeren ikke har angivet en første værdi, er 100. Den maksimalt tilladte sidestørrelse er 1000, og hvis værdien af first er større end den maksimalt tilladte sidestørrelse returneres en fejlmeddelelse.
...
Wiki Markup |
---|
*"nodes": \[* |
...
...
...
I GraphQL-tjenesterne versioneres hvert register separat, og alle entiteter, der tilhører det samme register, versioneres under det samme versionsnummer som registret. Det vil sige, at DAR og BBR kan eksistere separat som DAR/v2 og BBR/v5. Men hvis BBR har en change til Bygning-entiteten i deres datamodel, vil alle entiteter i BBR blive opgraderet til BBR/v6, og BBR/v5 vil derefter efter en overgangsperiode blive udfaset.
...
Som en sikkerhedsforanstaltning og af performance-hensyn tilskrives hver query en cost. En cost er en beregnet talværdi der indfanger hvor kompleks og omkostningstung en given query er for Datafordeleren at processere. Costen udregnes inden en query processeres, hvorefter den pågældende query enten sendes videre i systemet eller bliver afvist hvorved anvenderen vil modtage en fejlmeddelselse der informerer om at query'en var for kompleks.
Udregningen af cost er blandt andet baseret på følgende specifikationer:
- Sidestørrelse: Størrelse på paging-siderne der returneres. Jo større sider, jo mere data returneres, hvilket giver en højere cost.
- Filtre: Antallet og type af filtre der benyttes i en query påvirker også costen. Jo flere filtre, jo højere cost. Derudover er geometri-filtre mere omkostningstunge og resulterer defor i en højere cost. Se evt. afsnit 2.4, 2.5 og 2.6 for en oversigt over de forskellige typer af filtre.
- Entiteter: Almindelige og store entiteter har forskellige omkostninger associeret med dem. Store entiteter er mere omkostningstunge end mindre entiteter.
- Felter: Forskellige typer felter har forskellige omkostninger. Geometrier og sammensatte Et sammensat felt er et felt der indeholder andre felter. felter er dyrere end almindelige felter.
Som anvender skal man ikke tage stilling til hvor omkostningstung en query er så længe den ikke overstiger den maksimale cost, i hvilket tilfælde den pågældende query vil blive afvist med en fejlbesked.
...
Hent Schema
Hent Schema |
|
URL | https://graphql.datafordeler.dk/<register>/<version>/schema |
HTTP-metode | GET |
Headere i forespørgsel | Content-Type: application/json |
Returværdier |
|
Adgang | Tjenestebruger med brugernavn og password, IT-system med API-nøgle, OAuth Shared Secret eller OAuth Certifikat. |
Parametre
Navn | Type | Beskrivelse | Obligatorisk? |
Register | String | Angiver hvilket register det pågældende skema skal hentes for.
| Ja |
Version | String | Angiver hvilken version af datamodellen det pågældende register skal være. | Ja |
Returværdier
Denne tjeneste returnerer altid en fil ved HTTP 200 – OK. Filen indeholder et GraphQL-schema med metadata om GraphQL-tjenesten, der beskriver hvilke entiteter der findes for det pågældende register og hvordan data fra disse hentes.
Eksempler på brug af tjenesten
Hent skema for DAGI med versionsnummer v2 ved brug API-nøgle:
Send query
...
Send query
...
...
URL
...
https://graphql.datafordeler.dk/<register>/<version>
...
HTTP-metode
...
GET & POST
...
Headere i forespørgsel
For POST-requests:
...
Body
For GET-requests:
...
Returværdier Returværdierne for HTTP-statuskoderne afhænger af hvilken Accept-header der specificeres. Disse værdier er hvis Accept-headeren ikke er angivet som beskrevet i "Headere i forespørgsel".
...
- Returnerer HTTP 200 – OK, ved succes.
- Returnerer HTTP 400 – Bad Request, ved angivelse af forkerte parametre.
- Returnerer HTTP 404 – Not Found, hvis den angivne ressource ikke kan findes.
- Returnerer HTTP 500 – Internal Server Error, hvis der er sket en ukendt fejl
...
Adgang
...
- Ikke-adgangsbegrænset data: IT-system med API-nøgle, OAuth Shared Secret eller OAuth Certifikat.
- Adgangsbegrænset data: IT-system med OAuth Shared Secret eller OAuth Certifikat og på en defineret IP-Allowlist og så skal IT-systemet have eksplicit godkendelse fra det pågældende register. Se afsnit 0 for yderligere information.
Parametre
Navn | Type | Beskrivelse | Obligatorisk? |
Register | String | Angiver hvilket register det pågældende skema skal hentes for.
| Ja |
Version | String | Angiver hvilken version af datamodellen det pågældende register skal være. | Ja |
Returværdier
Denne tjeneste returnerer et json-response ved HTTP 200 – OK.
Eksempler på brug af tjenesten
Hent de første 100 datapunkter fra entiteten DAR_Adresse fra version 1 af DAR ved at sende nedenstående query ved brug af API-nøgle til endepunktet:
...
...