code: def add_value_node(self, subj: Node, pred: URIRef, val: Union[JsonObj, str, List],
                         valuetype: Optional[URIRef]= None) -> None:
          
          pred_type = self._meta.predicate_type(pred) if not valuetype else valuetype
          # Transform generic resources into specific types
          if pred_type == FHIR.Resource:
              pred_type = FHIR[val.resourceType]
  
          val_meta = FHIRMetaVocEntry(self._vocabulary, pred_type)
          for k, p in val_meta.predicates().items():
              if k in val:
                  self.add_val(subj, p, val, k)
                  if pred == FHIR.CodeableConcept.coding:
                      self.add_type_arc(subj, val)
              elif k == "value" and val_meta.predicate_type(p) == FHIR.Element:
                  # value / Element is the wild card combination -- if there is a "value[x]" in val, emit it where the
                  # type comes from 'x'
                  for vk in val._as_dict.keys():
                      if vk.startswith(k):
                          self.add_val(subj, FHIR['Extension.' + vk], val, vk, self._meta.value_predicate_to_type(vk))
              else:
                  # Can have an extension only without a primary value
                  self.add_extension_val(subj, val, k, p)
docs: Expand val according to the range of pred and add it to the graph
          :param subj: graph subject
          :param pred: graph predicate
          :param val: JSON representation of target object
          :param valuetype: predicate type if it can't be directly determined