import os import gradio as gr from neo4j import GraphDatabase import pandas as pd import plotly.express as px class MovieRecommender: def __init__(self): uri = os.getenv("NEO4J_URI") user = os.getenv("NEO4J_USER") password = os.getenv("NEO4J_PASSWORD") self.driver = GraphDatabase.driver(uri, auth=(user, password)) def get_genres(self): with self.driver.session() as session: query = "MATCH (g:Genere) RETURN DISTINCT g.genres ORDER BY g.genres" result = session.run(query) return [record['g.genres'] for record in result] def find_movies_by_genre(self, genre): with self.driver.session() as session: query = """ MATCH (t:Title)-[:TITLE_TO_GENRE]->(g:Genre {genres: $genre}) MATCH (t)-[:TITLE_TO_YEAR]->(y:Year) MATCH (t)-[:TITLE_TO_VOTES]->(v:Votes) RETURN t.title as movie, y.releaseYear as year, v.avgVote as avgVote ORDER BY avgVote DESC LIMIT 50 """ result = session.run(query, genre=genre) df = pd.DataFrame([dict(record) for record in result]) # Add rating category column df['vote_rating'] = df['avgVote'] df['rating_category'] = pd.cut( df['vote_rating'], bins=[0, 5, 7, float('inf')], labels=['Low Rating', 'Medium Rating', 'High Rating'] ) return df def create_interface(): recommender = MovieRecommender() def recommend_movies(genre): if not genre: return pd.DataFrame(), None df = recommender.find_movies_by_genre(genre) if df.empty: return df, None fig = px.bar(df, x='movie', y='vote_rating', color='rating_category', title=f'Movies in {genre} Genre', labels={'vote_rating': 'Average Vote', 'movie': 'Movie Title'}, hover_data=['year']) return df, fig # Create Gradio interface with gr.Blocks() as demo: gr.Markdown("# Movie Recommendation System") with gr.Row(): genre_dropdown = gr.Dropdown( choices=recommender.get_genres(), label="Select Genre" ) recommend_btn = gr.Button("Get Recommendations") output_table = gr.DataFrame(label="Movie Recommendations") output_plot = gr.Plot(label="Movie Ratings Visualization") recommend_btn.click( fn=recommend_movies, inputs=genre_dropdown, outputs=[output_table, output_plot] ) return demo # Launch the app demo = create_interface() demo.launch(debug=True)