import csv from neo4j import GraphDatabase from dotenv import load_dotenv import os # Load environment variables from .env file load_dotenv() # Retrieve Neo4j connection details from environment variables NEO4J_URI = os.getenv('NEO4J_URI') NEO4J_USER = os.getenv('NEO4J_USER') NEO4J_PASSWORD = os.getenv('NEO4J_PASSWORD') if not NEO4J_URI or not NEO4J_USER or not NEO4J_PASSWORD: raise ValueError("Neo4j connection details not found in .env file") TEST_FLAG = False # Function to create or update a person node in Neo4j using MERGE def merge_person_node(driver, member): with driver.session() as session: query = """ MERGE (p:Person {bioguideId: $bioguideId}) ON CREATE SET p += $properties ON MATCH SET p += $properties RETURN p """ # Filter out empty or None values and ensure keys are strings properties = {str(key): value for key, value in member.items() if value is not None and value != ""} if TEST_FLAG: print(f"MERGE (p:Person {{bioguideId: '{member['bioguideId']}'}}) ON CREATE SET p += ${properties} ON MATCH SET p += ${properties}") else: result = session.run(query, bioguideId=member['bioguideId'], properties=properties) return result.single() # Read the CSV file and create/update nodes in Neo4j def read_csv_and_merge_nodes(file_path): driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) try: with open(file_path, mode='r', newline='', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile, delimiter='^') for row in reader: member = {key: value.strip() if isinstance(value, str) else value for key, value in row.items()} # Debugging print statement to check keys and values print(f"Processing row with keys: {member.keys()} and values: {member.values()}") result = merge_person_node(driver, member) if not TEST_FLAG: print(f"Created/Updated node: {result}") finally: if not TEST_FLAG: driver.close() # Path to the CSV file csv_file_path = 'members.csv' # Run the function read_csv_and_merge_nodes(csv_file_path)