I have need to identify 0 or more type resources from a given set as having
been asserted as types of a given subject entity; if none matches, I’d like to
bind some default resource to symbol a non-match.
So, I have a set of “whitelisted” types
VALUES ?entType { ex:T1 ex:T2 ex:T3 }
and I’m looking to match an entity against those types in this way:
?E a ?entType.
It’s fine to match more than one (although I’d rather not, but that’s a
separate discussion).
In cases where there’s no match, I’d then like to force bind ?entType to, e.g.,
ex:T0 or owl:Thing.
To survive a non-match, the type match would likely need to be wrapped in an
OPTIONAL block, likely with the VALUES statement in there too(?):
OPTIONAL {
VALUES ?entTypeS { ex:T1 ex:T2 ex:T3 }
?E a ?entTypeS.
}
(Note the “S” in ?entTypeS - that’s for the next bit).
I’ve tried a conditional BIND
BIND(IF(BOUND(?entType), ?entType, ex:T0) as ?entType)
and also s COALESCE
BIND(COALESCE(?entTypeS, ex:T0) as ?entType)
But it seems that neither works as I’d like. I appears that, even though
optional, the test against the VALUES set acts as a constraint.
I’ve also tried a FILTER, with
FILTER ( ?E1T in ( ex:T1, ex:T2, ex:T3 ))
BIND(COALESCE(?E1T, ex:T0) as ?E1Type)
That’s not even getting to executing (yet) - some non-parsing error on DBPedia
Live.
Have I stated the problem clearly enough? What might be other ways to address
this?
Thanks,
Mark