Exemplo n.º 1
0
class Building(Graph):
    def __init__(self, name):
        self.name = name
        self.ns = Namespace(f"http://rhdhv.com/buildings/{name}#")

        super().__init__()

        self.bind('rdf', RDF)
        self.bind('rdfs', RDFS)
        self.bind('brick', BRICK)
        self.bind('bf', BRICK_FRAME)
        self.bind(name, self.ns)

    def add_element(self, name, element_type):
        self.add((self.ns.__getattr__(name), RDF.type, element_type))

        return self.ns.__getattr__(name)

    def add_relation(self, subject, predicate, relation_object):
        self.add((self.ns.__getattr__(subject), predicate,
                  self.ns.__getattr__(relation_object)))

    def save(self):
        self.serialize(destination=self.name + '.ttl', format='turtle')

    def show(self):
        from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph
        import networkx as nx
        import matplotlib.pyplot as plt

        plt.figure(figsize=(19, 19))

        G = rdflib_to_networkx_multidigraph(self)

        for node in list(G.nodes):
            if 'Ttl' in node.title():
                G.remove_node(node)

        nx.relabel_nodes(
            G, {node: node.title().split('#')[-1]
                for node in G.nodes},
            copy=False)

        pos = nx.spring_layout(G, iterations=30000, k=1000)
        nx.draw_networkx_edges(G, pos, arrowsize=10)
        nx.draw_networkx_nodes(G, pos, node_size=4000)

        nx.draw_networkx_labels(G, pos)
        nx.draw_networkx_edge_labels(
            G, pos, edge_labels={k[:2]: k[2].split('#')[-1]
                                 for k in G.edges})

        plt.show()