@Override
 public ImmutableSubjectData addParent(
     Set<Entry<String, String>> segments, String type, String ident) {
   Segment entry = getSegmentOrNew(segments);
   final SubjectRef parentIdent = SubjectRef.unresolved(type, ident);
   if (entry.getParents() != null && entry.getParents().contains(parentIdent)) {
     return this;
   }
   return newWithUpdated(segments, entry.withAddedParent(parentIdent));
 }
 @Override
 public ImmutableSubjectData setParents(
     Set<Entry<String, String>> segments, List<Entry<String, String>> parents) {
   Segment entry = getSegmentOrNew(segments);
   return newWithUpdated(
       segments,
       entry.withParents(
           Lists.transform(
               parents,
               ent ->
                   ent instanceof SubjectRef
                       ? (SubjectRef) ent
                       : SubjectRef.unresolved(ent.getKey(), ent.getValue()))));
 }
  @Override
  public ImmutableSubjectData removeParent(
      Set<Entry<String, String>> segments, String type, String identifier) {
    Segment ent = this.segments.get(segments);
    if (ent == null) {
      return this;
    }

    final SubjectRef parentIdent = SubjectRef.unresolved(type, identifier);
    if (ent.getParents() == null || !ent.getParents().contains(parentIdent)) {
      return this;
    }
    return newWithUpdated(segments, ent.withRemovedParent(parentIdent));
  }