In OWL 2 Web Ontology Language RDF-Based Semantics (Second Edition) , section §6.4, you can see the set of triples implicitly presumed to be true by a reasoner. A relevant excerpt:
owl:Thing rdf:type owl:Class . # table 6.1
rdfs:Class rdfs:subClassOf owl:Class . # table 6.3
rdfs:Resource rdfs:subClassOf owl:Thing . # table 6.3
Therefore, it is completely legal for the OWL reasoner to infer oslc:Error rdf:type owl:Class
in addition to oslc:Error rdf:type rdfs:Class
.
Again, the semantics of OWL are inferrential. The range constraint rdfs:Class rdfs:subClassOf owl:Class .
means “anything you see that happens to be rdfs:Class can also be assumed to be an owl:Class”. Contrast that to this SHACL shape:
ex:OslcErrorShape
a sh:NodeShape ;
sh:targetClass oslc:Error ;
sh:property [
sh:path rdf:type ;
sh:class rdfs:Class ;
] .
Which means “for an RDF resource that has a type oslc:Error to be valid, it must be an instance of rdfs:Class to begin with”. These are, as you see, are model-checking semantics.
If a user wanted to use an OWL domain ontology (widely-done, including MBE domains), will tools that work with an OSLC domain ontology also work with an OWL domain ontology?
OSLC clients and servers typically know nothing about inference. Therefore, if you want to use ontologies and reasoning in an OSLC ecosystem, my suggestion is to set up an RDFS/OWL reasoner on your server (like the in-mem OWLAPI you mentioned) and set the marshaller to produce output with full entailments. Here is a small example how I can produce a Turtle file with entailments on the command line (you may find ldsw-scraper/data at main · berezovskyi/ldsw-scraper · GitHub moderately useful for manually combining various vocabularies and ontologies for reasoning over their union; riot is a tool from the Jena toolkit):
riot --formatted=turtle --check --strict requirements-management-vocab.ttl \
./ldsw-scraper/data/d/dc/terms/dcterms.ttl \
./ldsw-scraper/data/d/dc/elements/dc.ttl \
./oslc-op/oslc-specs/specs/core/core-vocab.ttl \
./ldsw-scraper/data/w/w3c/rdf/rdf.ttl \
owl.ttl \
./ldsw-scraper/data/v/vann/vann-vocab.rdf .\
/ldsw-scraper/data/w/w3c/w3c-ldp.ttl > OWL_RM.ttl
riot --check --strict --rdfs=OWL_RM.ttl \
--formatted=turtle --verbose \
requirements-management-vocab.ttl > requirements-management-vocab_RIOT_OWL.ttl
Then you can compare two resource definitions. One from the published vocabulary:
oslc_rm:Requirement a rdfs:Class ;
rdfs:comment "Statement of need." ;
rdfs:isDefinedBy oslc_rm: ;
rdfs:label "Requirement" .
One with all RDFS entailments:
oslc_rm:Requirement rdf:type rdfs:Resource , rdfs:Class;
rdfs:comment "Statement of need.";
rdfs:isDefinedBy oslc_rm:;
rdfs:label "Requirement" .
This allows the consumer to interpret the RDF graph response without a need for OWL tooling (though it is somewhat inefficient and a tad bit verbose).
P.S. Apologies, I hit enter too soon.