Return inferred negative labels.

    The route for this endpoint is:
    ``/dossier/v1/label/<cid>/negative-inference``.

    Negative labels are inferred by first getting all other content ids
    connected to ``cid`` through a negative label. For each directly
    adjacent ``cid'``, the connected components of ``cid`` and
    ``cid'`` are traversed to find negative labels.

    The data returned is a JSON list of labels. Each label is a
    dictionary with the following keys: ``content_id1``,
    ``content_id2``, ``subtopic_id1``, ``subtopic_id2``,
    ``annotator_id``, ``epoch_ticks`` and ``value``.

def v1_label_negative_inference(request, response,
                                visid_to_dbid, dbid_to_visid,
                                label_store, cid):
    '''Return inferred negative labels.

    The route for this endpoint is:
    ``/dossier/v1/label/<cid>/negative-inference``.

    Negative labels are inferred by first getting all other content ids
    connected to ``cid`` through a negative label. For each directly
    adjacent ``cid'``, the connected components of ``cid`` and
    ``cid'`` are traversed to find negative labels.

    The data returned is a JSON list of labels. Each label is a
    dictionary with the following keys: ``content_id1``,
    ``content_id2``, ``subtopic_id1``, ``subtopic_id2``,
    ``annotator_id``, ``epoch_ticks`` and ``value``.
    '''
    # No subtopics yet? :-(
    lab_to_json = partial(label_to_json, dbid_to_visid)
    labs = imap(lab_to_json,
                label_store.negative_inference(visid_to_dbid(cid)))
    return list(paginate(request, response, labs))