def _process_node_on_graph(self, note: Note):
        in_graph = self.nodes.match(name=note.name)
        if len(in_graph) == 0:
            # Create new node
            node = node_from_note(note)
            self.graph.create(node)
            return
        # Update
        node = in_graph.first()
        # Update labels
        node.clear_labels()
        note_tags = map(escape_cypher, note.tags)
        node.update_labels(note_tags)
        for tag in note_tags:
            if tag not in self.tags:
                properties = ['name', 'aliases']
                # TODO: Is this too slow?
                if True:
                    properties.append("content")
                create_index(self.graph, tag, properties)
                self.tags.add(tag)
        # Update properties
        node.clear()
        escaped_properties = {}
        for key, value in note.properties.items():
            escaped_properties[key] = escape_cypher(str(value))
        node.update(escaped_properties)
        self.graph.push(node)

        # Delete active relations
        self._clear_outgoing(node)

        # Insert up-to-date relations
        subgraph = None
        for trgt, rels in note.out_rels.items():
            trgt_node = self.nodes.match(name=trgt)
            if len(trgt_node) == 0:
                trgt_node = Node(CAT_DANGLING, name=escape_cypher(trgt),
                                 obsidian_url=escape_cypher(obsidian_url(trgt, self.vault_name)))
                if subgraph is None:
                    subgraph = trgt_node
                else:
                    subgraph = subgraph | trgt_node
            else:
                trgt_node = trgt_node.first()
            # Possibly refactor this with
            subgraph = add_rels_between_nodes(rels, node, trgt_node, subgraph)
        if subgraph is not None:
            self.graph.create(subgraph)