1

I'm currently working on some small examples about Apache Jena. What I want to show is universal quantification.

Let's say I have balls that each have a different color. These balls are stored within boxes. I now want to determine whether these boxes only contain balls that have the same color of if they are mixed.

So basically something along these lines: SAME_COLOR = ∃x∀y:{y in Box a → color of y = x}

I know that this is probably not possible with Jena, and can be converted to the following: SAME_COLOR = ∃x¬∃y:{y in Box a → color of y != x}

With "not exists" Jena's "NoValue" can be used, however, this does (at least for me) not work and I don't know how to translate above logical representations in Jena. Any thoughts on this?

See the code below, which is the only way I could think of:

(?box, ex:isA, ex:Box)
(?ball, ex:isIn, ?box)
(?ball, ex:hasColor, ?color)
(?ball2, ex:isIn, ?box)
(?ball2, ex:hasColor, ?color2)
NotEqual(?color, ?color2)
->
(?box, ex:hasSomeColors, "No").


(?box, ex:isA, ex:Box)
NoValue(?box, ex:hasSomeColors)
->
(?box, ex:hasSomeColors, "Yes").

A box with mixed content now has both values "Yes" and "No".

zerqo
  • 11
  • 1

1 Answers1

1

I've ran into the same sort of problem, which is more simplified. The question is how to get a collection of objects or count no. of objects in rule engine. Given that res:subj ont:has res:obj_xxx(several objects), how to get this value in rule engine?

But I just found a Primitive called Remove(), which may inspire me a bit.

  • I've resolved my problems. You can refer to source code `org.apache.jena.reasoner.rulesys.builtins.countLiteralValues` at github. Just write a Primitive and rebuild jena, so you can use the diy primitive in your rule file. – Yunfeng Wang Jun 28 '19 at 07:27