Let's say that I have this information
Individual | Sex | HairColor
---------------------------------------
Joseph | Male | Black
Peter | Male | Black
Kevin | Male | Blonde
Andrew | Male | Brown
Boris | Male | Brown
Chistine | Female | Black
Julia | Female | Black
Julieth | Female | Brown
Judith | Female | Brown
Mary | Female | Blonde
My individuals are all different. I have the class Male and Female asserted to each one. And I also have the property hasHairColor asserted to everyone with its value.
The question is, how can I query all the males with hair color different from black (the ontology may have many other hair colors)?
So far, I have tryied this queries with faulty results...
1. Male(?x) ^ Male(?y) ^ hasHairColor(?y, "Black") ^ differentFrom(?x, ?y) -> sqwrl:select(?x)
2. Male(?x) ^ Male(?y) ^ hasHairColor(?y, "Black") . sqwrl:makeSet(?males, ?x) ^ sqwrl:groupBy(?males, ?x) ^ sqwrl:makeSet(?blacks, ?y) ^ sqwrl:groupBy(?blacks, ?y) . sqwrl:notEqual(?males, ?blacks) -> sqwrl:select(?x)
3. Male(?x) ^ Male(?y) ^ hasHairColor(?y, "Black") . sqwrl:makeSet(?males, ?x) ^ sqwrl:groupBy(?males, ?x) ^ sqwrl:makeSet(?blacks, ?y) ^ sqwrl:groupBy(?blacks, ?y) . sqwrl:difference(?diff, ?males, ?blacks) -> sqwrl:select(?x)
I'm missing something in the way the joins are made. The result works but only when one of the sets has only one element (i.e. if I try to remove blondes)
I'm using Protege 5.2 with the SWRL and SQWRL Tab 2.0.5
Thanks in advance