100 lines
3.3 KiB
Python
100 lines
3.3 KiB
Python
|
import sys
|
||
|
from neo4j import GraphDatabase
|
||
|
from dotenv import load_dotenv
|
||
|
import os
|
||
|
import requests
|
||
|
import json
|
||
|
from flatten_json import flatten
|
||
|
|
||
|
# Global variable to store the list of bill numbers
|
||
|
bill_numbers = []
|
||
|
|
||
|
def search_bills(bill_type):
|
||
|
# Load environment variables from .env file
|
||
|
load_dotenv()
|
||
|
|
||
|
# Get connection information from environment variables
|
||
|
uri = os.getenv('NEO4J_URI')
|
||
|
user = os.getenv('NEO4J_USER')
|
||
|
password = os.getenv('NEO4J_PASSWORD')
|
||
|
|
||
|
# Connect to Neo4j database
|
||
|
driver = GraphDatabase.driver(uri, auth=(user, password))
|
||
|
|
||
|
try:
|
||
|
with driver.session() as session:
|
||
|
# Query to find nodes with label 'Bill' and property 'type' matching the provided value
|
||
|
query = "MATCH (b:Bill) WHERE b.type = $bill_type RETURN b.number"
|
||
|
|
||
|
# Execute the query
|
||
|
result = session.run(query, bill_type=bill_type)
|
||
|
|
||
|
# Collect the list of bill numbers
|
||
|
global bill_numbers
|
||
|
bill_numbers = [record["b.number"] for record in result]
|
||
|
finally:
|
||
|
# Close the driver connection
|
||
|
driver.close()
|
||
|
|
||
|
def get_bill_details(congress, bill_type, bill_number):
|
||
|
url = f"https://api.congress.gov/v3/bill/{congress}/{bill_type.lower()}/{bill_number}?format=json&api_key={os.getenv('CONGRESS_API_KEY')}"
|
||
|
response = requests.get(url)
|
||
|
if response.status_code == 200:
|
||
|
return response.json()
|
||
|
else:
|
||
|
print(f"Failed to fetch bill details for {bill_number}: {response.status_code}")
|
||
|
print(f"Response Text: {response.text}")
|
||
|
return None
|
||
|
|
||
|
def flatten_json(y):
|
||
|
out = {}
|
||
|
|
||
|
def flatten(x, name=''):
|
||
|
if type(x) is dict:
|
||
|
for a in x:
|
||
|
flatten(x[a], name + a + '.')
|
||
|
elif type(x) is list:
|
||
|
i = 0
|
||
|
for a in x:
|
||
|
flatten(a, name + str(i) + '.')
|
||
|
i += 1
|
||
|
else:
|
||
|
out[name[:-1]] = x
|
||
|
|
||
|
flatten(y)
|
||
|
return {k.replace('bill.', ''): v for k, v in out.items()}
|
||
|
|
||
|
def update_bill_node(driver, bill_number, properties):
|
||
|
with driver.session() as session:
|
||
|
# Remove existing properties
|
||
|
query_remove_properties = f"MATCH (b:Bill {{number: $bill_number}}) SET b += {{}}"
|
||
|
session.run(query_remove_properties, bill_number=bill_number)
|
||
|
|
||
|
# Add new properties
|
||
|
query_add_properties = f"MATCH (b:Bill {{number: $bill_number}}) SET b += $properties RETURN b"
|
||
|
session.run(query_add_properties, bill_number=bill_number, properties=properties)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
if len(sys.argv) != 3:
|
||
|
print("Usage: python search_bills.py <congress> <bill_type>")
|
||
|
sys.exit(1)
|
||
|
|
||
|
congress = sys.argv[1]
|
||
|
bill_type = sys.argv[2]
|
||
|
|
||
|
search_bills(bill_type)
|
||
|
|
||
|
# Connect to Neo4j database
|
||
|
driver = GraphDatabase.driver(os.getenv('NEO4J_URI'), auth=(os.getenv('NEO4J_USER'), os.getenv('NEO4J_PASSWORD')))
|
||
|
|
||
|
for bill_number in bill_numbers:
|
||
|
print(f"Fetching details for bill number {bill_number}...")
|
||
|
bill_details = get_bill_details(congress, bill_type, bill_number)
|
||
|
if bill_details:
|
||
|
flattened_properties = flatten_json(bill_details)
|
||
|
update_bill_node(driver, bill_number, flattened_properties)
|
||
|
print(f"Updated bill node with properties from JSON response for bill number {bill_number}")
|
||
|
|
||
|
# Close the driver connection
|
||
|
driver.close()
|