I am attempting to create an OWL ontology that includes a claimedBy
property that could be a person, organization, or similar "agent" (foaf:Agent
essentially), or could be unowned (owl:Thing claimedBy A
).
I need to be able to differentiate between "it's not known (not in this data set) if anyone has claimed that owl:Thing
or not" and "it is known that specific owl:Thing
is not claimed by anyone, currently".
The goal would be to be able to have a dataset of:
<#Alice> a <https://schema.org/Person> .
<#RedBall> a owl:Thing .
<#GreenBall> a owl:Thing .
<#BlueBall> a owl:Thing .
<#RedBall> claimedBy <#Alice> .
<#GreenBall> claimedBy owl:Nothing .
Which records the knowledge that Alice currently claims the Red ball, the Green ball is available to be claimed, and the Blue ball is in an unknown claimed state (this authority doesn't know one way or the other if the Blue ball is claimed or not).
My thought was to define the property as:
<#claimedBy> a owl:ObjectProperty ;
rdfs:domain owl:Thing ;
rdfs:range [
owl:unionOf (
<http://xmlns.com/foaf/0.1/Agent>
<https://schema.org/Person>
<https://schema.org/Organization>
owl:Nothing
)
] .
But this throws off the WebVOWL tool trying to visualize it. Is this a bug in WebVOWL, or is this a misuse of owl:Nothing
? Do I need to create a specific <Nobody>
instance to make this setup semantically work?
The meaning of Nothing
is that it represents the empty set. How you are using Nothing
(in <#GreenBall> claimedBy owl:Nothing) it implies Nothing
is an individual. Object properties like claimedBy
define relations between individuals.
Here is how you can potentially design this. Your main objective is to distinguish between items that are claimed and unclaimed by agents. Hence, define Agent
and Item
as classes that are disjoint. Agent
can have further subclasses like Person
and Orgranization
. Item
have subclasses KnownToBeClaimed
and KnownToBeUnclaimed
that are disjointed. KnownToBeClaimed
is defined as equivalent to be claimed by at least 1 Agent
. KnownToBeUnclaimed
is defined as items that are known to have a maximum of zero claims.
If you now have an individual knownToBeClaimed
that is an Item
and it is claimed by person1
, a Person
, the reasoner (Hermit or any OWL DL reasoner - not an EL reasoner like ELK) will infer that the knownToBeClaimed
individual belongs to the class KnownToBeClaimed
If you have an individual knownToBeUnclaimed
with type set to Item
and claimedBy max 0 owl:Thing
, the knownToBeUnclaimed
individual will be inferred to belong to the class KnownToBeUnclaimed
.
If you have an item for which no further information is available, this item will only be an item with no inferences as to whether it is claimed or not. If you like, you could add a 3rd subclass called UnknownWhetherClaimed
to Item which is disjoint from KnownToBeClaimed
and KnownToBeUnclaimed
. If you now define an individual that is of type Item
and you state that it is not KnownToBeClaimed and not KnownToBeUnclaimed
, it will infer that the item is UnknownWhetherClaimed
.
Below is the ontology in Manchester syntax.
Prefix: : <http://www.semanticweb.org/henriette007/stackoverflow-77848886/how-to-structure-an-owl-property-that-be-nobody.owl/>
Prefix: so: <http://www.semanticweb.org/henriette007/stackoverflow-77848886/how-to-structure-an-owl-property-that-be-nobody.owl#>
Prefix: owl: <http://www.w3.org/2002/07/owl#>
Prefix: rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Prefix: rdfs: <http://www.w3.org/2000/01/rdf-schema#>
Prefix: xml: <http://www.w3.org/XML/1998/namespace>
Prefix: xsd: <http://www.w3.org/2001/XMLSchema#>
Ontology: <http://www.semanticweb.org/henriette007/stackoverflow-77848886/how-to-structure-an-owl-property-that-be-nobody.owl>
<http://www.semanticweb.org/henriette007/stackoverflow-77848886/v0.1/how-to-structure-an-owl-property-that-be-nobody.owl>
ObjectProperty: so:claimedBy
Class: so:Agent
DisjointWith:
so:Item
Class: so:Item
DisjointUnionOf:
so:KnownToBeClaimed, so:KnownToBeUnclaimed, so:UnknownWhetherClaimed
DisjointWith:
so:Agent
Class: so:KnownToBeClaimed
EquivalentTo:
so:claimedBy some so:Agent
SubClassOf:
so:Item
Class: so:KnownToBeUnclaimed
EquivalentTo:
so:claimedBy max 0 owl:Thing
SubClassOf:
so:Item
Class: so:Organization
SubClassOf:
so:Agent
Class: so:Person
SubClassOf:
so:Agent
Class: so:UnknownWhetherClaimed
SubClassOf:
so:Item
Class: owl:Thing
Individual: so:knownToBeClaimedItem
Types:
so:Item
Facts:
so:claimedBy so:person1
Individual: so:knownToBeUnclaimedItem
Types:
so:Item,
so:claimedBy exactly 0 owl:Thing
Individual: so:person1
Types:
so:Person
Individual: so:unknownWhetherClaimedItem
Types:
so:Item,
(not (so:KnownToBeClaimed))
and (not (so:KnownToBeUnclaimed))
DisjointClasses:
so:KnownToBeClaimed,so:KnownToBeUnclaimed,so:UnknownWhetherClaimed