import redis
from redisgraph import Node, Edge, Graph


def print_res(result):
    # Iterate through resultset, skip header row at position 0
    for record in result.result_set:
        person_name = record[0]
        person_age = record[1]
        person_gender = record[2]
        person_status = record[3]
        country_name = record[4]
        print('Name: {:>12}\tAge: {:>4}\tGender: {:>6}\tStatus: {:>10}\t Country: {}'.format(person_name, person_age,
                                                                                             person_gender,
                                                                                             person_status,
                                                                                             country_name))


def main():
    r = redis.Redis(decode_responses=True, host='localhost', port=6379)
    r.delete('travel')
    redis_graph = Graph('travel', r)

    john = Node(label='person', properties={'name': 'John Doe', 'age': 33, 'gender': 'male', 'status': 'single'})
    redis_graph.add_node(john)

    japan = Node(label='country', properties={'name': 'Japan'})
    redis_graph.add_node(japan)

    edge_john = Edge(john, 'visited', japan, properties={'purpose': 'pleasure'})
    redis_graph.add_edge(edge_john)

    pearl = Node(label='person', properties={'name': 'Pearl White', 'age': 25, 'gender': 'female', 'status': 'married'})
    redis_graph.add_node(pearl)

    australia = Node(label='country', properties={'name': 'Australia'})
    redis_graph.add_node(australia)

    edge_pearl = Edge(pearl, 'visited', australia, properties={'purpose': 'business'})
    redis_graph.add_edge(edge_pearl)

    redis_graph.commit()

    print('')
    for i in ['pleasure', 'business']:
        print('==== Purpose: {} ===='.format(i))
        query = f'''MATCH (p:person)-[v:visited {{purpose:"{i}"}}]->(c:country)
			RETURN p.name, p.age, p.gender, p.status, c.name'''
        result = redis_graph.query(query)
        print_res(result)
        print('')

if __name__ == '__main__':
    exit(main())
