OWL2SOML¶
What’s in this document?
Note
This feature is still experimental and in active development. Your feedback is highly appreciated!
SOML and OWL are two completely different languages that have a similar purpose - to provide a way of describing and modeling data. As a lot of Semantic Objects users already have OWL ontologies describing their data, the need for a conversion from OWL to SOML is obvious.
The Semantic Objects support this conversion using a feature called OWL2SOML. We first prototyped it in Perl as the OWL2SOML tool, then implemented it in Java as part of the Semantic Objects. The results from the OWL2SOML tool may differ slightly from the results of the Semantic Objects, although in general, they are similar. The tool is still under development, so there might be some delay implementing its latest features in the Semantic Objects. See section Differences for details.
All of the below actions and examples can also be executed from the Semantic Objects’ web-based administration interface, the Workbench.
Generate and Upload a Schema¶
To generate and upload a schema from the Workbench, follow the steps described here.
To generate and upload a schema, the regular endpoint should be used but with a
different Content-Type - multipart/form-data
.
curl --location --request POST '{SOAAS_ADDRESS}/soml/' \
--header 'Content-Type: multipart/form-data' \
--form 'files=@{ONTOLOGY_FILE}' \
This endpoint supports the following parameters used especially for the OWL2SOML conversion:
files
- Description: Ontology files. Any RDF format is supported. An automatic attempt to extract the main
ontology_iri
and thevocab_prefix
will be performed only from the first (main) ontology.Required:true
Default value:none
vocPfx
- Description: Specifies a
vocab_prefix
for the schema. The namespace for this prefix should be declared in one of the ontology files. If not specified explicitly, one will be extracted automatically. Setting it toNONE
will set a default namespacehttp://example.com/
. Use this option if there is no main ontology to be used.Required:false
Default value:none
id
- Description: Specifies an
id
for the schema.Required:false
, unlessvocPfx
is set toNONE
. In that case there is no other way to determine the schema id as no main ontology will be used.Default value:none
label
- Description: Specifies a
label
for the schema. This is to be used only with theid
parameter. Otherwise thelabel
will be extracted from the main ontology automatically.Required:false
Default value:none
lang
- Description: Specifies the schema-level
lang
spec to control how language strings are handled. The supported format is either a string with no spaces (which setsfetch
), orkey1: val1, key2: val2, ...
where the keys arefetch
,validate
, andimplicit
, and the values include no spaces. For example:lang=fetch: en~,de,ANY, validate: en~,de~,fr~, implicit: en-GB
. For more information about the lang configuration, see Language configurations.Required:false
Default value:none
stringMode
- Description: Provides means for controlling the way of emitting string-related datatypes. Possible values are
stringOrLangString
,langString
, andstring
. For details on the output that each datatype produces, check the table below.Required:false
Default value:stringOrLangString
Datatype stringOrLangString(default) langString string rdf:langString langString langString string rdf:PlainLiteral, rdfs:Literal, schema:Text, undefined stringOrLangString langString string xsd:string string string string dryrun
- Description: Performs a schema transformation without actually uploading the SOML schema. Useful for testing purposes. Applicable only for generate (POST) requests.Required:
false
Default value:false
Generate and Update a Schema¶
To update a schema from the Workbench, follow the schema generation steps described here.
Similarly to the upload, the regular update endpoint is used with multipart/form-data
Content-Type:
curl --location --request PUT '{SOAAS_ADDRESS}/soml/{SOML_SCHEMA_ID}' \
--header 'Content-Type: multipart/form-data' \
--form 'files=@{ONTOLOGY_FILE}'
This endpoint supports all of the upload endpoint parameters except id
and `dryrun
.
dryrun
is not supported for update (PUT), use upload (POST) instead. id
is taken from the Path
parameter of the endpoint.
Example¶
In this section, we will take a look at a simple example of how to convert an OWL ontology to SOML using the Semantic Objects. For more details on how exactly the conversion works, refer to the OWL2SOML documentation.
We will generate a SOML schema from the SKOS ontology.
First, download the skos.rdf
ontology.
Second, download the skos-fix.ttl
. This file contains RDF that will help us
build a richer schema.
For this example, both files must be uploaded to the Semantic Objects at once using any preferred approach. In the examples
to follow, we use cURL to execute a POST multipart/form-data
request to perform the files upload:
curl --location --request POST 'localhost:9995/soml/' \
--header 'Content-Type: multipart/form-data' \
--header 'Authorization: Bearer JWT_TOKEN' \
--form 'files=@/home/user/data/skos.rdf' \
--form 'files=@/home/user/data/skos-fix.ttl' \
The endpoint accepts multiple RDF file formats and will parse the files depending on their extensions.
We will try to extract the main owl:Ontology
from the first RDF file provided, so it is important
to upload the skos.rdf
file first. Also depending on the main owl:Ontology
, we will determine
the vocab_iri
and vocab_prefix
of the schema. If you want to specify an explicit vocab_prefix
, you could just add the following optional vocPfx
parameter:
curl --location --request POST 'localhost:9995/soml/' \
--header 'Content-Type: multipart/form-data' \
--header 'Authorization: Bearer JWT_TOKEN' \
--form 'files=@/home/user/data/skos.rdf' \
--form 'files=@/home/user/data/skos-fix.ttl' \
--form 'vocPfx=skos' \
In this case, the vocab_iri
will be determined by the namespaces defined in the RDF files.
However, for our case this is not necessary as the main ontology and the vocab data are extracted
automatically:
specialPrefixes:
ontology_iri: http://www.w3.org/2004/02/skos/core
vocab_iri: http://www.w3.org/2004/02/skos/core#
vocab_prefix: skos
If you want to only test what SOML schema will be generated, you can use the following dryrun
optional parameter:
curl --location --request POST 'localhost:9995/soml/' \
--header 'Content-Type: multipart/form-data' \
--header 'Authorization: Bearer JWT_TOKEN' \
--form 'files=@/home/user/data/skos.rdf' \
--form 'files=@/home/user/data/skos-fix.ttl' \
--form 'vocPfx=skos' \
--form 'dryrun=true'
This way, you can test how your ontologies get converted without storing them in the database.
This will generate a result like the following schema:
id: /soml/skos
label: SKOS Vocabulary
creator: Alistair Miles, Sean Bechhofer
prefixes:
dct: http://purl.org/dc/terms/
owl: http://www.w3.org/2002/07/owl#
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs: http://www.w3.org/2000/01/rdf-schema#
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
specialPrefixes:
vocab_prefix: skos
ontology_iri: http://www.w3.org/2004/02/skos/core
vocab_iri: http://www.w3.org/2004/02/skos/core#
properties:
altLabel:
descr: An alternative lexical label for a resource. The range of skos:altLabel
is the class of RDF plain literals. skos:prefLabel, skos:altLabel and skos:hiddenLabel
are pairwise disjoint properties
kind: literal
label: alternative label
max: inf
range: stringOrLangString
rdfProp: skos:altLabel
broadMatch:
descr: skos:broadMatch is used to state a hierarchical mapping link between two
conceptual resources in different concept schemes
inverseOf: narrowMatch
kind: object
label: has broader match
max: inf
range: Concept
rdfProp: skos:broadMatch
broader:
descr: Broader concepts are typically rendered as parents in a concept hierarchy
(tree). By convention, skos:broader is only used to assert an immediate (i.e.
direct) hierarchical link between two conceptual resources. Relates a concept
to a concept that is more general in meaning
inverseOf: narrower
kind: object
label: has broader
max: inf
range: Concept
rdfProp: skos:broader
broaderTransitive:
descr: 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:broaderTransitive is a transitive
superproperty of skos:broader
inverseOf: narrowerTransitive
kind: object
label: has broader transitive
max: inf
range: Concept
rdfProp: skos:broaderTransitive
changeNote:
descr: A note about a modification to a concept
kind: literal
label: change note
max: inf
range: stringOrLangString
rdfProp: skos:changeNote
closeMatch:
descr: 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
kind: object
label: has close match
max: inf
range: Concept
rdfProp: skos:closeMatch
symmetric: true
definition:
descr: A statement or formal explanation of the meaning of a concept
kind: literal
label: definition
max: inf
range: stringOrLangString
rdfProp: skos:definition
editorialNote:
descr: A note for an editor, translator or maintainer of the vocabulary
kind: literal
label: editorial note
max: inf
range: stringOrLangString
rdfProp: skos:editorialNote
exactMatch:
descr: skos:exactMatch is disjoint with each of the properties skos:broadMatch
and skos:relatedMatch. 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
kind: object
label: has exact match
max: inf
range: Concept
rdfProp: skos:exactMatch
symmetric: true
example:
descr: An example of the use of a concept
kind: literal
label: example
max: inf
range: stringOrLangString
rdfProp: skos:example
hasTopConcept:
descr: 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
inverseOf: topConceptOf
kind: object
label: has top concept
max: inf
range: Concept
rdfProp: skos:hasTopConcept
hiddenLabel:
descr: 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. The range of skos:hiddenLabel is the class of RDF plain literals.
skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties
kind: literal
label: hidden label
max: inf
range: stringOrLangString
rdfProp: skos:hiddenLabel
historyNote:
descr: A note about the past state/use/meaning of a concept
kind: literal
label: history note
max: inf
range: stringOrLangString
rdfProp: skos:historyNote
inScheme:
descr: A concept may be a member of more than one concept scheme. Relates a resource
(for example a concept) to a concept scheme in which it is included
kind: object
label: is in scheme
max: inf
range: ConceptScheme
rdfProp: skos:inScheme
mappingRelation:
descr: Relates two concepts coming, by convention, from different schemes, and
that have comparable meanings. 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
kind: object
label: is in mapping relation with
max: inf
range: Concept
rdfProp: skos:mappingRelation
member:
descr: Relates a collection to one of its members
kind: object
label: has member
max: inf
range: CollectionInterface
rdfProp: skos:member
memberList:
descr: |-
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. Relates an ordered collection to the RDF list containing its members
kind: object
label: has member list
range: rdf:List
rdfProp: skos:memberList
narrowMatch:
descr: skos:narrowMatch is used to state a hierarchical mapping link between two
conceptual resources in different concept schemes
inverseOf: broadMatch
kind: object
label: has narrower match
max: inf
range: Concept
rdfProp: skos:narrowMatch
narrower:
descr: By convention, skos:broader is only used to assert an immediate (i.e. direct)
hierarchical link between two conceptual resources. Narrower concepts are typically
rendered as children in a concept hierarchy (tree). Relates a concept to a concept
that is more specific in meaning
inverseOf: broader
kind: object
label: has narrower
max: inf
range: Concept
rdfProp: skos:narrower
narrowerTransitive:
descr: 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:narrowerTransitive is
a transitive superproperty of skos:narrower
inverseOf: broaderTransitive
kind: object
label: has narrower transitive
max: inf
range: Concept
rdfProp: skos:narrowerTransitive
notation:
descr: 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. By convention, skos:notation is used with a
typed literal in the object position of the triple
kind: literal
label: notation
max: inf
range: stringOrLangString
rdfProp: skos:notation
note:
descr: A general note, for any purpose. This property may be used directly, or
as a super-property for more specific note types
kind: literal
label: note
max: inf
range: stringOrLangString
rdfProp: skos:note
prefLabel:
descr: |-
A resource has no more than one value of skos:prefLabel per language tag, and no more than one value of skos:prefLabel without language tag. The preferred lexical label for a resource, in a given language. The range of skos:prefLabel is the class of RDF plain literals. skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise
disjoint properties
kind: literal
label: preferred label
max: inf
range: stringOrLangString
rdfProp: skos:prefLabel
related:
descr: Relates a concept to a concept with which there is an associative semantic
relationship. skos:related is disjoint with skos:broaderTransitive
kind: object
label: has related
max: inf
range: Concept
rdfProp: skos:related
symmetric: true
relatedMatch:
descr: skos:relatedMatch is used to state an associative mapping link between
two conceptual resources in different concept schemes
kind: object
label: has related match
max: inf
range: Concept
rdfProp: skos:relatedMatch
symmetric: true
scopeNote:
descr: A note that helps to clarify the meaning and/or the use of a concept
kind: literal
label: scope note
max: inf
range: stringOrLangString
rdfProp: skos:scopeNote
semanticRelation:
descr: Links a concept to a concept related by meaning. This property should not
be used directly, but as a super-property for all properties denoting a relationship
of meaning between concepts
kind: object
label: is in semantic relation with
max: inf
range: Concept
rdfProp: skos:semanticRelation
topConceptOf:
descr: Relates a concept to the concept scheme that it is a top level concept
of
inverseOf: hasTopConcept
kind: object
label: is top concept in scheme
max: inf
range: ConceptScheme
rdfProp: skos:topConceptOf
objects:
Collection:
descr: A meaningful collection of concepts. Labelled collections can be used where
you would like a set of concepts to be displayed under a 'node label' in the
hierarchy
inherits: CollectionInterface
label: Collection
type: skos:Collection
CollectionInterface:
descr: Abstract superclass of Collection
kind: abstract
props:
member: {}
Concept:
descr: An idea or notion; a unit of thought
label: Concept
props:
altLabel: {}
broadMatch: {}
broader: {}
broaderTransitive: {}
changeNote: {}
closeMatch: {}
definition: {}
editorialNote: {}
exactMatch: {}
example: {}
hiddenLabel: {}
historyNote: {}
inScheme: {}
mappingRelation: {}
narrowMatch: {}
narrower: {}
narrowerTransitive: {}
notation: {}
note: {}
prefLabel: {}
related: {}
relatedMatch: {}
scopeNote: {}
semanticRelation: {}
topConceptOf: {}
type: skos:Concept
ConceptScheme:
descr: A concept scheme may be defined to include concepts from different sources.
A set of concepts, optionally including statements about semantic relationships
between those concepts
label: Concept Scheme
props:
hasTopConcept: {}
prefLabel: {}
type: skos:ConceptScheme
OrderedCollection:
descr: An ordered collection of concepts, where both the grouping and the ordering
are meaningful. 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'
inherits: CollectionInterface
label: Ordered Collection
props:
memberList: {}
type: skos:OrderedCollection
rdf:List:
type: rdf:List
The /soml/
endpoint will also return any warnings that have been raised during the conversion.
If you want to set up the language preference support of the conversion as well, you can use the lang
parameter like this:
curl --location --request POST 'localhost:9995/soml' \
--header 'Content-Type: multipart/form-data' \
--header 'Authorization: Bearer JWT_TOKEN' \
--form 'files=@/home/user/data/skos.rdf' \
--form 'files=@/home/user/data/skos-fix.ttl' \
--form 'vocPfx=skos' \
--form 'dryrun=true' \
--form 'lang=fetch: en~,de,ANY, validate: en~,de~,fr~, implicit: en-GB'
This will result in adding the following to the config
section of the yaml schema (For more information about the lang configuration, see Language configurations):
config:
lang:
fetch: en~,de,ANY
validate: en~,de~,fr~
implicit: en-GB
For more examples of ontology conversions, see the OWL2SOML example section.
Differences¶
The Semantic Objects differ from the OWL2SOML tool as follows:
The Semantic Objects use HTTP parameters, whereas the tool is command-line and uses different options:
Semantic Objects | OWL2SOML tool |
---|---|
files |
input files are listed after all options |
dryrun |
prints warnings/errors on STDERR, generated SOML on STDOUT |
vocPfx |
-voc |
id |
-id |
label |
-label |
lang |
-lang |
stringMode |
-string 0,1,2 : same functionality, but the values are integers |
always generates interfaces | -super 0,1 : generate or do not generate interfaces for superclasses |
not supported | -name prop1,prop2 : designate props as class “name” characteristics |
- If a property has multiple
range
-s, the Semantic Objects will try to find such a range that is already defined as anobject
. The OWL2SOML tool picks the first range encountered, and may declare a new object class if it is used as range but not declared. - Semantic Objects assign properties to classes based on
owl:allValuesFrom
andowl:someValuesFrom
. This is described as a restriction in the OWL2SOML tool. - Semantic Objects handle
:propA owl:qualifiedCardinality X.
by setting:propA: {min: X, max: X}
.
Limitations¶
SKOS is a simple example, and the conversion is relatively straightforward. However, for more complex examples there are multiple challenges that are yet to be addressed. For a full list of the currently known transformation limitations, please visit the limitations section of the OWL2SOML tool.