Ontology Hygiene
Implemented Hygiene tests:
No Untyped references
Any reference to a URI in any context other than as the object of an annotation property must have a type triple for that URI. https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0001.sparql
Crossing domains / ranges
If one property is a sub of another, then the domains (respectively ranges) should not be subClasses in the opposite direction. https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0002sparql
https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0003.sparql
Labels and Definitions
Every Class and Property defined in FIBO must have an rdfs:label and a skos:definition https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0004.sparql
Ontology Metadata
Every Ontology defined in FIBO must have a rdfs:label, sm:copyright, dct:license, dct:abstract https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0005.sparql
String printability
Text should not use special characters https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0114.sparql
References to owl:Thing
We should not make explicit references to owl:Thing https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene0268.sparql
Unique Labels
Labels should be unique across FIBO for classes and properties. https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene1067.sparql
Multiple Inverses
Object properties shouldn't have more than one inverse. https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene1078.sparql
Annotation vocabulary
rdfs:comment shouldn't be used for FIBO annotation.https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene1079.sparql
Equivalent Named Classes
Equivalent classes may indicate polysemy spread accross multiple classes https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene1103.sparql
Disjunctive definitions
Definitions should not contain the "or" connective. https://github.com/edmcouncil/fibo/blob/master/etc/testing/hygiene/testHygiene1127.sparql
Proposed Hygiene tests:
Definition Format
https://wiki.edmcouncil.org/display/FLT/Policy+for+Naming+Conventions
No property may have more than one inverse
SPARQL:
SELECT ?p1 ?p2 ?p
WHERE { ?p1 owl:inverseOf ?p.
?p2 owl:inverseOf ?p.
FILTER (?p1 != ?p2) }
Annotations Conventions
Do not use rdfs:Comment for anything. Here is a SPARQL query to catch them. I found two, so this is no big deal.
SELECT ?Resource ?Type ?Comment
WHERE { ?Resource rdf:type ?Type .
?Resource rdfs:comment ?Comment.
FILTER(?Type in (owl:Class, owl:DatatypeProperty,owl:ObjectProperty ))
FILTER(!(STRSTARTS(STR(?Resource), # ignore things in owl namespace
"http://www.w3.org/2002/07/owl#") ))
FILTER(!(STRSTARTS(STR(?Resource), # ignore things in skos namespace
"http://www.w3.org/2004/02/skos/core#") ))
}
ORDER BY ?Type ?Resource
No Unused Imports
Do not import an ontology unless something in it is explicitly referenced.
Here is some pseudo-SPARQL which assumes we've used the nQuads - not sure of the graph selection syntax
SELECT ?Importer ?UnusedImported
WHERE (?Importer a owl:Ontology.
?Importer owl:imports ?UnusedImported.
?ImportedElement rdfs:isDefinedBy ?UnusedImported.
FILTER NOT EXISTS {
GRAPH ?g {?Importer a owl:Ontology # select the named graph containing the triple defining the ontology
?x ?p ?ImportedElement. # check to see if an imported element is the object of a triple in this graph
}
}}
No Unsatisfied References
Any resource referenced should be explicitly declared.
Here is some SPARQL which should be run without inferencing.
SELECT ?source ?property ?ref
WHERE {?property a owl:ObjectProperty.
?source ?property ?ref.
FILTER NOT EXISTS{?ref rdf:type ?t}
}