def test_can_merge_subgraph_with_multiple_unique_nodes(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" }, "bob": { "name": "Bob", "email": "*****@*****.**" }, }, "__rels__": [["alice", "KNOWS", "bob"]] } } nodes = subgraph.merge(abstract, self.graph_db) alice, bob = nodes["People"]["alice"], nodes["People"]["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, clone_of_bob = nodes["People"]["alice"], nodes[ "People"]["bob"] assert clone_of_alice == alice assert clone_of_bob == bob assert clone_of_alice.has_relationship_with( clone_of_bob, neo4j.Direction.OUTGOING, "KNOWS")
def test_can_merge_overlapping_subgraphs(self): abstract_cake = { "People": { "__uniquekey__": "email", "__nodes__": {"alice": {"name": "Alice", "email": "*****@*****.**"}}, "__rels__": [["alice", "LIKES", "Food:cake"]], }, "Food": {"__nodes__": {"cake": {"flavour": "chocolate"}}}, } nodes = subgraph.merge(abstract_cake, self.graph_db) alice, cake = nodes["People"]["alice"], nodes["Food"]["cake"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") abstract_pie = { "People": { "__uniquekey__": "email", "__nodes__": {"alice": {"name": "Alice", "email": "*****@*****.**"}}, "__rels__": [["alice", "LIKES", "Food:pie"]], }, "Food": {"__nodes__": {"pie": {"flavour": "steak & ale"}}}, } nodes = subgraph.merge(abstract_pie, self.graph_db) alice, pie = nodes["People"]["alice"], nodes["Food"]["pie"] assert isinstance(alice, neo4j.Node) assert isinstance(pie, neo4j.Node) assert alice.has_relationship_with(pie, neo4j.Direction.OUTGOING, "LIKES") likes = alice.get_relationships(neo4j.Direction.OUTGOING, "LIKES") assert len(likes) == 2 for like in likes: assert like.end_node in [cake, pie]
def test_can_merge_subgraph_with_single_unique_node(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" }, "cake": { "flavour": "chocolate" } }, "__rels__": [["alice", "LIKES", "cake"]] } } nodes = subgraph.merge(abstract, self.graph_db) alice, cake = nodes["People"]["alice"], nodes["People"]["cake"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, extra_cake = nodes["People"]["alice"], nodes[ "People"]["cake"] assert clone_of_alice == alice assert extra_cake == cake assert clone_of_alice.has_relationship_with( extra_cake, neo4j.Direction.OUTGOING, "LIKES")
def test_can_merge_overlapping_subgraphs(self): abstract_cake = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" } }, "__rels__": [["alice", "LIKES", "Food:cake"]] }, "Food": { "__nodes__": { "cake": { "flavour": "chocolate" } }, } } nodes = subgraph.merge(abstract_cake, self.graph_db) alice, cake = nodes["People"]["alice"], nodes["Food"]["cake"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") abstract_pie = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" } }, "__rels__": [["alice", "LIKES", "Food:pie"]] }, "Food": { "__nodes__": { "pie": { "flavour": "steak & ale" } }, } } nodes = subgraph.merge(abstract_pie, self.graph_db) alice, pie = nodes["People"]["alice"], nodes["Food"]["pie"] assert isinstance(alice, neo4j.Node) assert isinstance(pie, neo4j.Node) assert alice.has_relationship_with(pie, neo4j.Direction.OUTGOING, "LIKES") likes = alice.get_relationships(neo4j.Direction.OUTGOING, "LIKES") assert len(likes) == 2 for like in likes: assert like.end_node in [cake, pie]
def test_merge_of_unique_node_is_idempotent(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": {"alice": {"name": "Alice", "email": "*****@*****.**"}}, } } nodes = subgraph.merge(abstract, self.graph_db) alice = nodes["People"]["alice"] assert isinstance(alice, neo4j.Node) for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice = nodes["People"]["alice"] assert clone_of_alice == alice
def test_can_merge_subgraph(self): abstract = { "People": { "__nodes__": { "alice": { "name": "Alice" }, "bob": { "name": "Bob" } }, "__rels__": [["alice", "KNOWS", "bob", { "since": 1999 }]] } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS")
def test_empty_node_properties_matches_any_existing(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": {"name": "Alice", "email": "*****@*****.**"}, "bob": {"name": "Bob", "email": "*****@*****.**"}, }, "__rels__": [["alice", "KNOWS", "bob", {"since": 1999}]], } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS") abstract = { "People": { "__uniquekey__": "email", "__nodes__": {"alice": {"email": "*****@*****.**"}, "bob": {}}, "__rels__": [["alice", "KNOWS", "bob"]], } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert self.graph_db.get_relationship_count() == 1 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice["name"] == "Alice" assert bob["name"] == "Bob" assert alice["email"] == "*****@*****.**" assert bob["email"] == "*****@*****.**" assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS")
def test_can_merge_subgraph_with_multiple_categories(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" } }, "__rels__": [["alice", "LIKES", "Food:cake"], ["alice", "DISLIKES", "Food:pie"]] }, "Food": { "__nodes__": { "cake": { "flavour": "chocolate" }, "pie": { "flavour": "steak & ale" } }, } } nodes = subgraph.merge(abstract, self.graph_db) alice, cake, pie = nodes["People"]["alice"], nodes["Food"][ "cake"], nodes["Food"]["pie"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert isinstance(pie, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") assert alice.has_relationship_with(pie, neo4j.Direction.OUTGOING, "DISLIKES") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, extra_cake, more_pie = nodes["People"][ "alice"], nodes["Food"]["cake"], nodes["Food"]["pie"] assert clone_of_alice == alice assert extra_cake == cake assert more_pie == pie assert clone_of_alice.has_relationship_with( extra_cake, neo4j.Direction.OUTGOING, "LIKES") assert clone_of_alice.has_relationship_with( more_pie, neo4j.Direction.OUTGOING, "DISLIKES")
def test_can_merge_single_node(self): abstract = {"People": {"__nodes__": {"alice": {"name": "Alice"}}}} nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 1 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 1 assert "alice" in people assert isinstance(people["alice"], neo4j.Node)
def test_merge_of_unique_node_is_idempotent(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" } } } } nodes = subgraph.merge(abstract, self.graph_db) alice = nodes["People"]["alice"] assert isinstance(alice, neo4j.Node) for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice = nodes["People"]["alice"] assert clone_of_alice == alice
def test_can_merge_subgraph_with_multiple_unique_nodes(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": {"name": "Alice", "email": "*****@*****.**"}, "bob": {"name": "Bob", "email": "*****@*****.**"}, }, "__rels__": [["alice", "KNOWS", "bob"]], } } nodes = subgraph.merge(abstract, self.graph_db) alice, bob = nodes["People"]["alice"], nodes["People"]["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, clone_of_bob = nodes["People"]["alice"], nodes["People"]["bob"] assert clone_of_alice == alice assert clone_of_bob == bob assert clone_of_alice.has_relationship_with(clone_of_bob, neo4j.Direction.OUTGOING, "KNOWS")
def test_can_merge_subgraph_with_single_unique_node(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": {"name": "Alice", "email": "*****@*****.**"}, "cake": {"flavour": "chocolate"}, }, "__rels__": [["alice", "LIKES", "cake"]], } } nodes = subgraph.merge(abstract, self.graph_db) alice, cake = nodes["People"]["alice"], nodes["People"]["cake"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, extra_cake = nodes["People"]["alice"], nodes["People"]["cake"] assert clone_of_alice == alice assert extra_cake == cake assert clone_of_alice.has_relationship_with(extra_cake, neo4j.Direction.OUTGOING, "LIKES")
def test_can_merge_subgraph_with_multiple_categories(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": {"alice": {"name": "Alice", "email": "*****@*****.**"}}, "__rels__": [["alice", "LIKES", "Food:cake"], ["alice", "DISLIKES", "Food:pie"]], }, "Food": {"__nodes__": {"cake": {"flavour": "chocolate"}, "pie": {"flavour": "steak & ale"}}}, } nodes = subgraph.merge(abstract, self.graph_db) alice, cake, pie = nodes["People"]["alice"], nodes["Food"]["cake"], nodes["Food"]["pie"] assert isinstance(alice, neo4j.Node) assert isinstance(cake, neo4j.Node) assert isinstance(pie, neo4j.Node) assert alice.has_relationship_with(cake, neo4j.Direction.OUTGOING, "LIKES") assert alice.has_relationship_with(pie, neo4j.Direction.OUTGOING, "DISLIKES") for i in range(10): nodes = subgraph.merge(abstract, self.graph_db) clone_of_alice, extra_cake, more_pie = nodes["People"]["alice"], nodes["Food"]["cake"], nodes["Food"]["pie"] assert clone_of_alice == alice assert extra_cake == cake assert more_pie == pie assert clone_of_alice.has_relationship_with(extra_cake, neo4j.Direction.OUTGOING, "LIKES") assert clone_of_alice.has_relationship_with(more_pie, neo4j.Direction.OUTGOING, "DISLIKES")
def test_can_merge_subgraph(self): abstract = { "People": { "__nodes__": {"alice": {"name": "Alice"}, "bob": {"name": "Bob"}}, "__rels__": [["alice", "KNOWS", "bob", {"since": 1999}]], } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS")
def test_empty_node_properties_matches_any_existing(self): abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "name": "Alice", "email": "*****@*****.**" }, "bob": { "name": "Bob", "email": "*****@*****.**" } }, "__rels__": [["alice", "KNOWS", "bob", { "since": 1999 }]] } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS") abstract = { "People": { "__uniquekey__": "email", "__nodes__": { "alice": { "email": "*****@*****.**" }, "bob": {} }, "__rels__": [["alice", "KNOWS", "bob"]] } } nodes = subgraph.merge(abstract, self.graph_db) assert self.graph_db.get_node_count() == 2 assert self.graph_db.get_relationship_count() == 1 assert len(nodes) == 1 assert "People" in nodes people = nodes["People"] assert len(people) == 2 assert "alice" in people assert "bob" in people alice, bob = people["alice"], people["bob"] assert isinstance(alice, neo4j.Node) assert isinstance(bob, neo4j.Node) assert alice["name"] == "Alice" assert bob["name"] == "Bob" assert alice["email"] == "*****@*****.**" assert bob["email"] == "*****@*****.**" assert alice.has_relationship_with(bob, neo4j.Direction.OUTGOING, "KNOWS")