def upsert_vertex()

in neptune-python-utils/neptune_python_utils/batch_utils.py [0:0]


def upsert_vertex(t, row, **kwargs):
    
    mappings = kwargs['mappings']
    label = kwargs['label'] if 'label' in kwargs else mappings.get_label(row)
    on_upsert = kwargs.get('on_upsert', None)
    
    #updateSingleCardinalityProperties
    #updateAllProperties
    #replaceAllProperties
    
    create_traversal = __.addV(label)
    
    updateable_items = []
    
    for key, value in row.items():
        
        mapping = mappings.mapping_for(key)
        
        if mapping.is_id_token():
            create_traversal = create_traversal.property(id, value)
        elif not mapping.is_token():
            if not on_upsert:
                create_traversal = create_traversal.property(mapping.name, mapping.convert(value))              
            elif on_upsert == 'updateSingleCardinalityProperties':
                if mapping.cardinality == 'single':
                    updateable_items.append((key, value))
                else:                   
                    create_traversal = create_traversal.property(get_cardinality(mapping.cardinality), mapping.name, mapping.convert(value))
            elif on_upsert == 'updateAllProperties':
                updateable_items.append((key, value))
            elif on_upsert == 'replaceAllProperties':
                pass
            
    t = t.V(mappings.get_id(row)).fold().coalesce(__.unfold(), create_traversal)
    
    if updateable_items:
        for key, value in updateable_items:
            mapping = mappings.mapping_for(key)
            t = t.property(get_cardinality(mapping.cardinality), mapping.name, mapping.convert(value))

    return t