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()