This document describes the RDF Data Portal developed as part of the LandBook project. The LandBook project is part of LandPortal

Initial version

Introduction

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.

Data Model Overview

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. Pictorial illustration of landbook data model

External namespace prefixes

This is the list of external namespace prefixes employed:
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#

Base URI

The base URI of the LandBook data is http://data.landportal.info. Along this document {base} refers to the previous URI.

LandBook namespace prefixes

The list of namespace prefixes defined in the LandBook is:
lb
http://purl.org/weso/landbook/ontology#

Entities

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

Structural elements

Observations

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

URI Template

{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

Schema

<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>
}

Example

: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

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
 .

Slice

A Slice is a grouping of observations.

URI Template

{base}/dataset/{datasetId}/slice/{sliceId}
where
{base} = Base URI for LandBook
{datasetId} = Id of this slice's dataset
{sliceId} = Id of this slice

Schema

<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
}

Example

:slice1 a qb:Slice 
 ; cex:ref-indicator :hdi 
 ; qb:observation :o1, :o2
 ; qb:dimension lb:Area  
 ; qb:dataSet :dataSet1 
 .

Dataset

A Dataset is a grouping of slices.

This concept is the same as the qb:DataSet concept from RDF Data Cube

URI Template

{base}/dataset/{dataSetId}
where
{base} = Base URI for Landbook
{dataSetId} = Id of this dataSet

Schema

<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
                    )  
}

Example

:dataSet1 a qb:DataSet 
 ; sdmx-concept:freq sdmx-code:freq-A
 ; lb:dataSource :dataSource1 
 ; lb:license :license1
 ; qb:slice :slice1
 .

Countries, regions and areas

Countries and regions represent geographical areas.

Area represents the common parts of both countries and regions:

Schema

<Area> {
   a ( cex:Area )
 , rdfs:label xsd:string
}

Countries

Countries are represented by three main properties: The iso-codes with 2 and 3 letters and their FAO URI

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

Concept of a region.

A region can be part of another 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"
 .

Time

Represents some time. There are several types of values to represent time values like years, time intervals or instants.

URI Template

{base}/time/{YYYY}
or
{base}/time/{YYYY}-{YYYY}
where
{base} = Base URI for LandBook
{YYYY} = year (4 digits)

Schema


<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,
}

Example

: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

Organization

URI Template

{base}/organization/{orgId}
where
{base} = Base URI for LandBook
{orgId} = Organization Id

Schema

<Organization> {
  a ( org:Organization )
, rdfs:label xsd:string
, org:identifier xsd:string
, foaf:homepage shex:IRI
, org:subOrganizationOf @<Organization>*
, org:hasSubOrganization @<Organization>*
}

Example

:faostat a org:Organization 
 ; rdfs:label "The statistics division of FAO"@en 
 ; org:identifier "FAOSTAT"
 ; foaf:homepage <http://faostat.fao.org/>
 .

Data source

A source of data

URI Template

{base}/datasource/{datasourceId}
where
{base} = Base URI for LandBook
{datasourceId} = Datasource Id

Schema

<DataSource> {
  a (lb:DataSource)
, rdfs:label xsd:string
, lb:organization @<Organization>
, dcterms:creator @<User>
, dcterms:description xsd:string?
, dcterms:title xsd:string?
}

Example

:dataSource1 a lb:DataSource 
 ; rdfs:label "Data source name"@en 
 ; lb:organization :faostat
 ; dcterms:creator :john
 .

User

A user or agent that operates the system. It can be a person who uploads data to the system.

URI Template

{base}/user/{userId}
where
{base} = Base URI for LandBook
{userId} = User Id

Schema

<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>+
}

Example

:john a foaf:Person
 ; rdfs:label "John Smith"
 ; foaf:name "John Smith"
 ; foaf:account "john"
 ; org:memberOf :faostat
 .

Upload

Represents an upload: a process by which some data has been uploaded into the system

URI Template

{base}/upload/{uploadId}
where
{base} = Base URI for LandBook
{uploadId} = Upload Id

Schema

<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
}

Example

: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
 .

Catalog

Represents a catalog: a curated collection of metadata about datasets.

URI Template

{base}/catalog
where
{base} = Base URI for LandBook

Schema

<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

}

Example

: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
 .

Ontology

The Landportal book data portal terms are defined in the following ontologies:

Example queries

This section contains a list of common queries.

List all the topics.

    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 .
    }  

Print every available information for each 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" .

    }
  

Print URI and name of every indicator.

    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 .
    }
  

Print name and description of every indicator that has "LAND_USE" as topic.

    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 .
    }
    
  

URL of the page in FAO´s portal of every African country stored in the system.

    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 .

    }
  

URL of the page in FAO´s portal of every African country that has at least a deal in the industrial sector.

    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

    }
  

URL of the page in FAO´s portal of every country that has some observation obtained from the organization called "UNDP: United Nations Development Program".

    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"
    }
  

Country, year and value of every observation of 2010 or more recent that has INDUNDP0 as indicator.

    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)

       }