Add one relationship to the model

        origin - origin of the relationship (similar to an RDF subject)
        rel - type IRI of the relationship (similar to an RDF predicate)
        target - target of the relationship (similar to an RDF object), a boolean, floating point or unicode object
        attrs - optional attribute mapping of relationship metadata, i.e. {attrname1: attrval1, attrname2: attrval2}

def add(self, origin, rel, target, attrs=None):
        '''
        Add one relationship to the model

        origin - origin of the relationship (similar to an RDF subject)
        rel - type IRI of the relationship (similar to an RDF predicate)
        target - target of the relationship (similar to an RDF object), a boolean, floating point or unicode object
        attrs - optional attribute mapping of relationship metadata, i.e. {attrname1: attrval1, attrname2: attrval2}
        '''
        if not origin: 
            raise ValueError('Relationship origin cannot be null')
        if not rel: 
            raise ValueError('Relationship ID cannot be null')

        attrs = attrs or {}

        origin_item = self._db_coll.find_one({'origin': origin})
        rel = self._abbreviate(rel)
        target = self._abbreviate(target)
        rel_info = {'rid': rel, 'instances': [[target, attrs]]}
        if origin_item is None:
            self._db_coll.insert_one(
                {
                    'origin': origin,
                    'rels': [rel_info],
                }
            )
        else:
            origin_item['rels'].append(rel_info)
            self._db_coll.replace_one(
                {'origin': origin}, origin_item
            )
        return