2525from io import StringIO
2626
2727# tag::driver-introduction-example-import[]
28- from neo4j import GraphDatabase
2928import logging
29+ import sys
30+
31+ from neo4j import GraphDatabase
3032from neo4j .exceptions import ServiceUnavailable
3133# end::driver-introduction-example-import[]
3234
@@ -45,27 +47,43 @@ def close(self):
4547 # Don't forget to close the driver connection when you are finished with it
4648 self .driver .close ()
4749
48- def create_friendship (self , person1_name , person2_name ):
50+ @staticmethod
51+ def enable_log (level , output_stream ):
52+ handler = logging .StreamHandler (output_stream )
53+ handler .setLevel (level )
54+ logging .getLogger ("neo4j" ).addHandler (handler )
55+ logging .getLogger ("neo4j" ).setLevel (level )
56+
57+ def create_friendship (self , person1_name , person2_name , knows_from ):
4958 with self .driver .session () as session :
5059 # Write transactions allow the driver to handle retries and transient errors
5160 result = session .write_transaction (
52- self ._create_and_return_friendship , person1_name , person2_name )
61+ self ._create_and_return_friendship , person1_name , person2_name , knows_from )
5362 for row in result :
54- print ("Created friendship between: {p1}, {p2}" .format (p1 = row ['p1' ], p2 = row ['p2' ]))
63+ print ("Created friendship between: {p1}, {p2} from {knows_from}"
64+ .format (
65+ p1 = row ['p1' ],
66+ p2 = row ['p2' ],
67+ knows_from = row ["knows_from" ]))
5568
5669 @staticmethod
57- def _create_and_return_friendship (tx , person1_name , person2_name ):
70+ def _create_and_return_friendship (tx , person1_name , person2_name , knows_from ):
5871 # To learn more about the Cypher syntax, see https://neo4j.com/docs/cypher-manual/current/
5972 # The Reference Card is also a good resource for keywords https://neo4j.com/docs/cypher-refcard/current/
6073 query = (
6174 "CREATE (p1:Person { name: $person1_name }) "
6275 "CREATE (p2:Person { name: $person2_name }) "
63- "CREATE (p1)-[:KNOWS]->(p2) "
64- "RETURN p1, p2"
76+ "CREATE (p1)-[k :KNOWS { from: $knows_from } ]->(p2) "
77+ "RETURN p1, p2, k "
6578 )
66- result = tx .run (query , person1_name = person1_name , person2_name = person2_name )
79+ result = tx .run (query , person1_name = person1_name ,
80+ person2_name = person2_name , knows_from = knows_from )
6781 try :
68- return [{"p1" : row ["p1" ]["name" ], "p2" : row ["p2" ]["name" ]}
82+ return [{
83+ "p1" : row ["p1" ]["name" ],
84+ "p2" : row ["p2" ]["name" ],
85+ "knows_from" : row ["k" ]["from" ]
86+ }
6987 for row in result ]
7088 # Capture any errors along with the query and data for traceability
7189 except ServiceUnavailable as exception :
@@ -94,8 +112,9 @@ def _find_and_return_person(tx, person_name):
94112 bolt_url = "%%BOLT_URL_PLACEHOLDER%%"
95113 user = "<Username for database>"
96114 password = "<Password for database>"
115+ App .enable_log (logging .INFO , sys .stdout )
97116 app = App (bolt_url , user , password )
98- app .create_friendship ("Alice" , "David" )
117+ app .create_friendship ("Alice" , "David" , "School" )
99118 app .find_person ("Alice" )
100119 app .close ()
101120# end::driver-introduction-example[]
@@ -105,8 +124,9 @@ def test_driver_introduction_example(uri, auth):
105124 try :
106125 s = StringIO ()
107126 with redirect_stdout (s ):
127+ App .enable_log (logging .INFO , sys .stdout )
108128 app = App (uri , auth [0 ], auth [1 ])
109- app .create_friendship ("Alice" , "David" )
129+ app .create_friendship ("Alice" , "David" , "School" )
110130 app .find_person ("Alice" )
111131 app .close ()
112132
0 commit comments