-
-
Save niklasl/cf8871f82564749153d929f747228ef3 to your computer and use it in GitHub Desktop.
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |
prefix owl: <http://www.w3.org/2002/07/owl#> | |
prefix : <http://example.org/ns#> | |
base <http://example.org/> | |
# TBox: | |
:Truth rdfs:subClassOf [ owl:onProperty rdf:reifies ; owl:allValuesFrom :Fact ] . | |
:Fact owl:equivalentClass [ owl:onProperty _:selfOfTypeFact ; owl:hasSelf true ] , | |
[ owl:onProperty rdf:predicate ; | |
owl:allValuesFrom [ owl:onProperty owl:propertyChainAxiom ; | |
owl:hasValue ( | |
[ owl:inverseOf rdf:subject ] | |
_:selfOfTypeFact | |
rdf:object | |
) ] ] . | |
# ABox: | |
[] a :Truth ; | |
rdf:reifies [ rdf:subject <some> ; rdf:predicate :such ; rdf:object <thing> ] , | |
[ rdf:subject <other> ; rdf:predicate :such ; rdf:object <stuff> ] . | |
# Entails: | |
# <some> :such <thing> . | |
# <other> :such <stuff> . |
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |
prefix owl: <http://www.w3.org/2002/07/owl#> | |
prefix : <http://example.org/ns#> | |
base <http://example.org/> | |
# TBox: | |
:Truth rdfs:subClassOf [ owl:onProperty rdf:reifies ; owl:allValuesFrom :Fact ] . | |
[ owl:onProperty _:a_Fact ; owl:hasSelf true ] owl:equivalentClass :Fact . | |
_:factSubject | |
rdfs:subPropertyOf [ owl:inverseOf rdf:type ] ; | |
owl:propertyChainAxiom ( _:a_Fact rdf:tripleSubject ) . | |
_:factPredicate | |
rdfs:subPropertyOf owl:onProperty ; | |
owl:propertyChainAxiom ( _:a_Fact rdf:triplePredicate ) . | |
_:factObject | |
rdfs:subPropertyOf owl:hasValue ; | |
owl:propertyChainAxiom ( _:a_Fact rdf:tripleObject ) . | |
# ABox: | |
[] a :Truth ; | |
rdf:reifies [ rdf:tripleSubject <some> ; rdf:triplePredicate :such1 ; rdf:tripleObject <thing> ] , | |
[ rdf:tripleSubject <other> ; rdf:triplePredicate :such2 ; rdf:tripleObject <stuff> ] . | |
# Entails: | |
# <some> :such1 <thing> . | |
# <other> :such2 <stuff> . |
Wow, that's super clever :-)
However, I don't think it really works as you expect.
If you replaced your Abox with the following (replacing :such
with :such1
and :such2
):
[] a :Truth ;
rdf:reifies [ rdf:subject <some> ; rdf:predicate :such1 ; rdf:object <thing> ] ,
[ rdf:subject <other> ; rdf:predicate :such2 ; rdf:object <stuff> ] .
I believe it wouldn't it entail all the following:
<some> :such1 <thing> .
<other> :such1 <stuff> . # you probably don't want that one
<some> :such2 <thing> . # you probably don't want that one either
<other> :such2 <stuff> .
Also, I am not sure that your example complies with OWL-RL. More precisely, I suspect that using owl:propertyChainAxiom
as the value of owl:onProperty
does not fit in the syntactic restrictions of OWL-RL, or even the syntactic structure of OWL as such.
Thank you @pchampin for noting this!
You're absolutely right; this appears to say that any property used as a reified predicate in any of these "facts" hold between all subject, objects pairs of every "fact"! That's certainly not desired. (Never use an all-quantifier without checking for more false positives!)
Also yes, that is an important caveat: this may very well be "ill-formed" OWL. Entailing more OWL rules like this is rather hazardous...
Added variant which seems to fare better.
See OWL RL Reasoner results.