code: def create_or_update(cls, *props, **kwargs):
          
          lazy = kwargs.get('lazy', False)
          relationship = kwargs.get('relationship')
  
          # build merge query, make sure to update only explicitly specified properties
          create_or_update_params = []
          for specified, deflated in [(p, cls.deflate(p, skip_empty=True)) for p in props]:
              create_or_update_params.append({"create": deflated,
                                              "update": dict((k, v) for k, v in deflated.items() if k in specified)})
          query, params = cls._build_merge_query(create_or_update_params, update_existing=True, relationship=relationship,
                                                 lazy=lazy)
  
          if 'streaming' in kwargs:
              warnings.warn('streaming is not supported by bolt, please remove the kwarg',
                            category=DeprecationWarning, stacklevel=1)
  
          # fetch and build instance for each result
          results = db.cypher_query(query, params)
          return [cls.inflate(r[0]) for r in results[0]]
docs: Call to MERGE with parameters map. A new instance will be created and saved if does not already exists,
          this is an atomic operation. If an instance already exists all optional properties specified will be updated.
  
          Note that the post_create hook isn't called after create_or_update
  
          :param props: List of dict arguments to get or create the entities with.
          :type props: tuple
          :param relationship: Optional, relationship to get/create on when new entity is created.
          :param lazy: False by default, specify True to get nodes with id only without the parameters.
          :rtype: list