docs: private T unlinkAttribute(AttributeType<?> attributeToRemove, boolean isKey) {
          Stream<AttributeType> attributeTypes = isKey ? keys() : attributes();
          Schema.ImplicitType ownerSchema = isKey ? Schema.ImplicitType.KEY_OWNER : Schema.ImplicitType.HAS_OWNER;
          Schema.ImplicitType valueSchema = isKey ? Schema.ImplicitType.KEY_VALUE : Schema.ImplicitType.HAS_VALUE;
          Schema.ImplicitType relationSchema = isKey ? Schema.ImplicitType.KEY : Schema.ImplicitType.HAS;
  
          if (attributeTypes.anyMatch(a -> a.equals(attributeToRemove))) {
              Label relationLabel = relationSchema.getLabel(attributeToRemove.label());
              RelationTypeImpl relation = vertex().tx().getSchemaConcept(relationLabel);
              if (attributeToRemove.instances().flatMap(Attribute::owners).anyMatch(thing -> thing.type().equals(this))) {
                  throw TransactionException.illegalUnhasWithInstance(this.label().getValue(), attributeToRemove.label().getValue(), isKey);
              }
  
              Label ownerLabel = ownerSchema.getLabel(attributeToRemove.label());
              Role ownerRole = vertex().tx().getSchemaConcept(ownerLabel);
  
              if (ownerRole == null) {
                  throw TransactionException.illegalUnhasNotExist(this.label().getValue(), attributeToRemove.label().getValue(), isKey);
              } else if (!directPlays().keySet().contains(ownerRole)) {
                  throw TransactionException.illegalUnhasInherited(this.label().getValue(), attributeToRemove.label().getValue(), isKey);
              }
  
              unplay(ownerRole);
  
              // If there are no other Types that own this Attribute, remove the entire implicit relation
              if (!ownerRole.players().iterator().hasNext()) {
                  Label valueLabel = valueSchema.getLabel(attributeToRemove.label());
                  Role valueRole = vertex().tx().getSchemaConcept(valueLabel);
                  attributeToRemove.unplay(valueRole);
  
                  relation.unrelate(ownerRole);
                  relation.unrelate(valueRole);
                  ownerRole.delete();
                  valueRole.delete();
                  relation.delete();
              }
          }
  
          return getThis();
      }