import os import streamlit as st from langchain_community.graphs import Neo4jGraph from langchain_groq import ChatGroq from langchain.chains import GraphCypherQAChain from dotenv import load_dotenv # Load environment variables load_dotenv() NEO4J_URI = "neo4j+s://64beefae.databases.neo4j.io" NEO4J_USERNAME = "neo4j" NEO4J_PASSWORD = "OTj5yGnWLF59yx4UX1g3xABarVOvVKiM3CT9L4bNkF8" GROQ_API_KEY = "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" # Initialize Neo4j graph graph = Neo4jGraph(url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD) # Initialize Neo4j graph graph = Neo4jGraph(url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD) # Load movie dataset into Neo4j moview_query = """ LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv' as row MERGE(m:Movie{id:row.movieId}) SET m.released = date(row.released), m.title = row.title, m.imdbRating = toFloat(row.imdbRating) FOREACH (director in split(row.director, '|') | MERGE (p:Person {name:trim(director)}) MERGE (p)-[:DIRECTED]->(m)) FOREACH (actor in split(row.actors, '|') | MERGE (p:Person {name:trim(actor)}) MERGE (p)-[:ACTED_IN]->(m)) FOREACH (genre in split(row.genres, '|') | MERGE (g:Genre {name:trim(genre)}) MERGE (m)-[:IN_GENRE]->(g)) """ graph.query(moview_query) graph.refresh_schema() # Initialize LLM llm = ChatGroq(groq_api_key=GROQ_API_KEY, model_name="Gemma2-9b-It") # Create QA Chain chain = GraphCypherQAChain.from_llm(graph=graph, llm=llm, verbose=True) # Streamlit UI st.title("Movie Director Finder") query = st.text_input("Enter your query:", "Who was the director of the movie Casino") if st.button("Find Director"): response = chain.invoke({"query": query}) if response and response.get("result"): st.write(response["result"]) else: st.write("I don't know the answer.")