swrlapi
swrlapi copied to clipboard
SQWRL Difference of Grouped Sets Not Working
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)
The difference operations should be doing something like: set1 (a, b, c, d) - set2 (c, d) = set3 (a, b) Instead they are doing some kind of distribution product to compare the differences. They are joining each value of the sets and then comparing the pair of values and letting the difference pairs only.
(x,y)
(a,c) = diff
(a,d) = diff
(b,c) = diff
(b,d) = diff
(c,c) = equal
(c,d) = diff
(d,c) = diff
(d,d) = equal
All the x different from the y according to the previous table are (a, a, b, b, c, d) giving the same distinct result of the original set1 (a, b, c, d).
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
You do not need to use the group operator .
Take a look at this query:
https://github.com/protegeproject/swrlapi/wiki/SQWRLCollections#negation-as-failure
I'm using that information as a reference. If I use the sqwrl:size(?n, ?s3) and sqwrl:select(?n) I get the right lenght answer but if I sqwrl:select(?x) the result doesn't match the lenght of the size.
For the hair color example: (Joseph, Peter, Kevin, Andrew, Boris) - (Joseph, Peter) using the sqwrl:size(?n, ?s3) -> sqwrl:select(?n) I get the leght [3], but if I do a -> sqwrl:select(?x) I'm getting five individuals. The result should be (Kevin, Andrew, Boris) but I'm getting all five again.
Thanks for replying Martin
Can you post the ontology (change .owl to .owl.txt because GitHub does not support the .owl extension) and I can take a look.