private void editTag(Instruction instr, DatabaseCore core) {
    Map<String, Object> data = instr.getData();
    ModifiableTag tag = core.getTagChecked(instr.getTarget());

    if (data.containsKey("name")) tag.setName(data.get("name").toString());
    if (data.containsKey("parent")) {
      int newParentID = (int) data.get("parent");

      ModifiableTag oldParent = ((ModifiableTag) tag.getParent());
      ModifiableTag newParent = core.getTagChecked(newParentID);

      if (newParentID == oldParent.getID()) return; // beze změny - stejný nadřazený štítek

      if (Tags.sameBranch(tag, newParent)) throw new RuntimeException("same branch!");

      // odstranění odkazu z předchozího nadřazeného štítku
      oldParent.removeChild(tag);

      tag.setParent(newParent);
      newParent.addChild(tag);
    }
  }
  private void createTag(Instruction instr, DatabaseCore databaseCore) {
    Map<String, Object> data = instr.getData();
    ModifiableTag tag =
        databaseCore
            .getDataFactory()
            .createTag(instr.getTarget(), data.getOrDefault("name", "").toString());

    ModifiableTag parent;

    if (data.containsKey("parent")) { // explicitně uvedeno
      int parentID = (int) data.get("parent");
      parent = databaseCore.getTagChecked(parentID);

    } else { // výchozí - ROOT
      parent = databaseCore.getRootTag();
    }

    tag.setParent(parent);
    parent.addChild(tag);

    databaseCore.addTag(tag);
  }