anchor.diff:      ;
       
   groupGraphPatternSub
  -    : triplesBlock? ( groupGraphPatternSubCache )* -> triplesBlock* groupGraphPatternSubCache*
  -    ;
  -
  -groupGraphPatternSubCache
  -    :  graphPatternNotTriples DOT? triplesBlock? -> graphPatternNotTriples triplesBlock?
  +    : triplesBlock? (graphPatternNotTriples DOT? triplesBlock?)* -> triplesBlock? (graphPatternNotTriples triplesBlock?)*
       ; 	
   
   triplesBlock
  
positive.code:     ;
  
  triplesSameSubject
      : varOrTerm! propertyListNotEmpty[(CommonTree) $varOrTerm.tree]
      | triplesNode propertyListNotEmpty[(CommonTree) $triplesNode.tree]?
      ;
  
  propertyListNotEmpty[CommonTree subject]
  
negative.code:     ;
    
  constructQuery
      : CONSTRUCT constructTemplate datasetClause* whereClause solutionModifier -> ^(CONSTRUCT constructTemplate datasetClause* whereClause* solutionModifier?)
      | CONSTRUCT datasetClause* WHERE OPEN_CURLY_BRACE triplesTemplate? CLOSE_CURLY_BRACE solutionModifier -> ^(CONSTRUCT datasetClause* ^(WHERE triplesTemplate*) solutionModifier?)
      ;
  
  describeQuery
      : DESCRIBE ( (v+=varOrIRIref)+ | ASTERISK ) datasetClause* whereClause? solutionModifier -> ^(DESCRIBE $v* ASTERISK* datasetClause* whereClause? solutionModifier?)
      ;
  
  askQuery
  