docs: private <T extends SchemaConcept> T putSchemaConcept(Label label, Schema.BaseType baseType, boolean isImplicit, Function<VertexElement, T> newConceptFactory) {
          //Get the type if it already exists otherwise build a new one
          SchemaConceptImpl schemaConcept = getSchemaConcept(convertToId(label));
          if (schemaConcept == null) {
              if (!isImplicit && label.getValue().startsWith(Schema.ImplicitType.RESERVED.getValue())) {
                  throw TransactionException.invalidLabelStart(label);
              }
  
              VertexElement vertexElement = addTypeVertex(getNextId(), label, baseType);
  
              //Mark it as implicit here so we don't have to pass it down the constructors
              if (isImplicit) {
                  vertexElement.property(Schema.VertexProperty.IS_IMPLICIT, true);
              }
  
              // if the schema concept is not in janus, create it here
              schemaConcept = SchemaConceptImpl.from(newConceptFactory.apply(vertexElement));
          } else if (!baseType.equals(schemaConcept.baseType())) {
              throw labelTaken(schemaConcept);
          }
  
          //noinspection unchecked
          return (T) schemaConcept;
      }