anchor.diff:  
   %%
   %% return predicate schema (variable binding to keys) 
  -schema([S, P]) ->
  +schema(geo, [S, P|_]) ->
      [{S, s}, {P, p}];
  -schema([S, P, O]) ->
  +schema(_, [S, P]) ->
  +   [{S, s}, {P, p}];
  +schema(_, [S, P, O]) ->
      [{S, s}, {P, p}, {O, o}];
  -schema([S, P, O, _]) ->
  +schema(_, [S, P, O, _]) ->
      [{S, s}, {P, p}, {O, o}];
  -schema([S, P, O, _, K]) ->
  +schema(_, [S, P, O, _, K]) ->
      [{S, s}, {P, p}, {O, o}, {K, k}].
   
   %%
  
positive.code: 
  %%
  %% split query to pattern match and filters
  q_split(#{'_' := Head} = Pattern) ->
     lists:foldl(
        fun
        ({Pkey, Jkey}, {P, F} = Acc) when is_atom(Pkey) ->
  
negative.code:          {[{Jkey, Pkey}|P], F}
        end,
        {[], []},
        schema(Fun, Head)
     ).
  
  %%
  