code: 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;
      }
docs: This is a helper method which will either find or create a SchemaConcept.
  When a new SchemaConcept is created it is added for validation through it's own creation method for
  example RoleImpl#create(VertexElement, Role).
  <p>
  When an existing SchemaConcept is found it is build via it's get method such as
  RoleImpl#get(VertexElement) and skips validation.
  <p>
  Once the SchemaConcept is found or created a few checks for uniqueness and correct
  Schema.BaseType are performed.
  
  @param label             The Label of the SchemaConcept to find or create
  @param baseType          The Schema.BaseType of the SchemaConcept to find or create
  @param isImplicit        a flag indicating if the label we are creating is for an implicit grakn.core.concept.type.Type or not
  @param newConceptFactory the factory to be using when creating a new SchemaConcept
  @param <T>               The type of SchemaConcept to return
  @return a new or existing SchemaConcept