This document describes the RDF Data Portal developed as part of the LandBook project. The LandBook project is part of LandPortal
Initial version
The LandBook project contains statistical data on land governance across the world.
The main sources of data are observations which have several dimensions, like the area (country or region), the time of the observation and the value.
The data portal follows the RDF Data Cube vocabulary where there are single observations with different dimensions grouped by slices and datasets.
A pictorial illustration of the main classes and relationships in the LandBook data portal is shown below. The prefixes employed are described in the namespaces section.
cex
http://purl.org/weso/ontology/computex#
dbpedia
http://dbpedia.org/resource/
dcterms
http://purl.org/dc/terms/
geo
http://www.w3.org/2003/01/geo/wgs84_pos#
org
http://www.w3.org/ns/org#
owl
http://www.w3.org/2002/07/owl#
qb
http://purl.org/linked-data/cube#
rdf
http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs
http://www.w3.org/2000/01/rdf-schema#
sdmxAttribute
http://purl.org/linked-data/sdmx/2009/attribute#
sdmx-code
http://purl.org/linked-data/sdmx/2009/code#
sdmx-concept
http://purl.org/linked-data/sdmx/2009/concept#
sdmx-subject
http://purl.org/linked-data/sdmx/2009/subject#
skos
http://www.w3.org/2004/02/skos/core#
time
http://www.w3.org/2006/time#
xsd
http://www.w3.org/2001/XMLSchema#
The base URI of the LandBook data is
http://data.landportal.info
.
Along this document {base}
refers to the previous URI.
lb
http://purl.org/weso/landbook/ontology#
For each entity we give a description, the URI template, an example and the Shape Expression. The complete Shape Expression is defined in this document which employs the Shape Expressions language. A simplified example is available here. It is possible to see the results of the validation using the FancyShExDemo
A single observation. Conceptually, an observation is the most basic unit of information. It is usually a cell value from an excel sheet although observations can be obtained from other sources.
We consider three main dimensions for each observation:
An observation has a numeric value cex:value
{base}/dataset/{datasetId}/observation/{observationId}where
{base} = Base URI for LandPortal {datasetId} = Dataset from which this observation has been obtained {observationId} = Id of this observation
<Observation> { a ( qb:Observation ) , cex:ref-area @<Area> # It can be a Country or a Region , cex:ref-indicator @<Indicator> # Indicator , cex:ref-time @<Time> # Time of observation: year, interval, etc. , cex:value xsd:double? # Value of the observation (if obsStatus is not missing) , cex:computation @<Computation> # Computation from which this observation has been obtained , dcterms:issued xsd:dateTime # timestamp , qb:dataSet @<DataSet> # Dataset to which an observation belongs , qb:slice @<Slice> # Slice to which this observation belongs , rdfs:label xsd:string # Pattern "Value of {Region} in {Time} for indicator {Indicator}"@en , sdmx-concept:obsStatus ( # Observation status codes obtained from: http://purl.org/linked-data/sdmx/2009/code sdmx-code:obsStatus-A # Normal sdmx-code:obsStatus-B # Break sdmx-code:obsStatus-E # Estimated sdmx-code:obsStatus-F # Forecast sdmx-code:obsStatus-I # Imputed sdmx-code:obsStatus-M # Missing sdmx-code:obsStatus-P # Provisional sdmx-code:obsStatus-S # Strike ) , lb:source @<Upload> }
:o1 a qb:Observation ; cex:ref-area :France ; cex:ref-time :year2013 ; cex:ref-indicator :hdi ; cex:value "2.3"^^xsd:double ; cex:computation cex:Raw ; dcterms:issued "2013-03-02T09:00:00"^^xsd:dateTime ; qb:dataSet :dataSet1 ; qb:slice :slice1 ; rdfs:label "Observation of Spain in 2013 for indicator hdi"@en ; sdmx-concept:obsStatus sdmx-code:obsStatus-A ; lb:source :upload1 .
Indicators are entities that provide specific information on the value of something.
For example, the Human development index is an indicator that provides information about the human development of a country.
Indicators can be simple or compound
URI Template
{base}/indicator/{indicatorId}
where
{base} = Base URI for Landbook
{indicatorId} = Id of this indicator
Schema
<Indicator> {
a ( cex:Indicator )
, lb:preferable_tendency ( cex:decrease cex:increase cex:irrelevant )
, lb:measurement @<Measurement>
, lb:last_update xsd:dateTime
, lb:starred xsd:boolean
, lb:topic @<Topic>
, lb:indicatorType shex:IRI
, rdfs:label xsd:string
, rdfs:comment xsd:string
}
Example
:hdi a cex:Indicator
; lb:preferable_tendency cex:decrease
; lb:measurement :measurement1
; lb:last_update "2014-04-04T11:50:18"^^xsd:dateTime
; lb:starred "true"^^xsd:boolean
; lb:topic :development
; lb:indicatorType lb:Simple
; rdfs:label "Human Development Index"@en
; rdfs:comment "Longer description of indicator Human Development Index"@en
.
A Slice is a grouping of observations.
{base}/dataset/{datasetId}/slice/{sliceId}where
{base} = Base URI for LandBook {datasetId} = Id of this slice's dataset {sliceId} = Id of this slice
<Slice> { a ( qb:Slice) , cex:ref-indicator @<Indicator> # Indicator of this slice , qb:dimension ( # Different types of dimensions in landbook. Can be: lb:Time # time varies lb:Area # area varies )? , qb:observation @<Observation>* # List of observations of this slice }
:slice1 a qb:Slice ; cex:ref-indicator :hdi ; qb:observation :o1, :o2 ; qb:dimension lb:Area ; qb:dataSet :dataSet1 .
A Dataset is a grouping of slices.
This concept is the same as the qb:DataSet concept from RDF Data Cube
{base}/dataset/{dataSetId}where
{base} = Base URI for Landbook {dataSetId} = Id of this dataSet
<DataSet>{ a ( qb:DataSet ) , lb:dataSource @<DataSource> , lb:license @<License> , qb:slice @<Slice>* # List of slices of this dataset , sdmx-concept:freq ( # Frequency. Codes from: http://purl.org/linked-data/sdmx/2009/code. # It can be: sdmx-code:freq-A # Annual sdmx-code:freq-S # Semester sdmx-code:freq-Q # Quarterly sdmx-code:freq-M # Monthly sdmx-code:freq-W # Weekly sdmx-code:freq-D # Daily sdmx-code:freq-B # Daily (business day) sdmx-code:freq-N # Minutely ) }
:dataSet1 a qb:DataSet ; sdmx-concept:freq sdmx-code:freq-A ; lb:dataSource :dataSource1 ; lb:license :license1 ; qb:slice :slice1 .
Countries and regions represent geographical areas.
Countries are represented by three main properties:
The iso-codes with 2 and 3 letters and their FAO URI Concept of a region. A region can be part of another region
Area
represents the common parts of both countries and regions:
Schema
<Area> {
a ( cex:Area )
, rdfs:label xsd:string
}
Countries
Schema
<Country> &<Area> {
lb:faoURI shex:IRI
, lb:iso2 xsd:string
, lb:iso3 xsd:string
, lb:is_part_of @<Region>?
, a (lb:Country)
}
URI Template
{base}/country/{countryCode}
where
{base} = Base URI for LandBook
{countryCode} = Iso-Code Alpha 3
Example
:France a cex:Area
; rdfs:label "France"@en
; lb:faoURI <http://www.fao.org/countryprofiles/index/en/?iso3=fra>
; lb:iso2 "FR"
; lb:iso3 "FRA"
; lb:is_part_of :Europe
.
Region
URI Template
{base}/region/{regionId}
where
{base} = Base URI for LandBook
{regionId} = Region Id
Schema
<Region> &<Area> {
lb:UNCode xsd:string
, lb:is_part_of @<Region>?
}
Example
:Europe a cex:Area
; rdfs:label "Europe"@en
; lb:UNCode "EU"
.
Represents some time. There are several types of values to represent time values like years, time intervals or instants.
{base}/time/{YYYY}or
{base}/time/{YYYY}-{YYYY}where
{base} = Base URI for LandBook {YYYY} = year (4 digits)
<Time> { a ( time:DateTimeInterval ) } <YearInterval> { & <Time> , time:hasBeginning xsd:dateTime, time:hasEnd xsd:dateTime, time:hasDateTimeDescription time:DateTimeDescription, } <MonthInterval> { & <Time> , time:hasBeginning xsd:dateTime, time:hasEnd xsd:dateTime, time:hasDateTimeDescription time:DateTimeDescription, } <Interval> { & <Time> , time:hasBeginning xsd:dateTime, time:hasEnd xsd:dateTime, }
:year2013 a time:DateTimeInterval ; time:hasBeginning :instant_2013_1_1 ; time:hasEnd :instant_2013_12_31 ; time:hasDateTimeDescription :year2013_desc . :year2013_desc a time:DateTimeDescription ; time:year "2013"^^xsd:gYear ; time:unitType time:unitYear . :instant_2013_1_1 a time:Instant ; time:inXSDDateTime "2013-01-01T00:00:00Z" . :instant_2013_1_1 a time:Instant ; time:inXSDDateTime "2013-01-01T00:00:00Z" .
Organization
{base}/organization/{orgId}where
{base} = Base URI for LandBook {orgId} = Organization Id
<Organization> { a ( org:Organization ) , rdfs:label xsd:string , org:identifier xsd:string , foaf:homepage shex:IRI , org:subOrganizationOf @<Organization>* , org:hasSubOrganization @<Organization>* }
:faostat a org:Organization ; rdfs:label "The statistics division of FAO"@en ; org:identifier "FAOSTAT" ; foaf:homepage <http://faostat.fao.org/> .
A source of data
{base}/datasource/{datasourceId}where
{base} = Base URI for LandBook {datasourceId} = Datasource Id
<DataSource> { a (lb:DataSource) , rdfs:label xsd:string , lb:organization @<Organization> , dcterms:creator @<User> , dcterms:description xsd:string? , dcterms:title xsd:string? }
:dataSource1 a lb:DataSource ; rdfs:label "Data source name"@en ; lb:organization :faostat ; dcterms:creator :john .
A user or agent that operates the system. It can be a person who uploads data to the system.
{base}/user/{userId}where
{base} = Base URI for LandBook {userId} = User Id
<User> { a ( # Type of users (Agent's or People) foaf:Agent # Agent could be some automatic web services foaf:Person # Person ) , rdfs:label xsd:string , foaf:name xsd:string # Name of user , foaf:account xsd:string? # Account of this user in the landportal , org:memberOf @<Organization>+ }
:john a foaf:Person ; rdfs:label "John Smith" ; foaf:name "John Smith" ; foaf:account "john" ; org:memberOf :faostat .
Represents an upload: a process by which some data has been uploaded into the system
{base}/upload/{uploadId}where
{base} = Base URI for LandBook {uploadId} = Upload Id
<Upload> { # Represents the process of uploading data into the system a ( lb:Upload ) , lb:user @<User> # User that uploaded the data , lb:timestamp xsd:dateTime # Timestamp , lb:ip xsd:string # IP address from which it has been uploaded , lb:observation @<Observation>* # List of observations that have been uploaded , lb:dataSource @<DataSource> # Data source }
:upload1 a lb:Upload ; lb:user :john ; lb:timestamp "2014-04-04T11:50:18"^^xsd:dateTime ; lb:ip "156.34.56.23" ; lb:observation :o1, :o2 ; lb:dataSource :dataSource1 .
Represents a catalog: a curated collection of metadata about datasets.
{base}/catalogwhere
{base} = Base URI for LandBook
<Catalog> { # Represents a catalog, a curated collection of metadata about datasets a ( dcat:Catalog ) , rdfs:label xsd:string # A label , foaf:homepage shex:IRI # The homepage of the catalog , dcterms:publisher shex:IRI # The publisher , dcat:dataset @<Dataset>* # Dataset included in this catalog }
:catalog a dcat:Catalog ; rdfs:label "The Land Portal catalog"@en ; foaf:homepage <http://landportal.info/data> ; dct:publisher <http://landportal.info> ; dcat:dataset :dataset1 .
The Landportal book data portal terms are defined in the following ontologies:
This section contains a list of common queries.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> select * where # Print every variable. In this case, only "topic". { ?topic rdf:type lb:Topic . # "topic" is of type lb:Topic . }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> select ?topic, ?predicate, ?object where # Print "topic", "predicate" and "object" { ?topic rdf:type lb:Topic . # "topic" is of type lb:Topic . ?topic ?predicate ?object . # "topic" has a property "predicate" with an object "object" . }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> select * where { ?indicator rdf:type cex:Indicator . ?indicator rdfs:label ?name . }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> PREFIX base-topic: <http://data.landportal.info/topic/> select ?indicator, ?name, ?description where { ?indicator rdf:type cex:Indicator . ?indicator lb:topic base-topic:LAND_USE . ?indicator rdfs:label ?name . ?indicator rdfs:comment ?description . }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> PREFIX base: <http://data.landportal.info/> select ?iso3, ?name, ?url where { ?country rdf:type cex:Area . ?country lb:iso3 ?iso3 . ?country lb:is_part_of base:Africa . ?country rdfs:label ?name . ?country lb:faoURI ?url . }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> PREFIX qb: <http://purl.org/linked-data/cube#> PREFIX base: <http://data.landportal.info/> PREFIX base-ind: <http://data.landportal.info/indicator/> select ?iso3, ?name, ?url where # Print iso3, name and url { ?country rdf:type cex:Area ; # Country is a cex:Area lb:iso3 ?iso3 ; # Country must have an iso3 lb:is_part_of base:Africa ; # Country must be part of "Africa" rdfs:label ?name ; # Conttry must have a label, that we call "name" lb:faoURI ?url . # Country must have a faoURI ?obs cex:ref-area ?country ; # There is something called obs that has our country as ref-area rdf:type qb:Observation ; # This "obs" is an observation cex:ref-indicator base-ind:INDLM4 ; # This observation has INDLM4 as ref-indicator cex:value ?value . # This "obs" has a value FILTER(?value > 0) . # This value must be greater than zero }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX lb: <http://purl.org/weso/landbook/ontology#> PREFIX qb: <http://purl.org/linked-data/cube#> PREFIX w3: <http://www.w3.org/ns/org#> PREFIX : <http://data.landportal.info/> select ?iso3, ?name, ?url where { ?country rdf:type cex:Area ; # Country is a cex:Area lb:iso3 ?iso3 ; # Country must have an iso3 rdfs:label ?name ; # Conttry must have a label, that we call "name" lb:faoURI ?url . # Country must have a faoURI ?obs cex:ref-area ?country ; # There is something called obs that has our country as ref-area rdf:type qb:Observation ; # This "obs" is an observation . qb:dataSet ?dataset . # The observation has as a dataSet "dataset" ?dataset rdf:type qb:DataSet ; # dataSet is a DataSet lb:dataSource ?datasource. # "dataset" has as a dataSource "datasource" ?datasource rdf:type lb:DataSource ; # "datasource" is a DataSource lb:organization ?org . # "datasource" has a organization "org" ?org rdf:type w3:Organization ; # "org" is a w3:organization rdfs:label "UNDP: United Nations Development Program"@en . # "org" has as Label "World Bank" }
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX cex: <http://purl.org/weso/ontology/computex#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX qb: <http://purl.org/linked-data/cube#> PREFIX base-ind: <http://data.landportal.info/indicator/> select ?country_name, ?year, ?value where { ?obs rdf:type qb:Observation ; cex:value ?value ; cex:ref-time ?date ; cex:ref-indicator base-ind:INDUNDP1; cex:ref-area ?country . ?country rdf:type cex:Area ; rdfs:label ?country_name . ?date time:hasDateTimeDescription ?date_desc . ?date_desc time:year ?year . FILTER (?year >= "2011"^^xsd:gYear) }