Ejemplo n.º 1
0
 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")
Ejemplo n.º 2
0
 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]
Ejemplo n.º 3
0
 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")
Ejemplo n.º 4
0
 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]
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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")
Ejemplo n.º 7
0
 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")
Ejemplo n.º 8
0
 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")
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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)
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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")
Ejemplo n.º 13
0
 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")
Ejemplo n.º 14
0
 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")
Ejemplo n.º 15
0
 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")
Ejemplo n.º 16
0
 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")