Property Path Cardinality Mixing

If we have some forms that are distinct and some counting, then we need 
an account for what happens when they are mixed.

The obvious (to me) way is that it simply follows the combination of 
operators.  Distinct operators only yield distinct results even if used 
over a path expression which may have duplicates;  Counting operators 
that combine distinct sub-operators may cause duplicates but don't 
change the sub-operators.

Support for these examples, assume | is not distinct and * is distinct:

Example 1:  (:a|:b)+ is distinct.
Example 2:  a+|b+  is not distinct.

:x1 :a :x2 .
:x1 :b :x2 .

{ :x1 :a+ ?X }
    ?X => ?X = :x2

{ :x1 :b+ ?X }
    ?X => ?X = :x2

Then { :x1 (:a|:b)+ ?X }
    ?X = :x2

But  { :x1 :a+|:b+ ?X }
      => { :x1 :b+ ?X } UNION { :x1 :b+ ?X }
      =>    ?X = :x2 and ?X = :x2

In implementation terms, it just works out by combination of subparts.
(An optimization includes a one bit flag to say if evaluating a form 
inside a context that will be distinct so the form only needs to be 
distinct and can otherwise be loose extra cardinality for efficiency.)


Received on Sunday, 18 March 2012 16:47:07 UTC