This documents a simple example of using OWL to import data into a shared "interface" ontology.
@prefix vs: <http://www.w3.org/2013/05/11179/VS#> . @prefix vss: <http://www.w3.org/2013/05/11179/VS-shared#> . @prefix system1: <http://codesystem1.example/ex#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @base <http://www.w3.org/2013/05/11179/VS> . <http://www.w3.org/2013/05/11179/VS> a owl:Ontology .
With SPARQL, you can translate assertions in one value set to another with a "rule" like
CONSTRUCT { ?s vs:gender :Female } WHERE { ?s system1:sex "F" }
Rules like this can be written in OWL. The RDF in this section is from VS.ttl. Here, I declare the vs:gender and system1:sex properties and then say that everything which has a system1:sex of "F" must have a vs:gender of vs:Female:
vs:gender a owl:ObjectProperty . system1:sex a owl:DatatypeProperty . system1:sex_to_gender_F rdfs:subClassOf [ owl:onProperty vs:gender ; owl:hasValue vs:Female ] ; owl:equivalentClass [ owl:onProperty system1:sex ; owl:hasValue "F" ] .
The last two lines can be read as:
"owl:onProperty vs:gender ; owl:hasValue vs:Female" — There's a class of things with a vs:gender of vs:Female.
"system1:sex_to_gender_F rdfs:subClassOf …" — system1:sex_to_gender_F is a subclass of this class, so every system1:sex_to_gender_F also has a vs:gender of vs:Female.
Everything with a system1:sex of "F" is in the class system1:sex_to_gender_F.
In principle, it's unnecessary to label system1:sex_to_gender_F, which is the class of things with a system1:sex of "F".
We could replace that label with a fresh blank node [ ]
.
[ ] rdfs:subClassOf [ owl:onProperty vs:gender ; owl:hasValue vs:Female ] ; owl:equivalentClass [ owl:onProperty system1:sex ; owl:hasValue "F" ] .
The OWL API whines when there's no label, calling the class instead <http://org.semanticweb.owlapi#Error1> . In the interest of aesthetics, we'll keep a label, but once we build up a shared ontology, we'll pick a name from it.
We can provide some test data:
<Sue> system1:sex "F" .
and look in protégé's Individuals
tab for Sue
under members of owl:Thing
.
You should see a pane called Property assertions: Sue
which, after you've run the reasoner (control R) should include the inferred object property assertion: gender Female
The RDF in this document is from VS-shared.ttl.
In the interest of describing our value set, we can write down some rules:
The permissible values for vss:gender are vss:Male and vss:Female.
vss:GenderVS owl:oneOf ( vss:Male vss:Female ) . vss:gender a owl:ObjectProperty ; rdfs:range [ owl:onProperty vss:gender ; owl:allValuesFrom vss:GenderVS ] .
This is a standard idiom to "partition" a class vss:Gendered into a set of subclasses, here vss:MaleThing and vss:FemaleThing.
vss:Gendered a owl:Class ; owl:equivalentClass [ a owl:Class ; owl:oneOf ( vss:MaleThing vss:FemaleThing ) ] . vss:MaleThing rdfs:subClassOf vss:Gendered ; owl:differentFrom vss:FemaleThing . vss:FemaleThing rdfs:subClassOf vss:Gendered ; owl:differentFrom vss:MaleThing .
We add that vss:MaleThing and vss:FemaleThing have a vss:gender of vss:Male and vss:Female respectively.
vss:MaleThing rdfs:subClassOf [ owl:onProperty vss:gender ; owl:hasValue vss:Male ] . vss:FemaleThing rdfs:subClassOf [ owl:onProperty vss:gender ; owl:hasValue vss:Female ] .
Given this, if we have a concept system1:sex which we want to re-express as vss:gender, we no longer have to invent a label like system1:sex_to_gender_F as we did above. Instead, we can use the classes vss:MaleThing and vss:FemaleThing.
vss:MaleThing owl:equivalentClass [ owl:onProperty system1:sex ; owl:hasValue "M" ] . vss:FemaleThing owl:equivalentClass [ owl:onProperty system1:sex ; owl:hasValue "F" ] .
Again, we test our rules with some data using system1:sex:
# Some test data. <Bob> system1:sex "M" . <Sue> system1:sex "F" .
Protégé infers that <Bob> vss:gender vss:Male and <Sue> vss:gender vss:Female, as we'd expect.
$Revision: 1.5 $ of $Date: 2013/05/11 21:29:09 $ by $Author: eric $