def save(self, subj, node=None): """ Save an object to a database node. :param subj: the object to save :param node: the database node to save to (if omitted, will re-save to same node as previous save) """ if node is not None: subj.__node__ = node # naively copy properties from object to node props = {} for key, value in subj.__dict__.items(): if not key.startswith("_"): props[key] = value if hasattr(subj, "__node__"): subj.__node__.set_properties(props) self.graph.cypher.run( "START a=node({a}) MATCH (a)-[r]->(b) DELETE r", {"a": subj.__node__}) else: subj.__node__, = self.graph.create(props) # write rels if hasattr(subj, "__rel__"): batch = WriteBatch(self.graph) for rel_type, rels in subj.__rel__.items(): for rel_props, endpoint in rels: end_node = self._get_node(endpoint) if end_node not in self.graph: raise ValueError(end_node) batch.create( (subj.__node__, rel_type, end_node, rel_props)) batch.run() return subj
def _node_remove_labels(self, *labels): from py2neo.batch import WriteBatch labels = [ustr(label) for label in set(flatten(labels))] batch = WriteBatch(self.graph) for label in labels: batch.remove_label(self, label) batch.run()
def save(self, subj, node=None): """ Save an object to a database node. :param subj: the object to save :param node: the database node to save to (if omitted, will re-save to same node as previous save) """ if node is not None: subj.__node__ = node # naively copy properties from object to node props = {} for key, value in subj.__dict__.items(): if not key.startswith("_"): props[key] = value if hasattr(subj, "__node__"): subj.__node__.set_properties(props) self.graph.cypher.run("START a=node({a}) MATCH (a)-[r]->(b) DELETE r", {"a": subj.__node__}) else: subj.__node__, = self.graph.create(props) # write rels if hasattr(subj, "__rel__"): batch = WriteBatch(self.graph) for rel_type, rels in subj.__rel__.items(): for rel_props, endpoint in rels: end_node = self._get_node(endpoint) if end_node not in self.graph: raise ValueError(end_node) batch.create((subj.__node__, rel_type, end_node, rel_props)) batch.run() return subj
def _node_remove_labels(self, *labels): from py2neo.batch import WriteBatch labels = [ustr(label) for label in set(flatten(labels))] batch = WriteBatch(self.graph) for label in labels: batch.remove_label(self, label) batch.run()
def _node_remove_labels(self, *labels): """ Remove one or more labels from this node. :param labels: one or more text labels """ from py2neo.batch import WriteBatch labels = [ustr(label) for label in set(flatten(labels))] batch = WriteBatch(self.graph) for label in labels: batch.remove_label(self, label) batch.run()
class TestDeletion(object): @pytest.fixture(autouse=True) def setup(self, graph): self.batch = WriteBatch(graph) self.graph = graph def test_can_delete_relationship_and_related_nodes(self): self.batch.create({"name": "Alice"}) self.batch.create({"name": "Bob"}) self.batch.create((0, "KNOWS", 1)) alice, bob, ab = self.batch.submit() assert alice.exists assert bob.exists assert ab.exists self.batch.clear() self.batch.delete(ab) self.batch.delete(alice) self.batch.delete(bob) self.batch.run() assert not alice.exists assert not bob.exists assert not ab.exists
class TestDeletion(object): @pytest.fixture(autouse=True) def setup(self, graph): self.batch = WriteBatch(graph) self.graph = graph def test_can_delete_relationship_and_related_nodes(self): self.batch.create({"name": "Alice"}) self.batch.create({"name": "Bob"}) self.batch.create((0, "KNOWS", 1)) alice, bob, ab = self.batch.submit() assert alice.exists assert bob.exists assert ab.exists self.batch.clear() self.batch.delete(ab) self.batch.delete(alice) self.batch.delete(bob) self.batch.run() assert not alice.exists assert not bob.exists assert not ab.exists
class TestPropertyManagement(object): @pytest.fixture(autouse=True) def setup(self, graph): self.batch = WriteBatch(graph) self.alice, self.bob, self.friends = graph.create( {"name": "Alice", "surname": "Allison"}, {"name": "Bob", "surname": "Robertson"}, (0, "KNOWS", 1, {"since": 2000}), ) self.graph = graph def _check_properties(self, entity, expected_properties): actual_properties = entity.get_properties() assert len(actual_properties) == len(expected_properties) for key, value in expected_properties.items(): assert key in actual_properties assert str(actual_properties[key]) == str(value) def test_can_add_new_node_property(self): self.batch.set_property(self.alice, "age", 33) self.batch.run() self._check_properties( self.alice, {"name": "Alice", "surname": "Allison", "age": 33}) def test_can_overwrite_existing_node_property(self): self.batch.set_property(self.alice, "name", "Alison") self.batch.run() self._check_properties( self.alice, {"name": "Alison", "surname": "Allison"}) def test_can_replace_all_node_properties(self): props = {"full_name": "Alice Allison", "age": 33} self.batch.set_properties(self.alice, props) self.batch.run() self._check_properties(self.alice, props) def test_can_add_delete_node_property(self): self.batch.delete_property(self.alice, "surname") self.batch.run() self._check_properties(self.alice, {"name": "Alice"}) def test_can_add_delete_all_node_properties(self): self.batch.delete_properties(self.alice) self.batch.run() self._check_properties(self.alice, {}) def test_can_add_new_relationship_property(self): self.batch.set_property(self.friends, "foo", "bar") self.batch.run() self._check_properties(self.friends, {"since": 2000, "foo": "bar"})
class TestPropertyManagement(object): @pytest.fixture(autouse=True) def setup(self, graph): self.batch = WriteBatch(graph) self.alice, self.bob, self.friends = graph.create( { "name": "Alice", "surname": "Allison" }, { "name": "Bob", "surname": "Robertson" }, (0, "KNOWS", 1, { "since": 2000 }), ) self.graph = graph def _check_properties(self, entity, expected_properties): entity.pull() actual_properties = entity.properties assert len(actual_properties) == len(expected_properties) for key, value in expected_properties.items(): assert key in actual_properties assert str(actual_properties[key]) == str(value) def test_can_add_new_node_property(self): self.batch.set_property(self.alice, "age", 33) self.batch.run() self._check_properties(self.alice, { "name": "Alice", "surname": "Allison", "age": 33 }) def test_can_overwrite_existing_node_property(self): self.batch.set_property(self.alice, "name", "Alison") self.batch.run() self._check_properties(self.alice, { "name": "Alison", "surname": "Allison" }) def test_can_replace_all_node_properties(self): props = {"full_name": "Alice Allison", "age": 33} self.batch.set_properties(self.alice, props) self.batch.run() self._check_properties(self.alice, props) def test_can_add_delete_node_property(self): self.batch.delete_property(self.alice, "surname") self.batch.run() self._check_properties(self.alice, {"name": "Alice"}) def test_can_add_delete_all_node_properties(self): self.batch.delete_properties(self.alice) self.batch.run() self._check_properties(self.alice, {}) def test_can_add_new_relationship_property(self): self.batch.set_property(self.friends, "foo", "bar") self.batch.run() self._check_properties(self.friends, {"since": 2000, "foo": "bar"})