@Handle
  public ClientApiSuccess handle(
      @Required(name = "graphVertexId") String graphVertexId,
      @Required(name = "propertyKey") String propertyKey,
      @Required(name = "propertyName") String propertyName,
      @ActiveWorkspaceId String workspaceId,
      User user,
      Authorizations authorizations)
      throws Exception {
    OntologyProperty ontologyProperty = ontologyRepository.getRequiredPropertyByIRI(propertyName);

    Vertex vertex = graph.getVertex(graphVertexId, authorizations);

    if (!aclProvider.canDeleteProperty(vertex, propertyKey, propertyName, user)) {
      throw new VisalloAccessDeniedException(
          propertyName + " is not deleteable", user, graphVertexId);
    }

    boolean isComment = VisalloProperties.COMMENT.getPropertyName().equals(propertyName);
    if (isComment && autoPublishComments) {
      workspaceId = null;
    }

    workspaceHelper.deleteProperties(
        vertex, propertyKey, propertyName, ontologyProperty, workspaceId, authorizations, user);

    return VisalloResponse.SUCCESS;
  }
  @Inject
  public VertexiumUserRepository(
      Configuration configuration,
      SimpleOrmSession simpleOrmSession,
      AuthorizationRepository authorizationRepository,
      Graph graph,
      OntologyRepository ontologyRepository,
      UserSessionCounterRepository userSessionCounterRepository,
      WorkQueueRepository workQueueRepository,
      UserNotificationRepository userNotificationRepository,
      LockRepository lockRepository) {
    super(
        configuration,
        simpleOrmSession,
        userSessionCounterRepository,
        workQueueRepository,
        userNotificationRepository,
        lockRepository);
    this.authorizationRepository = authorizationRepository;
    this.graph = graph;

    authorizationRepository.addAuthorizationToGraph(VISIBILITY_STRING);
    authorizationRepository.addAuthorizationToGraph(VisalloVisibility.SUPER_USER_VISIBILITY_STRING);

    Concept userConcept =
        ontologyRepository.getOrCreateConcept(null, USER_CONCEPT_IRI, "visalloUser", null);
    userConceptId = userConcept.getIRI();

    Set<String> authorizationsSet = new HashSet<>();
    authorizationsSet.add(VISIBILITY_STRING);
    authorizationsSet.add(VisalloVisibility.SUPER_USER_VISIBILITY_STRING);
    this.authorizations = graph.createAuthorizations(authorizationsSet);
  }
  @Handle
  public void handle(
      @Required(name = "concept") String conceptIRI,
      @Required(name = "displayName") String displayName,
      @Required(name = "color") String color,
      @Required(name = "displayType") String displayType,
      @Required(name = "titleFormula") String titleFormula,
      @Required(name = "subtitleFormula") String subtitleFormula,
      @Required(name = "timeFormula") String timeFormula,
      @Required(name = "addRelatedConceptWhiteList[]") String[] addRelatedConceptWhiteListArg,
      @Required(name = "intents[]") String[] intents,
      @Optional(name = "searchable", defaultValue = "true") boolean searchable,
      @Optional(name = "addable", defaultValue = "true") boolean addable,
      @Optional(name = "userVisible", defaultValue = "true") boolean userVisible,
      User user,
      Authorizations authorizations,
      VisalloResponse response)
      throws Exception {
    HashSet<String> addRelatedConceptWhiteList =
        new HashSet<>(Arrays.asList(addRelatedConceptWhiteListArg));

    Concept concept = ontologyRepository.getConceptByIRI(conceptIRI);
    if (concept == null) {
      response.respondWithNotFound("concept " + conceptIRI + " not found");
      return;
    }

    if (displayName.length() != 0) {
      concept.setProperty(
          OntologyProperties.DISPLAY_NAME.getPropertyName(), displayName, authorizations);
    }

    if (color.length() != 0) {
      concept.setProperty(OntologyProperties.COLOR.getPropertyName(), color, authorizations);
    }

    JSONArray whiteList = new JSONArray();
    for (String whitelistIri : addRelatedConceptWhiteList) {
      whiteList.put(whitelistIri);
    }
    concept.setProperty(
        OntologyProperties.ADD_RELATED_CONCEPT_WHITE_LIST.getPropertyName(),
        whiteList.toString(),
        authorizations);

    concept.setProperty(
        OntologyProperties.DISPLAY_TYPE.getPropertyName(), displayType, authorizations);
    concept.setProperty(
        OntologyProperties.SEARCHABLE.getPropertyName(), searchable, authorizations);
    concept.setProperty(OntologyProperties.ADDABLE.getPropertyName(), addable, authorizations);
    concept.setProperty(
        OntologyProperties.USER_VISIBLE.getPropertyName(), userVisible, authorizations);

    if (titleFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.TITLE_FORMULA.getPropertyName(), titleFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.TITLE_FORMULA.getPropertyName(), authorizations);
    }

    if (subtitleFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.SUBTITLE_FORMULA.getPropertyName(), subtitleFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.SUBTITLE_FORMULA.getPropertyName(), authorizations);
    }

    if (timeFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.TIME_FORMULA.getPropertyName(), timeFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.TIME_FORMULA.getPropertyName(), authorizations);
    }

    concept.updateIntents(StringArrayUtil.removeNullOrEmptyElements(intents), authorizations);

    ontologyRepository.clearCache();

    response.respondWithSuccessJson();
  }