File size: 2,497 Bytes
1d39232
 
 
 
 
 
 
 
 
4137b5b
 
 
 
 
 
6d55f94
1d39232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe9dcea
 
 
 
6d55f94
 
 
 
 
 
 
 
 
 
 
 
c5dfe2a
6d55f94
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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()
# Load environment variables

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)

# 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})
    
    # Debug: Print the raw response to check its structure
    st.write("Raw Response:", response)
    
    # Extract the director's name from the full context
    if response and 'full_context' in response:
        full_context = response['full_context']
        if full_context and isinstance(full_context, list) and len(full_context) > 0:
            director_info = full_context[0]
            director_name = director_info.get('p.name', None)
            if director_name:
                st.write(f"The director of the movie is {director_name}.")
            else:
                st.write("Could not find the director's name in the response.")
        else:
            st.write("No full context found in the response.")
    else:
        st.write("I don't know the answer.")