code: @Override
      public void removedStatement(final Statement s) {
          if (Operation.REMOVE == statements.get(s)) {
              return;
          }
          try {
              // if it's not about the right kind of node, ignore it.
              final Resource subject = s.getSubject();
              validateSubject(subject);
              LOGGER.trace(">> removing statement {}", s);
  
              final FedoraResource resource = idTranslator.convert(subject);
              final FedoraResource description = resource.getDescription();
  
              // special logic for handling rdf:type updates.
              // if the object is an already-existing mixin, update
              // the node's mixins. If it isn't, just treat it normally.
              final Property property = s.getPredicate();
              final RDFNode objectNode = s.getObject();
  
              if (property.equals(RDF.type) && objectNode.isResource()) {
                  final Resource mixinResource = objectNode.asResource();
                  jcrRdfTools.removeMixin(description, mixinResource, s.getModel().getNsPrefixMap());
                  statements.put(s, Operation.REMOVE);
                  return;
              }
  
              jcrRdfTools.removeProperty(description, property, objectNode, s.getModel().getNsPrefixMap());
              statements.put(s, Operation.REMOVE);
          } catch (final ConstraintViolationException e) {
              throw e;
          } catch (final RepositoryException | RepositoryRuntimeException e) {
              exceptions.add(e);
          }
  
      }
docs: When a statement is removed, remove it from the JCR properties
  
  @param s the given statement