code: private void notReflexive(List<String> conditions,
      QueryNode node, QueryNode target)
    {
      Validate.isTrue(node != target, "notReflexive(...) implies that source "
        + "and target node are not the same, but someone is violating this constraint!");
      Validate.notNull(node);
      Validate.notNull(target);
      
      if(node.getNodeAnnotations().isEmpty() && target.getNodeAnnotations().isEmpty())
      {    
        joinOnNode(conditions, node, target, "<>", "id", "id");
      }
      else if(!node.getNodeAnnotations().isEmpty() && !target.getNodeAnnotations().isEmpty())
      {
        TableAccessStrategy tasNode = tables(node);
        TableAccessStrategy tasTarget = tables(target);
        
        String nodeDifferent = join("<>",
          tasNode.aliasedColumn(NODE_TABLE, "id"), 
          tasTarget.aliasedColumn(NODE_TABLE, "id"));
        
        String annoCatDifferent = join("IS DISTINCT FROM",
          tasNode.aliasedColumn(NODE_ANNOTATION_TABLE, "category"),
          tasTarget.aliasedColumn(NODE_ANNOTATION_TABLE, "category"));
        
        conditions.add("(" 
          + Joiner.on(" OR ").join(nodeDifferent, annoCatDifferent) 
          + ")");
        
      }
    }
docs: Explicitly disallow reflexivity.
  
  Can be used if the other conditions allow reflexivity but the operator not.
  It depends on the search conditions if two results are not equal.
  
  <p>
  <b>For two nodes (including searches for token):</b> <br />
  node IDs are different
  </p>
  
  
  <p>
  <b>If both nodes are an annotation:</b> <br />
  node IDs are different or annotation namespace+name are different
  </p>
  
  <p>
  <b>For a node with and one without annotation condition:</b> <br />
  always different
  </p>
  
  
  @param conditions
  @param node
  @param target