Ejemplo n.º 1
0
def _get_lines_dbpedia_instance_transitive_caligraph_types(graph) -> list:
    """Serialize transitive CaLiGraph types for DBpedia resources."""
    instance_transitive_clg_types = []

    caligraph_ancestors = defaultdict(set)
    for n in graph.traverse_nodes_topdown():
        parents = graph.parents(n)
        caligraph_ancestors[n] = parents | {
            a
            for p in parents for a in caligraph_ancestors[p]
        }

    for res in graph.get_all_resources():
        dbp_res = clg_util.clg_resource2dbp_resource(res)
        if dbp_res not in dbp_store.get_resources():
            continue

        types = graph.get_nodes_for_resource(res)
        direct_types = types.difference(
            {a
             for t in types for a in caligraph_ancestors[t]})
        transitive_types = {
            tt
            for t in direct_types for tt in graph.ancestors(t)
        }.difference(direct_types | {rdf_util.CLASS_OWL_THING})
        instance_transitive_clg_types.extend([
            serialize_util.as_object_triple(dbp_res, rdf_util.PREDICATE_TYPE,
                                            tt) for tt in transitive_types
        ])
    return instance_transitive_clg_types
Ejemplo n.º 2
0
def _get_lines_dbpedia_instance_relations(graph) -> list:
    """Serialize new facts for DBpedia resources in DBpedia namespace."""
    new_instance_relations = set()
    for node in graph.nodes:
        for prop, val in graph.get_axioms(node):
            dbp_prop = clg_util.clg_type2dbp_type(prop)
            dbp_val = clg_util.clg_resource2dbp_resource(
                val) if clg_util.is_clg_resource(val) else val
            for res in graph.get_resources(node):
                dbp_res = clg_util.clg_resource2dbp_resource(res)
                if dbp_res not in dbp_store.get_resources(
                ) or dbp_prop not in dbp_store.get_properties(
                        dbp_res) or dbp_val not in dbp_store.get_properties(
                            dbp_res)[dbp_prop]:
                    new_instance_relations.add((dbp_res, dbp_prop, dbp_val))
    lines_dbpedia_instance_relations = []
    for s, p, o in new_instance_relations:
        if dbp_util.is_dbp_resource(o):
            lines_dbpedia_instance_relations.append(
                serialize_util.as_object_triple(s, p, o))
        else:
            lines_dbpedia_instance_relations.append(
                serialize_util.as_literal_triple(s, p, o))
    return lines_dbpedia_instance_relations
Ejemplo n.º 3
0
def _get_lines_instances_dbpedia_mapping(graph) -> list:
    """Serialize DBpedia mapping for resources."""
    lines_instances_dbpedia_mapping = []
    axiom_resources = {
        ax[1]
        for n in graph.nodes for ax in graph.get_axioms(n, transitive=False)
        if clg_util.is_clg_resource(ax[1])
    }
    for res in graph.get_all_resources() | axiom_resources:
        equivalent_res = clg_util.clg_resource2dbp_resource(res)
        if equivalent_res in dbp_store.get_resources():
            lines_instances_dbpedia_mapping.append(
                serialize_util.as_object_triple(res,
                                                rdf_util.PREDICATE_SAME_AS,
                                                equivalent_res))
    return lines_instances_dbpedia_mapping
Ejemplo n.º 4
0
def _get_lines_dbpedia_instances(graph) -> list:
    """Serialize new DBpedia resources in DBpedia namespace."""
    lines_dbpedia_instances = []
    new_instances = {
        clg_util.clg_resource2dbp_resource(res)
        for res in graph.get_all_resources()
    }.difference(dbp_store.get_resources())
    for inst in new_instances:
        lines_dbpedia_instances.append(
            serialize_util.as_object_triple(
                inst, rdf_util.PREDICATE_TYPE,
                rdf_util.CLASS_OWL_NAMED_INDIVIDUAL))
        label = graph.get_label(clg_util.dbp_resource2clg_resource(inst))
        if label:
            lines_dbpedia_instances.append(
                serialize_util.as_literal_triple(inst,
                                                 rdf_util.PREDICATE_LABEL,
                                                 label))
    return lines_dbpedia_instances
Ejemplo n.º 5
0
def _get_lines_dbpedia_instance_types(graph) -> list:
    """Serialize new types for DBpedia resources in DBpedia namespace."""
    new_dbpedia_types = defaultdict(set)
    for node in graph.nodes:
        node_types = graph.get_transitive_dbpedia_types(node,
                                                        force_recompute=True)
        transitive_node_types = {
            tt
            for t in node_types
            for tt in dbp_store.get_transitive_supertype_closure(t)
        }.difference({rdf_util.CLASS_OWL_THING})
        for res in graph.get_resources(node):
            dbp_res = clg_util.clg_resource2dbp_resource(res)
            if dbp_res in dbp_store.get_resources():
                new_dbpedia_types[dbp_res].update(
                    transitive_node_types.difference(
                        dbp_store.get_transitive_types(dbp_res)))
            else:
                new_dbpedia_types[dbp_res].update(transitive_node_types)
    return [
        serialize_util.as_object_triple(res, rdf_util.PREDICATE_TYPE, t)
        for res, types in new_dbpedia_types.items() for t in types
    ]