Metadata in SensorThings - kwalificaties van wat er gemeten is

We zijn bezig met het opzetten van een datauitwisselingsformaat (https://www.csdif.info) op basis van SensorThings en SensorML. Het doel is om meetgegevens van allerlei community/citizen science initiatieven beter uitwisselbaar te maken, voorzien van rijke metadata over gebruikte sensoren, methodes, meetopstelling, etc. We hebben deze zomer een eerste ruw voorstel geschreven en zijn nu bezig met een proof-of-concept-implementatie om te kijken waar we tegen aan lopen. In deze post wil ik één van die dingen aan jullie voorleggen, op zoek naar input en praktijkervaring op dit gebied.

Binnen SensorThings/STA (en OGC O&M) bestaat er het concept “ObservedProperty” om aan te geven wat een observatie/meting precies geobserveerd heeft. Binnen STA ziet dat er bijvoorbeeld zo uit:

      {
         "name":"temperature",
         "definition":"http://qudt.org/vocab/quantitykind/Temperature",
         "description":"Temperature",
      },

Hierbij zou volgens mij de “definition” leidend moeten zijn, de “name” en “description” zij bedoeld voor weergave, maar zouden de betekenis van de ObservedProperty niet moeten veranderen.

Voor die definition kun je diverse URIs gebruiken, het systeem van QUDT quantityKinds leek ons hier het meest compleet en stabiel. Echter, als we deze quantityKinds gebruiken, missen we nog wel informatie en context over wat er gemeten wordt. Twee voorbeelden waar we tegen aan lopen:

  1. Hierboven wordt aangegeven dat er temperatuur gemeten wordt, maar wat voor temperatuur is dat? Is dat de luchttemperatuur? Watertemperatuur? Bodemtemperatuur? Temperatuur in een opslagtank? Etc.
  2. We meten ook fijnstof (particulate matter), en gebruiken hiervoor nu definition="https://qudt.org/vocab/quantitykind/MassDensity", maar het is relevant om aan te geven dat het gaat om deeltjes van een bepaalde maat. De gangbare term daarvoor is bijv PM10 voor deeltjes tot 10μm diameter, maar in QUDT kan ik daar niets voor terugvinden.

Mogelijk dat deze twee voorbeelden niets met elkaar te maken hebben en verschillende oplossingen hebben, maar in de basis gaat het in beide gevallen om kwalificeren wat er precies gemeten is.

We kunnen niet de eerste zijn die hier tegenaan loopt, dus hoe lossen andere mensen en systemen dit op (icm SensorThings of wellicht andere OGC-gerelateerde standaarden die ook uitgaan van een vergelijkbaar datamodel)?

Een aantal oplossingen die we voor ons zouden zien:

  1. Een andere ontologie dan QUDT zoeken die dit soort kwalificaties expliciet maakt in de gebruikte termen. Dit wordt bijvoorbeeld gedaan in het samenmeten platform van het RIVM, daar gebruiken ze bijvoorbeeld “https://www.eea.europa.eu/help/glossary/eea-glossary/pm10”. Dit is pragmatisch, maar leidt mogelijk wel tot een ratjetoe aan verschillende ontololgieën als je voor alles gaat rondshoppen naar waar iets gedefinieerd is. En het is weinig generiek: Het is gebruikelijk dat er gemeten wordt in bijvoorbeeld PM1, PM2.5, PM4 en PM10, maar er is niets dat me er van weerhoudt om een PM8-sensor te maken en die data te willen bewaren, dus een generiekere oplossing zou wellicht de voorkeur hebben.
  2. Als variant op de vorige optie zouden we onze eigen ontologie kunnen definieren voor alles, maar dat is veel werk en beperkt uitwisselbaar met bestaande datasets. Eventueel kunnen we dit alleen doen voor termen die we tekort komen.
  3. Door middel van parameters extra kwalificaties toevoegen aan de URIs, bijvoorbeeld https://qudt.org/vocab/quantitykind/MassDensity#pm_size=10 of https://qudt.org/vocab/quantitykind/MassDensity?pm_size=10. Dit heeft als voordeel dat de kwalificatie op een generieke manier in de URI verwerkt is (en consumenten die gewoon matchen op URI zien verder geen verschil). Echter, dit zou ik alleen willen gebruiken als de ontologie die de basis-uri definieert, ook specificeert wat voor parameters er toegevoegd kunnen worden en wat hun betekenis is. Zijn er ontologieën die dit doen?
  4. Op een andere plek in het datamodel deze kwalificaties toevoegen. Voor het onderscheid tussen bijv “luchttemperatuur” en “watertemperatuur” zou het wellicht zuiver zijn om dat als eigenschap van de “FeatureOfInterest” te modelleren. Echter, in SensorThings is “FeatureOfInterest” gereduceerd tot een (GeoJSON) locatie en is het me niet duidelijk of het gangbaar is daar nog dit soort extra attributen aan toe te voegen. Een andere plek zou kunnen zijn in de (SensorML) beschrijving van het Sensor Object, of wellicht in het “parameters” veld van de Observations (wat bedoeld is als parameters aan de “ombserving procedure” denk ik, dus wellicht niet helemaal de goede plek aangezien alle observations in de datastream dezelfde parameters zullen hebben).

Ik hoor graag jullie ideeën en ervaringen!

Hallo Matthijs,

Geen ervaring specifiek met deze materie, maar na je post te hebben gelezen twee observaties:

  1. Het is niet alleen essentieel om aan te geven wat er gemeten is, maar ook om aan te geven in welke eenheid dat gemeten is. Voor temperatuur bijvoorbeeld maakt het nogal een verschil of je in Kelvin, Fahrenheit of Celsius de waarden terug geeft. Voor fijnstofmetingen niet alleen de parts per volume, maar ook volume-eenheid, en eenheid van het fijnstof. Dus uit de Temperature-definitie moet m.i. minstens de qudt:applicableUnit toegevoegd zijn (tenzij die elders in het schema is opgenomen - maar hij mag niet missen, anders heb je niks aan eventuele waarden).

Zeer zeker is het gangbaar om attributen aan GeoJSON toe te voegen. Via geojson.org kun je RFC 7946 vinden uit 2016, waar GeoJSON beschreven word. Inclusief de definities van geometrie en eigenschappen (properties). En dat in die RFC gezegd word dat GeoJSON altijd in WGS 84 zou moeten zijn, kun je met een korreltje zout nemen: GeoJSON kan uitstekend in RD gevormd worden, en de meeste GIS- en (web-)Mapping software kan daar prima mee overweg.

En als laatste:

Dat lijkt mij geen goed idee, omdat je dan (zoals je zelf ook al aangeeft) uitwisselbaarheid opoffert. Terwijl er ruimte genoeg lijkt te zijn voor specifieke zaken, voor zover ik dat kan beoordelen zonder me er al te veel in te verdiepen.

Dank voor je reactie, ik reageer hieronder even.

Absoluut, maar daar heeft SensorThings aparte attributen voor, dus dat staat even los van dit topic (ik heb over het gebruik van UCUM-definities voor units in SensorThings ook nog wel wat vragen, maar die zal ik wellicht later apart nog wel eens stellen).

Ja, dat het mag volgens GeoJSON had ik al wel gevonden, maar de grote vraag is: Gebeurt het in de praktijk? En zijn er dan nog aanvullende standaarden over welke properties je kunt toevoegen (want wederom: We kunnen onze eigen properties verzinnen, maar dat is niet ideaal voor de uitwisselbaarheid).

Hoi Matthijs,

Als ik Observations, measurements and samples goed lees dan staat er: An ObservableProperty shall be defined as a quality (property, characteristic) of the feature-of-interest that can be observed.
Oftewel, ObservableProperty is een eigenschap van het ‘ding wat je meet’.

De Observation zelf heeft een eigenschap UoM: The Observation shall provide a unit of measure (UoM) if the result is measurable. If the UoM is not contained in the result, it shall be provided in the context of the Observation ; the provision modality is to be defined by communities.
Volgens mij wil je daar de relatie naar QUDT leggen.

In een van de voorbeelden van de Semantic Sensor Network Ontology zie je dat ook mooi terug:

<observation/1087>  rdf:type               sosa:Observation ;
  rdfs:label "observation #1087"@en ;
  sosa:hasFeatureOfInterest  <tree/124> ;
  sosa:observedProperty  <tree/124/height> ;
  sosa:madeBySensor <rangefinder/30> ;
  sosa:hasResult [ 
    qudt-1-1:unit qudt-unit-1-1:Meter ; 
    qudt-1-1:numericalValue "15.3"^^xsd:double ] .

# using SSN, one can explicitly link a property and its feature of interest.
 
<tree/124>  rdf:type    sosa:FeatureOfInterest ;
  rdfs:label "tree #124"@en ;
  ssn:hasProperty <tree/124#height> .

<tree/124#height>  rdf:type    sosa:ObservableProperty , ssn:Property ;
  rdfs:label "the height of tree #124"@en ;
  ssn:isPropertyOf <tree/124> .

De observatie heeft een observedProperty ‘height’ en een FeatureOfInterest (‘tree/124’) een een hasResult met een qudt unit en value.
(Semantic Sensor Network Ontology)

Hallo Matthijs, goed iniatief!

Paar comments/ideeen:

  • Qgis heeft sinds laatste versies een STA module beschikbaar, dat betekent dat je een STA service tegenwoordig aardig kunt visualiseren in QGIS
  • In jouw geval lijk je vooral het STA model te willen gebruiken in een rdf context, ik draai zelf wat experimenten om CSV data als SOSA (of schema.org/observation) te ontsluiten middels csvwlib soilwise-ontology/data-models/CSVW at main · soilwise-he/soilwise-ontology · GitHub
  • voor het beschrijven van de gemeten property (bij voorkeur als een uri uit een vocabulary, denk bv aan INSPIRE registry) is het i-adopt framework interessant, welke een property uitpakt in een chemical substance en in medium gemeten is, etc (eg aluminium, measured in water, …).
  • qudt is enkel voor de unit, OMS biedt voldoende ruimte om ook andere aspecten van de observatie te vangen, Observation - Schema.org Type is overigens ook behoorlijk compleet tegenwoordig
  • In ons geval (bodem data) is ook de gebruikt methode belangrijk, OMS biedt mogelijkheden om ook de gebruikte methode te refereren.
  • de featureofinterest is inderdaad een beetje een uitdagend concept (in ons geval, de bodem sample komt van 30cm diep, van een bodemprofiel op locatie x,y), in de OMS community stellen ze momenteel voor om een soort hierarchy te bouwen met featureofinterest en ultimate-featureofinterest. het voorbeeld wat ze vaak gebruiken, een sample uit de maag van een vis, die in een rivier zwemt, die door een berg gevoed wordt…

Dank voor jullie reacties, ik reageer hieronder even.

Correct. In die interpretatie zou voor het fijnstof voorbeeld “PM2.5” de eigenschap zijn die je meet (dus niet “fijnstofconcentratie”, maar “fijnstofconcentratie met deeltjes grote <= 2.5μm”), maar dan blijft de vraag: Welke definition URL gebruik je hiervoor?

In het voorbeeld “luchttemperatuur” vs “watertemperatuur” zou denk ik “temperatuur” de ObservedProperty zijn, en “water” of “lucht” het “ding wat je meet”. In SensorThings zou dat de “FeatureOfInterest” zijn, maar als ik kijk naar hoe SensortThings de FeatureOfInterest definieert, dan lijkt dat vooral gericht op de locatie van de meting. In principe is het “feature” veld generiek (via een encodingType kun je daar van alles in stoppen), maar de enige waarde die ze definieren en de enige voorbeelden die ze geven zijn voor het gebruik van een GeoJSON waarde, en dat is (kijkende naar de GeoJSON spec) vooral alleen een locatie.

Dus dan is de vraag: Hoe kun je binnen de FeatureOfInterest het concept “lucht” of “water” op een duidelijke (machine-readable) manier opschrijven? Is er een bestaande conventie om dit soort dingen aan GeoJSON toe te voegen?

Daarnaast: In SensorThings worden alle Observations met dezelfde ObservedProperty gegroepeerd in een Datastream (dus ObservedProperty is een eigenschap van Datastream), maar de FeatureOfInterest is een eigenschap van een Observation (dit is logisch omdat een sensor kan verplaatsen), dus als je lucht/water via de FeatureOfInterest uitdrukt, zou je binnen 1 datastream kunnen wisselen tussen luchttemperatuur en watertemperatuur. Dat lijkt me niet helemaal handig.

Binnen SensorThings is de UoM niet direct aan de Observation gekoppeld, maar via Datastream, maar dat stuk is wel helder. Daar heeft QUDT idd ook prima definities voor, hoewel ik ook zie dat UCUM in deze context gebruikt wordt en mogelijk nog iets universeler is.

Ja, ik heb het idee dat de observedproperty / featureofinterest concepten uit O&M in SSN (en ook in het gerelateerde Connected Systems) iets helderder zijn overgenomen, maar wij zijn vooralsnog bezig om op SensorThings te bouwen (we hebben ook naar CS gekeken, maar daar is de specificatie enorm complex en verdeeld over een dozijn documenten, wat voor sommige burgerwetenschappers een flinke drempel zou kunnen opwerpen).

Oh, goede tip, daar ga ik eens naar kijken.

Wat bedoel je hier precies mee? Ik ben niet enorm bekend met RDF, maar volgens mij gebruiken we het nergens? Wat zie je dat je dit doet denken?

Ah, dat zijn goede tips. Als ik zo even kijk naar INSPIRE, dan zitten daar wel nuttige dingen tussen, maar het lijkt niet direct gericht op observational data, meer op kaart data (en als ik kijk naar de verschillende registers dan is het me ook niet direct duidelijk wat ik waar zou moeten zoeken.

i-adopt lijkt idd precies bedoeld om de observedproperty te modeleren die ik wil beschrijven. Echter:

  • Is het me niet helemaal duidelijk hoe je zo’n model (bestaande uit een variabele, constraints, etc.) vervolgens serialiseerd naar een tekst/JSON/rdf/whatever beschrijving die je vervolgens in je SensorThings data kunt verwerken. Als ik de step-by-step guide lees, dan is het idee ook dat je niet het model direct gebruikt, maar dat je ergens een IRI definieert voor de specifieke property die je wil uitdrukken (“concentration of endosulfan sulfate in wet flesh of ostrea edulis” in hun voorbeeld) en dat je dan die IRI gebruikt. Maar hoe en waar je dan vervolgens (in termen van i-adopt) beschrijft wat die IRI betekent, dat zie ik ook weer nergens terug.
  • Ze hebben ook een lijst van bestaande terminologieen, maar dat lijkt vooral te verwijzen naar allerlei externe lijsten, die verder niet (duidelijk) gebruik maken van i-adopt (maar misschien zijn dit gewoon generieke lijsten van termen die je kunt gebruiken binnen een i-adopt uitdrukking?).

Weet je misschien nog een goede introductie over i-adopt en hoe je dat in de praktijk kunt toepassen?

Dat lijkt me niet correct: QUDT staat voor “Quantities, Units, Dimensions and Data Types”, dus is breder dan alleen units. Wel lijkt het dat de QuantityKind termen die ze definieren dus niet gedetailleerd genoeg zijn voor onze toepassing, dus misschien is het niet de beste vocabulaire om te gebruiken.

Als ik het goed zie is dat alleen een relationele structuur voor observations, properties, etc., maar definieert het geen termen voor specifieke properties (waar ik vooral naar op zoek ben)? Dus dit schema zou bruikbaar zijn als alternatief voor het SensorThings datamodel en API waar ik nu mee bezig ben, maar niet in aanvulling op?