Re: negation as failure

[replied in public-sparql-dev only to avoid cluttering public-owl-dev]]

Thanks Lee, that got me started. However, I'm now seeing strange results
when running this against my real data.

The simplest query finds all a,b,c as follows:

prefix rt: <http://cs.ncl.ac.uk/ib2010_data.1.2/relationType/>

select distinct ?a ?b ?c where
  { ?a rt:sim ?b
  . ?b rt:bi_to ?c
  }

When I run this, I get 30,233 results. Now, if I search for all of those
where in addition, a rt:bi_to c:

select distinct ?a ?b ?c where
  { ?a rt:sim ?b
  . ?b rt:bi_to ?c
  . ?a rt:bi_to ?c
  }

This returns 5,800 results.

Now, we try the negation-as-failure query to pull out things where a
rt:bi_to c is not asserted:

select distinct ?a ?b ?c where
  { ?a rt:sim ?b
  . ?b rt:bi_to ?c
  . OPTIONAL
    { ?a rt:bi_to ?c2
    . FILTER(?c = ?c2)
    }
  . FILTER (!BOUND(?c2))
  }

This returns 29,078 results. Since in every case of the original query,
either a does or a does not rt:bi_to c, I would expect 29,078 + 5,800 to sum
to 30,233. However, this is obviously not the case. So perhaps it's
something to do with this negation clause. Let's try again but flip the
bound filter, to recover a query that should behave the same as the 2nd one
above:

select DISTINCT ?a ?b ?c where
  { ?a rt:sim ?b
  . ?b rt:bi_to ?c
  . OPTIONAL
    { ?a rt:bi_to ?c2
    . FILTER(?c = ?c2)
    }
  . FILTER (BOUND(?c2))
  }

This returns only 2,734 results, which clearly is not equal to 5,800, and
also does not get us to 30,233. Reassuringly, if we drop the filter..bound
clause entirely, we get the count we'd expect.

select DISTINCT ?a ?b ?c where
  { ?a rt:sim ?b
  . ?b rt:bi_to ?c
  . OPTIONAL
    { ?a rt:bi_to ?c2
    . FILTER(?c = ?c2)
    }
  }

This returns 30,233 hits.

I am now utterly perplexed. There's no fancy reasoning going on - this
particular collection of triples have not been introduced to rdfs or owl
reasoning of any sort, so same_as collapsing or any other trickery should
not be happening.

I've been using 4store and its 4s-query application to execute the queries.

Matthew

Received on Tuesday, 3 August 2010 15:11:14 UTC