constructor(id, data) {

    // we do not simply use the provided id but disassemble and
    // reassemble it again to ensure the id is well formatted.
    const { marker, namespace, name } = EdgeType.getIdParts(id);
    id = EdgeType.getId(marker, namespace, name);

    // call the parent constructor
    super(id, env.path.edgeTypes, EdgeType.fieldMeta, data);

    this.id = id;
    this.marker = marker;
    this.name = name;
    this.namespace = namespace;

    const arrows = (this.style || {}).arrows;

    if (arrows) {

      this.invertedArrow = isArrowEnabled(arrows, 'from');
      this.toArrow = isArrowEnabled(arrows, 'to') || isArrowEnabled(arrows, 'middle');
      // determine if bi arrows (either from+to or no arrows)
      this.biArrow = (this.invertedArrow === this.toArrow);

      if (this.biArrow) {
        this.toArrow = true;
        this.invertedArrow = true;
      }

    } else {

      this.toArrow = true;
    }

    Object.freeze(this);

  }
@param {EdgeTypeId} id
@param {Object} [data] @see http://visjs.org/docs/network/edges.html