:param manager: Context manager to handle transactions
    :type manager: Neo4jDBSessionManager
    :param handle_id: Nodes handle id
    :type handle_id: str|unicode
    :param node: Node object
    :type node: neo4j.v1.types.Node
    :return: Node model
    :rtype: models.BaseNodeModel or sub class of models.BaseNodeModel

def get_node_model(manager, handle_id=None, node=None):
    """
    :param manager: Context manager to handle transactions
    :type manager: Neo4jDBSessionManager
    :param handle_id: Nodes handle id
    :type handle_id: str|unicode
    :param node: Node object
    :type node: neo4j.v1.types.Node
    :return: Node model
    :rtype: models.BaseNodeModel or sub class of models.BaseNodeModel
    """
    bundle = get_node_bundle(manager, handle_id, node)
    for label in bundle.get('labels'):
        try:
            classname = '{meta_type}{base}Model'.format(meta_type=bundle.get('meta_type'), base=label).replace('_', '')
            return getattr(models, classname)(manager).load(bundle)
        except AttributeError:
            pass
    for label in bundle.get('labels'):
        try:
            classname = '{base}Model'.format(base=label).replace('_', '')
            return getattr(models, classname)(manager).load(bundle)
        except AttributeError:
            pass
    try:
        classname = '{base}Model'.format(base=bundle.get('meta_type'))
        return getattr(models, classname)(manager).load(bundle)
    except AttributeError:
        return models.BaseNodeModel(manager).load(bundle)