From 91f1e7cee0f42942951e3faee281a1190c3893fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20David?=
 <Jerome.David@univ-grenoble-alpes.fr>
Date: Thu, 15 Jul 2010 12:26:38 +0000
Subject: [PATCH] SkosLite implementation. Not yet finalized, but it works

---
 build.xml                                     |   1 +
 .../SKOSLiteThesaurus.java}                   | 205 +++++---
 .../inrialpes/exmo/ontowrap/skoslite/skos.rdf | 468 ++++++++++++++++++
 3 files changed, 597 insertions(+), 77 deletions(-)
 rename src/fr/inrialpes/exmo/ontowrap/{skosapi/JenaSKOSThesaurus.java => skoslite/SKOSLiteThesaurus.java} (79%)
 create mode 100644 src/fr/inrialpes/exmo/ontowrap/skoslite/skos.rdf

diff --git a/build.xml b/build.xml
index 53242cb7..2204a0f5 100644
--- a/build.xml
+++ b/build.xml
@@ -177,6 +177,7 @@
       </manifest>
       <fileset dir="classes" includes="fr/inrialpes/exmo/ontowrap/**/*.class"/>
       <fileset dir="classes" includes="LICENSE.TXT"/>
+      <fileset dir="src" includes="fr/inrialpes/exmo/ontowrap/**/*.rdf"/>
     </jar>
     <delete file="lib/procalign.jar"/>
     <jar jarfile="lib/procalign.jar">
diff --git a/src/fr/inrialpes/exmo/ontowrap/skosapi/JenaSKOSThesaurus.java b/src/fr/inrialpes/exmo/ontowrap/skoslite/SKOSLiteThesaurus.java
similarity index 79%
rename from src/fr/inrialpes/exmo/ontowrap/skosapi/JenaSKOSThesaurus.java
rename to src/fr/inrialpes/exmo/ontowrap/skoslite/SKOSLiteThesaurus.java
index 9254e582..8bb927ae 100644
--- a/src/fr/inrialpes/exmo/ontowrap/skosapi/JenaSKOSThesaurus.java
+++ b/src/fr/inrialpes/exmo/ontowrap/skoslite/SKOSLiteThesaurus.java
@@ -1,6 +1,5 @@
-package fr.inrialpes.exmo.ontowrap.skosapi;
+package fr.inrialpes.exmo.ontowrap.skoslite;
 
-import java.io.File;
 import java.net.URI;
 import java.util.Collections;
 import java.util.HashSet;
@@ -22,7 +21,9 @@ import com.hp.hpl.jena.vocabulary.RDFS;
 import fr.inrialpes.exmo.ontowrap.HeavyLoadedOntology;
 import fr.inrialpes.exmo.ontowrap.OntowrapException;
 
-public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
+public class SKOSLiteThesaurus implements HeavyLoadedOntology<Model> {
+    
+    protected final static String SKOS_ONTO = SKOSLiteThesaurus.class.getClassLoader().getResource("fr/inrialpes/exmo/ontowrap/skoslite/skos.rdf").toString();
 
     protected final static String SKOS_NS="http://www.w3.org/2004/02/skos/core#";
     protected final static String SKOS_CONCEPT=SKOS_NS+"Concept";
@@ -32,19 +33,13 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
     protected final static String SKOS_BROADERTRANSITIVE=SKOS_NS+"broaderTransitive";
     protected final static String SKOS_NARROWERTRANSITIVE=SKOS_NS+"narrowerTransitive";
     
+    protected InfModel ontoInf;
+    protected Model onto;
     
+    protected URI file;
     
-   
-    protected final InfModel ontoInf;
-    protected final Model onto;
-    
-    
-    public JenaSKOSThesaurus(URI file) {
-	onto=ModelFactory.createDefaultModel();
-	onto.read(file.toString());
-	onto.read((new File("/Users/jerome/Recherche/tae/skos.rdf")).toURI().toString());
-	this.ontoInf=ModelFactory.createRDFSModel(onto);
-	
+    public SKOSLiteThesaurus(URI file) {
+	setFile(file);
     }
 
     @Override
@@ -53,41 +48,75 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	return true;
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getClasses(Object i, int local, int asserted, int named) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getDataProperties(Object c, int local, int asserted, int named) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getDomain(Object p, int asserted) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getInstances(Object c, int local, int asserted, int named) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getObjectProperties(Object c, int local, int asserted, int named) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getProperties(Object c, int local, int asserted, int named) throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns empty set
+     */
     public Set<? extends Object> getRange(Object p, int asserted) throws OntowrapException {
 	return Collections.emptySet();
     }
+    
+    /**
+     * returns empty set
+     */
+    public Set<? extends Object> getSubProperties(Object p, int local, int asserted, int named) throws OntowrapException {
+	return Collections.emptySet();
+    }
+    
+   
+    /**
+     * returns empty set
+     */
+    public Set<? extends Object> getSuperProperties(Object p, int local, int asserted, int named) throws OntowrapException {
+	return Collections.emptySet();
+    }
 
+
+    /**
+     * returns all sub concepts of given object c.
+     * 
+     */
     @SuppressWarnings("unchecked")
     public <E> Set<E> getSubClasses(E c, int local, int asserted, int named) {
 	HashSet<E> sub = new HashSet<E>(); 
@@ -95,48 +124,34 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	StmtIterator it =ontoInf.listStatements(null,ontoInf.getProperty(SKOS_BROADERTRANSITIVE),(Resource) c);
 	while (it.hasNext()) {
 	    Statement st = it.next();
-	    //System.out.println("\t"+st.getSubject());
 	    sub.add((E)st.getSubject());
 	}
-	//System.out.println("\tSUITTE");
 	it =ontoInf.listStatements((Resource) c,ontoInf.getProperty(SKOS_NARROWERTRANSITIVE),(RDFNode)null);
 	while (it.hasNext()) {
 	    Statement st = it.next();
-	    //System.out.println("\t"+st.getObject());
 	    sub.add((E)st.getObject());
 	}
 	return sub;
     }
 
-    @Override
-    public Set<? extends Object> getSubProperties(Object p, int local, int asserted, int named) throws OntowrapException {
-	return Collections.emptySet();
-    }
-
+   
     @Override
     public Set<? extends Object> getSuperClasses(Object c, int local, int asserted, int named) throws OntowrapException {
 	HashSet<Object> sub = new HashSet<Object>(); 
-	//System.out.println(c);
 	StmtIterator it =ontoInf.listStatements(null,ontoInf.getProperty(SKOS_NARROWERTRANSITIVE),(Resource) c);
 	while (it.hasNext()) {
 	    Statement st = it.next();
-	    //System.out.println("\t"+st.getSubject());
 	    sub.add(st.getSubject());
 	}
-	//System.out.println("\tSUITTE");
 	it =ontoInf.listStatements((Resource) c,ontoInf.getProperty(SKOS_BROADERTRANSITIVE),(RDFNode)null);
 	while (it.hasNext()) {
 	    Statement st = it.next();
-	    //System.out.println("\t"+st.getObject());
 	    sub.add(st.getObject());
 	}
 	return sub;
     }
 
-    @Override
-    public Set<? extends Object> getSuperProperties(Object p, int local, int asserted, int named) throws OntowrapException {
-	return Collections.emptySet();
-    }
+   
 
     
     public Set<? extends Object> getClasses() throws OntowrapException {
@@ -198,12 +213,18 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	return getEntityComments(o,null);
     }
 
-    @Override
+    /**
+     * returns one of the skos:prefLabel
+     * In skos there at most one prefLabel for a given language
+     */
     public String getEntityName(Object o) throws OntowrapException {
 	return getEntityName(o,null);
     }
 
-    @Override
+    /**
+     * returns the skos:prefLabel for the given language.
+     * In skos there at most one prefLabel for a given language
+     */
     public String getEntityName(Object o, String lang) throws OntowrapException {
 	try {
 	    return getEntityAnnotations(o,lang,new String[]{SKOS_PREFLABEL}).iterator().next();
@@ -213,17 +234,24 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	}
     }
 
-    @Override
+    /**
+     * returns all the labels, i.e. rdf:label subproperties for a given language
+     * In skos, the properties skos:prefLabel, skos:altLabel and skos:hiddenLabel are subproperties of rdf:label
+     */
     public Set<String> getEntityNames(Object o, String lang) throws OntowrapException {
 	return getEntityAnnotations(o,lang,new String[]{RDFS.label.toString()});
     }
 
-    @Override
+    /**
+     * returns all the labels, i.e. rdf:label subproperties
+     * In skos, the properties skos:prefLabel, skos:altLabel and skos:hiddenLabel are subproperties of rdf:label
+     */
     public Set<String> getEntityNames(Object o) throws OntowrapException {
 	return getEntityNames(o,null);
     }
 
-    @Override
+   
+    
     public URI getEntityURI(Object o) throws OntowrapException {
 	try {
 	    return URI.create(((Resource) o).getURI());
@@ -233,117 +261,142 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	}
     }
 
-    @Override
+    /**
+     * No individuals for skos. returns empty set
+     */
     public Set<? extends Object> getIndividuals() throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * No object property for skos. returns empty set
+     */
     public Set<? extends Object> getObjectProperties() throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * No property for skos. returns empty set
+     */
     public Set<? extends Object> getProperties() throws OntowrapException {
 	return Collections.emptySet();
     }
 
-    @Override
+    /**
+     * returns true if the given object is an instance of skos:Concept
+     */
     public boolean isClass(Object o) throws OntowrapException {
 	return ontoInf.contains((Resource) o, RDF.type, ontoInf.getResource(SKOS_CONCEPT));
     }
 
-    @Override
+    
+    /**
+     * returns false
+     */
     public boolean isDataProperty(Object o) throws OntowrapException {
 	// TODO Auto-generated method stub
 	return false;
     }
 
-    @Override
+    /**
+     * returns false
+     */
     public boolean isEntity(Object o) throws OntowrapException {
 	// TODO Auto-generated method stub
 	return false;
     }
 
-    @Override
+    /**
+     * returns false
+     */
     public boolean isIndividual(Object o) throws OntowrapException {
 	// TODO Auto-generated method stub
 	return false;
     }
 
-    @Override
+    /**
+     * returns false
+     */
     public boolean isObjectProperty(Object o) throws OntowrapException {
 	// TODO Auto-generated method stub
 	return false;
     }
 
-    @Override
+    /**
+     * returns false
+     */
     public boolean isProperty(Object o) throws OntowrapException {
 	// TODO Auto-generated method stub
 	return false;
     }
 
-    @Override
+    /**
+     * returns the number of skos:Concept in the thesaurus
+     */
     public int nbClasses() throws OntowrapException {
 	return this.getClasses().size();
     }
 
-    @Override
+    /**
+     * returns 0
+     */
     public int nbDataProperties() throws OntowrapException {
 	// TODO Auto-generated method stub
 	return 0;
     }
 
-    @Override
+    /**
+     * returns the same number than nbClasses()
+     */
     public int nbEntities() throws OntowrapException {
 	return this.getClasses().size();
     }
 
-    @Override
+    /**
+     * returns 0
+     */
     public int nbIndividuals() throws OntowrapException {
 	// TODO Auto-generated method stub
 	return 0;
     }
 
-    @Override
+    /**
+     * returns 0
+     */
     public int nbObjectProperties() throws OntowrapException {
 	// TODO Auto-generated method stub
 	return 0;
     }
 
-    @Override
+    /**
+     * returns 0
+     */
     public int nbProperties() throws OntowrapException {
 	// TODO Auto-generated method stub
 	return 0;
     }
 
-    @Override
     public void unload() throws OntowrapException {
-	// TODO Auto-generated method stub
-	
+	ontoInf=null;
+	onto=null;
     }
 
-    @Override
     public URI getFile() {
-	// TODO Auto-generated method stub
-	return null;
+	return file;
     }
 
-    @Override
     public URI getFormURI() {
 	// TODO Auto-generated method stub
 	return null;
     }
 
-    @Override
     public String getFormalism() {
 	// TODO Auto-generated method stub
 	return null;
     }
 
-    @Override
     public Model getOntology() {
-	return ontoInf;
+	return onto;
     }
 
     @Override
@@ -352,33 +405,31 @@ public class JenaSKOSThesaurus implements HeavyLoadedOntology<Model> {
 	return null;
     }
 
-    @Override
     public void setFile(URI file) {
-	// TODO Auto-generated method stub
+	this.file=file;
+	onto=ModelFactory.createDefaultModel();
+	onto.read(file.toString());
+	onto.read(SKOS_ONTO);
+	this.ontoInf=ModelFactory.createRDFSModel(onto);
 	
     }
 
-    @Override
     public void setFormURI(URI u) {
-	// TODO Auto-generated method stub
 	
     }
 
-    @Override
     public void setFormalism(String name) {
-	// TODO Auto-generated method stub
 	
     }
 
-    @Override
     public void setOntology(Model o) {
-	// TODO Auto-generated method stub
+	onto=o;
+	onto.read(SKOS_ONTO);
+	this.ontoInf=ModelFactory.createRDFSModel(onto);
 	
     }
 
-    @Override
     public void setURI(URI uri) {
-	// TODO Auto-generated method stub
 	
     }
     
diff --git a/src/fr/inrialpes/exmo/ontowrap/skoslite/skos.rdf b/src/fr/inrialpes/exmo/ontowrap/skoslite/skos.rdf
new file mode 100644
index 00000000..a4d163b1
--- /dev/null
+++ b/src/fr/inrialpes/exmo/ontowrap/skoslite/skos.rdf
@@ -0,0 +1,468 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:dct="http://purl.org/dc/terms/"
+  xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:skos="http://www.w3.org/2004/02/skos/core#"
+  xml:base="http://www.w3.org/2004/02/skos/core">
+  <!-- This schema represents a formalisation of a subset of the semantic conditions 
+    described in the SKOS Reference document dated 18 August 2009, accessible
+    at http://www.w3.org/TR/2009/REC-skos-reference-20090818/. XML comments of the form Sn are used to 
+    indicate the semantic conditions that are being expressed. Comments of the form 
+    [Sn] refer to assertions that are, strictly speaking, redundant as they follow 
+    from the RDF(S) or OWL semantics.
+    
+    A number of semantic conditions are *not* expressed formally in this schema. These are:
+    
+    S12
+    S13
+    S14
+    S27
+    S36
+    S46
+    
+    For the conditions listed above, rdfs:comments are used to indicate the conditions.
+    
+   -->
+  <owl:Ontology rdf:about="http://www.w3.org/2004/02/skos/core">
+    <dct:title xml:lang="en">SKOS Vocabulary</dct:title>
+    <dct:contributor>Dave Beckett</dct:contributor>
+    <dct:contributor>Nikki Rogers</dct:contributor>
+    <dct:contributor>Participants in W3C's Semantic Web Deployment Working Group.</dct:contributor>
+    <dct:description xml:lang="en">An RDF vocabulary for describing the basic structure and content of concept schemes such as thesauri, classification schemes, subject heading lists, taxonomies, 'folksonomies', other types of controlled vocabulary, and also concept schemes embedded in glossaries and terminologies.</dct:description>
+    <dct:creator>Alistair Miles</dct:creator>
+    <dct:creator>Sean Bechhofer</dct:creator>
+    <rdfs:seeAlso rdf:resource="http://www.w3.org/TR/skos-reference/"/>
+  </owl:Ontology>
+  <rdf:Description rdf:about="#Concept">
+    <rdfs:label xml:lang="en">Concept</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">An idea or notion; a unit of thought.</skos:definition>
+    <!-- S1 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#ConceptScheme">
+    <rdfs:label xml:lang="en">Concept Scheme</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A set of concepts, optionally including statements about semantic relationships between those concepts.</skos:definition>
+    <skos:scopeNote xml:lang="en">A concept scheme may be defined to include concepts from different sources.</skos:scopeNote>
+    <skos:example xml:lang="en">Thesauri, classification schemes, subject heading lists, taxonomies, 'folksonomies', and other types of controlled vocabulary are all examples of concept schemes. Concept schemes are also embedded in glossaries and terminologies.</skos:example>
+    <!-- S2 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
+    <!-- S9 -->
+    <owl:disjointWith rdf:resource="#Concept"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#Collection">
+    <rdfs:label xml:lang="en">Collection</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A meaningful collection of concepts.</skos:definition>
+    <skos:scopeNote xml:lang="en">Labelled collections can be used where you would like a set of concepts to be displayed under a 'node label' in the hierarchy.</skos:scopeNote>
+    <!-- S28 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
+    <!-- S37 -->
+    <owl:disjointWith rdf:resource="#Concept"/>
+    <!-- S37 -->
+    <owl:disjointWith rdf:resource="#ConceptScheme"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#OrderedCollection">
+    <rdfs:label xml:lang="en">Ordered Collection</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">An ordered collection of concepts, where both the grouping and the ordering are meaningful.</skos:definition>
+    <skos:scopeNote xml:lang="en">Ordered collections can be used where you would like a set of concepts to be displayed in a specific order, and optionally under a 'node label'.</skos:scopeNote>
+    <!-- S28 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
+    <!-- S29 -->
+    <rdfs:subClassOf rdf:resource="#Collection"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#inScheme">
+    <rdfs:label xml:lang="en">is in scheme</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a resource (for example a concept) to a concept scheme in which it is included.</skos:definition>
+    <skos:scopeNote xml:lang="en">A concept may be a member of more than one concept scheme.</skos:scopeNote>
+    <!-- S3 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S4 -->
+    <rdfs:range rdf:resource="#ConceptScheme"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#hasTopConcept">
+    <rdfs:label xml:lang="en">has top concept</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates, by convention, a concept scheme to a concept which is topmost in the broader/narrower concept hierarchies for that scheme, providing an entry point to these hierarchies.</skos:definition>
+    <!-- S3 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S5 -->
+    <rdfs:domain rdf:resource="#ConceptScheme"/>
+    <!-- S6 -->
+    <rdfs:range rdf:resource="#Concept"/>
+    <!-- S8 -->
+    <owl:inverseOf rdf:resource="#topConceptOf"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#topConceptOf">
+    <rdfs:label xml:lang="en">is top concept in scheme</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a concept to the concept scheme that it is a top level concept of.</skos:definition>
+    <!-- S3 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S7 -->
+    <rdfs:subPropertyOf rdf:resource="#inScheme"/>
+    <!-- S8 -->
+    <owl:inverseOf rdf:resource="#hasTopConcept"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+    <rdfs:domain rdf:resource="#Concept"/>
+    <rdfs:range rdf:resource="#ConceptScheme"/> 
+  </rdf:Description>
+  <rdf:Description rdf:about="#prefLabel">
+    <rdfs:label xml:lang="en">preferred label</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">The preferred lexical label for a resource, in a given language.</skos:definition>
+    <!-- S10 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S11 -->
+    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#label"/>
+    <!-- S14 (not formally stated) -->
+    <rdfs:comment xml:lang="en">A resource has no more than one value of skos:prefLabel per language tag.</rdfs:comment>
+    <!-- S12 (not formally stated) -->
+    <rdfs:comment xml:lang="en">The range of skos:prefLabel is the class of RDF plain literals.</rdfs:comment>
+    <!-- S13 (not formally stated) -->
+    <rdfs:comment xml:lang="en">skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise
+      disjoint properties.</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#altLabel">
+    <rdfs:label xml:lang="en">alternative label</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">An alternative lexical label for a resource.</skos:definition>
+    <skos:example xml:lang="en">Acronyms, abbreviations, spelling variants, and irregular plural/singular forms may be included among the alternative labels for a concept. Mis-spelled terms are normally included as hidden labels (see skos:hiddenLabel).</skos:example>
+    <!-- S10 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S11 -->
+    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#label"/>
+    <!-- S12 (not formally stated) -->
+    <rdfs:comment xml:lang="en">The range of skos:altLabel is the class of RDF plain literals.</rdfs:comment>
+    <!-- S13 (not formally stated) -->
+    <rdfs:comment xml:lang="en">skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties.</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#hiddenLabel">
+    <rdfs:label xml:lang="en">hidden label</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A lexical label for a resource that should be hidden when generating visual displays of the resource, but should still be accessible to free text search operations.</skos:definition>
+    <!-- S10 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S11 -->
+    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#label"/>
+    <!-- S12 (not formally stated) -->
+    <rdfs:comment xml:lang="en">The range of skos:hiddenLabel is the class of RDF plain literals.</rdfs:comment>
+    <!-- S13 (not formally stated) -->
+    <rdfs:comment xml:lang="en">skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties.</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#notation">
+    <rdfs:label xml:lang="en">notation</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A notation, also known as classification code, is a string of characters such as "T58.5" or "303.4833" used to uniquely identify a concept within the scope of a given concept scheme.</skos:definition>
+    <skos:scopeNote xml:lang="en">By convention, skos:notation is used with a typed literal in the object position of the triple.</skos:scopeNote>
+    <!-- S15 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#note">
+    <rdfs:label xml:lang="en">note</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A general note, for any purpose.</skos:definition>
+    <skos:scopeNote xml:lang="en">This property may be used directly, or as a super-property for more specific note types.</skos:scopeNote>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#changeNote">
+    <rdfs:label xml:lang="en">change note</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A note about a modification to a concept.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#definition">
+    <rdfs:label xml:lang="en">definition</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A statement or formal explanation of the meaning of a concept.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#editorialNote">
+    <rdfs:label xml:lang="en">editorial note</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A note for an editor, translator or maintainer of the vocabulary.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#example">
+    <rdfs:label xml:lang="en">example</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">An example of the use of a concept.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#historyNote">
+    <rdfs:label xml:lang="en">history note</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A note about the past state/use/meaning of a concept.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#scopeNote">
+    <rdfs:label xml:lang="en">scope note</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">A note that helps to clarify the meaning and/or the use of a concept.</skos:definition>
+    <!-- S16 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AnnotationProperty"/>
+    <!-- S17 -->
+    <rdfs:subPropertyOf rdf:resource="#note"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#semanticRelation">
+    <rdfs:label xml:lang="en">is in semantic relation with</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Links a concept to a concept related by meaning.</skos:definition>
+    <skos:scopeNote xml:lang="en">This property should not be used directly, but as a super-property for all properties denoting a relationship of meaning between concepts.</skos:scopeNote>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S19 -->
+    <rdfs:domain rdf:resource="#Concept"/>
+    <!-- S20 -->
+    <rdfs:range rdf:resource="#Concept"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#broader">
+    <rdfs:label xml:lang="en">has broader</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a concept to a concept that is more general in meaning.</skos:definition>
+    <rdfs:comment xml:lang="en">Broader concepts are typically rendered as parents in a concept hierarchy (tree).</rdfs:comment>
+    <skos:scopeNote xml:lang="en">By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources.</skos:scopeNote>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S22 -->
+    <rdfs:subPropertyOf rdf:resource="#broaderTransitive"/>
+    <!-- S25 -->
+    <owl:inverseOf rdf:resource="#narrower"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#narrower">
+    <rdfs:label xml:lang="en">has narrower</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a concept to a concept that is more specific in meaning.</skos:definition>
+    <skos:scopeNote xml:lang="en">By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources.</skos:scopeNote>
+    <rdfs:comment xml:lang="en">Narrower concepts are typically rendered as children in a concept hierarchy (tree).</rdfs:comment>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S22 -->
+    <rdfs:subPropertyOf rdf:resource="#narrowerTransitive"/>
+    <!-- S25 -->
+    <owl:inverseOf rdf:resource="#broader"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#related">
+    <rdfs:label xml:lang="en">has related</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a concept to a concept with which there is an associative semantic relationship.</skos:definition>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S21 -->
+    <rdfs:subPropertyOf rdf:resource="#semanticRelation"/>
+    <!-- S23 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#SymmetricProperty"/>
+    <!-- S27 (not formally stated) -->
+    <rdfs:comment xml:lang="en">skos:related is disjoint with skos:broaderTransitive</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#broaderTransitive">
+    <rdfs:label xml:lang="en">has broader transitive</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition>skos:broaderTransitive is a transitive superproperty of skos:broader.</skos:definition>
+    <skos:scopeNote xml:lang="en">By convention, skos:broaderTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application.</skos:scopeNote>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S21 -->
+    <rdfs:subPropertyOf rdf:resource="#semanticRelation"/>
+    <!-- S24 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
+    <!-- S26 -->
+    <owl:inverseOf rdf:resource="#narrowerTransitive"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#narrowerTransitive">
+    <rdfs:label xml:lang="en">has narrower transitive</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition>skos:narrowerTransitive is a transitive superproperty of skos:narrower.</skos:definition>
+    <skos:scopeNote xml:lang="en">By convention, skos:narrowerTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application.</skos:scopeNote>
+    <!-- S18 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S21 -->
+    <rdfs:subPropertyOf rdf:resource="#semanticRelation"/>
+    <!-- S24 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
+    <!-- S26 -->
+    <owl:inverseOf rdf:resource="#broaderTransitive"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#member">
+    <rdfs:label xml:lang="en">has member</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates a collection to one of its members.</skos:definition>
+    <!-- S30 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S31 -->
+    <rdfs:domain rdf:resource="#Collection"/>
+    <!-- S32 -->
+    <rdfs:range>
+      <owl:Class>
+	<owl:unionOf rdf:parseType="Collection">
+	  <owl:Class rdf:about="#Concept"/>
+	  <owl:Class rdf:about="#Collection"/>
+	</owl:unionOf>
+      </owl:Class>
+    </rdfs:range>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#memberList">
+    <rdfs:label xml:lang="en">has member list</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates an ordered collection to the RDF list containing its members.</skos:definition>
+    <!-- S30 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S33 -->
+    <rdfs:domain rdf:resource="#OrderedCollection"/>
+    <!-- S35 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/>
+    <!-- S34 -->
+    <rdfs:range rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#List"/>
+    <!-- S36 (not formally stated) -->
+    <rdfs:comment xml:lang="en">For any resource, every item in the list given as the value of the
+      skos:memberList property is also a value of the skos:member property.</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#mappingRelation">
+    <rdfs:label xml:lang="en">is in mapping relation with</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">Relates two concepts coming, by convention, from different schemes, and that have comparable meanings</skos:definition>
+    <rdfs:comment xml:lang="en">These concept mapping relations mirror semantic relations, and the data model defined below is similar (with the exception of skos:exactMatch) to the data model defined for semantic relations. A distinct vocabulary is provided for concept mapping relations, to provide a convenient way to differentiate links within a concept scheme from links between concept schemes. However, this pattern of usage is not a formal requirement of the SKOS data model, and relies on informal definitions of best practice.</rdfs:comment>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S39 -->
+    <rdfs:subPropertyOf rdf:resource="#semanticRelation"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#broadMatch">
+    <rdfs:label xml:lang="en">has broader match</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">skos:broadMatch is used to state a hierarchical mapping link between two conceptual resources in different concept schemes.</skos:definition>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S40 -->
+    <rdfs:subPropertyOf rdf:resource="#mappingRelation"/>
+    <!-- S41 -->
+    <rdfs:subPropertyOf rdf:resource="#broader"/>
+    <!-- S43 -->
+    <owl:inverseOf rdf:resource="#narrowMatch"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#narrowMatch">
+    <rdfs:label xml:lang="en">has narrower match</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">skos:narrowMatch is used to state a hierarchical mapping link between two conceptual resources in different concept schemes.</skos:definition>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S40 -->
+    <rdfs:subPropertyOf rdf:resource="#mappingRelation"/>
+    <!-- S41 -->
+    <rdfs:subPropertyOf rdf:resource="#narrower"/>
+    <!-- S43 -->
+    <owl:inverseOf rdf:resource="#broadMatch"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#relatedMatch">
+    <rdfs:label xml:lang="en">has related match</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">skos:relatedMatch is used to state an associative mapping link between two conceptual resources in different concept schemes.</skos:definition>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S40 -->
+    <rdfs:subPropertyOf rdf:resource="#mappingRelation"/>
+    <!-- S41 -->
+    <rdfs:subPropertyOf rdf:resource="#related"/>
+    <!-- S44 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#SymmetricProperty"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#exactMatch">
+    <rdfs:label xml:lang="en">has exact match</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">skos:exactMatch is used to link two concepts, indicating a high degree of confidence that the concepts can be used interchangeably across a wide range of information retrieval applications. skos:exactMatch is a transitive property, and is a sub-property of skos:closeMatch.</skos:definition>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S42 -->
+    <rdfs:subPropertyOf rdf:resource="#closeMatch"/>
+    <!-- S44 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#SymmetricProperty"/>
+    <!-- S45 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
+    <!-- S46 (not formally stated) -->
+    <rdfs:comment xml:lang="en">skos:exactMatch is disjoint with each of the properties skos:broadMatch and skos:relatedMatch.</rdfs:comment>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+  <rdf:Description rdf:about="#closeMatch">
+    <rdfs:label xml:lang="en">has close match</rdfs:label>
+    <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2004/02/skos/core"/>
+    <skos:definition xml:lang="en">skos:closeMatch is used to link two concepts that are sufficiently similar that they can be used interchangeably in some information retrieval applications. In order to avoid the possibility of "compound errors" when combining mappings across more than two concept schemes, skos:closeMatch is not declared to be a transitive property.</skos:definition>
+    <!-- S38 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
+    <!-- S40 -->
+    <rdfs:subPropertyOf rdf:resource="#mappingRelation"/>
+    <!-- S44 -->
+    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#SymmetricProperty"/>
+    <!-- For non-OWL aware applications -->
+    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
+  </rdf:Description>
+</rdf:RDF>
-- 
GitLab