def METHOD_NAME(self):
    """
    For each subject, create a universal neg dictionary, use neighbour extract to check whether the triple existis
    :return:
    """
    # stop_p_list = ["hasLogP", "hasDensity", "hasBoilingPoint",
    #                "hasSolubility", "hasLogP", "hasLogS", "hasMolecularWeight",
    #                "hasMeltingPoint"]
    # create the list of tails first
    # avoid put numerical nodes into neg sample
    s_p_neg_dict = {}
    s_p_pos_dict = {}
    all_entities = []
    p_list = []
    p_all_dict = {}
    numerical_nodes = set(list(self.node_value_dict.keys()))
    neighbour_dictionary = {}
    counter = 0
    for triple in self.triples:
        counter += 1
        print(f"{counter} out of {len(self.triples)}")
        s, p, o = [e.strip() for e in triple.split("\t")]
        if o not in numerical_nodes:
            s_idx = self.entity2idx[s]
            o_idx = self.entity2idx[o]
            all_entities.append(s_idx)
            all_entities.append(o_idx)
            p_idx = self.rel2idx[p]
            p_idx_str = str(p_idx)
            if p_idx_str in p_all_dict:
                p_all_dict[p_idx_str].append(o_idx)
            else:
                p_all_dict[p_idx_str] = [o_idx]
            s_p_idx_str = f"{s_idx}_{p_idx}"
            s_p_neg_dict[s_p_idx_str] = []
            if s_p_idx_str not in s_p_pos_dict:
                s_p_pos_dict[s_p_idx_str] = [o_idx]
            else:
                s_p_pos_dict[s_p_idx_str].append(o_idx)
            if str(p_idx) not in p_list:
                p_list.append(str(p_idx))
    all_entities = list(set(all_entities))
    total_neg_number = 0
    for s_p_idx in s_p_pos_dict:
        p_idx = s_p_idx.split("_")[1]
        all_pos_entities = s_p_pos_dict[s_p_idx]
        all_neg_entities_different_class = list(set(all_entities) - set(all_pos_entities) - set(p_all_dict[p_idx]))
        all_neg_entities_same_class = list(set(p_all_dict[p_idx]) - set(all_pos_entities))
        # print(len(all_neg_entities_same_class))
        # print(len(all_neg_entities_different_class))
        # 0.1, 0.5 so far best
        # test 0.05, 0.5         # 0.5, 0.05 , 6430992
        # test 0.02, 0.2         # 0.2, 0.02 , 2568773
        sampled_neg_entities_different_class = self.random_sample_by_fraction(all_neg_entities_different_class,
                                                                              frac=self.other_class_frac)
        sampled_neg_entities_same_class = self.random_sample_by_fraction(all_neg_entities_same_class,
                                                                         frac=self.same_class_frac)
        # print("--------------------------")
        # print(len(sampled_neg_entities_different_class))
        # print(len(sampled_neg_entities_same_class))
        sampled_eng_entities = list(set(sampled_neg_entities_same_class + sampled_neg_entities_different_class))
        # print(len(sampled_eng_entities))
        # print("=====================")
        total_neg_number += len(sampled_eng_entities)
        # use a finer strategy to do the neg sampling
        # 1. get all
        s_p_neg_dict[s_p_idx] = sampled_eng_entities
        # print(len(all_entities))
        # print(len(set(all_pos_entities)))
        # print(len(set(all_neg_entities)))
        # print("-------")
    print("=========================================")
    print("total neg sample number", total_neg_number)
    with open(os.path.join(self.full_dataset_dir, "neg_sample_dict.json"), "w") as f:
        f.write(json.dumps(s_p_neg_dict))
        f.close()
    with open(os.path.join(self.full_dataset_dir, "p_all_dict.json"), "w") as f:
        f.write(json.dumps(p_all_dict))
        f.close()