首页 > 数据库 >基于知识图谱和neo4j图数据库的电影推荐系统(2024版)

基于知识图谱和neo4j图数据库的电影推荐系统(2024版)

时间:2024-06-18 19:31:38浏览次数:13  
标签:run title 图谱 2024 session result print neo4j csv

首先下载neo4j图数据库
https://neo4j.com/deployment-center/
在这里插入图片描述
知识图谱相关概念:
知识图谱是一种结构化的知识存储形式,它以图形数据库为基础,用来表示实体(如人、地点、事件等)之间的复杂关系。这种技术结合了自然语言处理、信息提取、数据挖掘、图论等多种技术,目的是使机器能够更好地理解和处理人类世界中的知识。
完整代码:

from neo4j import GraphDatabase
import pandas as pd

uri = "neo4j://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "tangyudiadid0"))

k = 10 # nearest neighbors (most similar users) to consider
movies_common = 3 # how many movies in common to be consider an user similar
users_common = 2 # minimum number of similar users that have seen the movie to consider it
threshold_sim = 0.9 # threshold to consider users similar

def load_data():
    with driver.session() as session:
        session.run("""MATCH ()-[r]->() DELETE r""")
        session.run("""MATCH (r) DELETE r""")
        
        print("Loading movies...")
        #加载数据,创建Movie标签,title属性的实体
        session.run("""
            LOAD CSV WITH HEADERS FROM "file:///out_movies.csv" AS csv
            CREATE (:Movie {title: csv.title})
            """)
            
        print("Loading gradings...")
        #加载评分数据,    MERGE是搜索给定模式,如果存在,则返回结果如果它不存在于图中,则它创建新的节点/关系并返回结果。
        session.run("""
            LOAD CSV WITH HEADERS FROM "file:///out_grade.csv" AS csv
            MERGE (m:Movie {title: csv.title}) 
            MERGE (u:User {id: toInteger(csv.user_id)})
            CREATE (u)-[:RATED {grading : toInteger(csv.grade)}]->(m)
            """)
        #加载影片类型数据    
        print("Loading genres...")
            
        session.run("""
            LOAD CSV WITH HEADERS FROM "file:///out_genre.csv" AS csv
            MERGE (m:Movie {title: csv.title})
            MERGE (g:Genre {genre: csv.genre})
            CREATE (m)-[:HAS_GENRE]->(g)
            """)
            
        print("Loading keywords...")
        #加载关键词数据    
        session.run("""
            LOAD CSV WITH HEADERS FROM "file:///out_keyword.csv" AS csv
            MERGE (m:Movie {title: csv.title})
            MERGE (k:Keyword {keyword: csv.keyword})
            CREATE (m)-[:HAS_KEYWORD]->(k)
            """)
            
        print("Loading productors...")
        #制片人    
        session.run("""
            LOAD CSV WITH HEADERS FROM "file:///out_productor.csv" AS csv
            MERGE (m:Movie {title: csv.title})
            MERGE (p:Productor {name: csv.productor})
            CREATE (m)-[:HAS_PRODUCTOR]->(p)
            """)

def queries():
    while True:
        userid = int(input("请输入要为哪位用户推荐电影,输入其ID即可: "))
        m = int(input("为该用户推荐多少个电影呢? "))
        
        genres = []
        if int(input("是否需要过滤掉不喜欢的类型?(输入0或1)")):#过滤掉不喜欢的类型
            with driver.session() as session:
                try:
                    q = session.run(f"""MATCH (g:Genre) RETURN g.genre AS genre""")
                    result = []
                    for i, r in enumerate(q):
                        result.append(r["genre"])#找到图谱中所有的电影类型
                    df = pd.DataFrame(result, columns=["genre"])
                    print()
                    print(df)
                    inp = input("输入不喜欢的类型索引即可,例如:1 2 3  ")
                    if len(inp) != 0:
                        inp = inp.split(" ")
                        genres = [df["genre"].iloc[int(x)] for x in inp]
                except:
                    print("Error")
                    
        with driver.session() as session:#找到当前ID评分的电影
            q = session.run(f"""
                    MATCH (u1:User {{id : {userid}}})-[r:RATED]-(m:Movie)
                    RETURN m.title AS title, r.grading AS grade
                    ORDER BY grade DESC
                    """)
            
            print()
            print("Your ratings are the following:")
            
            result = []
            for r in q:
                result.append([r["title"], r["grade"]])
                
            if len(result) == 0:
                print("No ratings found")
            else:
                df = pd.DataFrame(result, columns=["title", "grade"])
                print()
                print(df.to_string(index=False))
            print()
            
            session.run(f"""
                MATCH (u1:User)-[s:SIMILARITY]-(u2:User)
                DELETE s
                """)
            #找到当前用户评分的电影以及这些电影被其他用户评分的用户,with是把查询集合当做结果以便后面用where 余弦相似度计算
            session.run(f"""
                MATCH (u1:User {{id : {userid}}})-[r1:RATED]-(m:Movie)-[r2:RATED]-(u2:User)
                WITH
                    u1, u2,
                    COUNT(m) AS movies_common,
                    SUM(r1.grading * r2.grading)/(SQRT(SUM(r1.grading^2)) * SQRT(SUM(r2.grading^2))) AS sim
                WHERE movies_common >= {movies_common} AND sim > {threshold_sim}
                MERGE (u1)-[s:SIMILARITY]-(u2)
                SET s.sim = sim
                """)
                
            Q_GENRE = ""
            if (len(genres) > 0):
                Q_GENRE = "AND ((SIZE(gen) > 0) AND "
                Q_GENRE += "(ANY(x IN " + str(genres) + " WHERE x IN gen))"
                Q_GENRE += ")"
            #找到相似的用户,然后看他们喜欢什么电影 Collect:将所有值收集到一个集合list中
            q = session.run(f"""
                    MATCH (u1:User {{id : {userid}}})-[s:SIMILARITY]-(u2:User)
                    WITH u1, u2, s
                    ORDER BY s.sim DESC LIMIT {k}
                    MATCH (m:Movie)-[r:RATED]-(u2)
                    OPTIONAL MATCH (g:Genre)--(m)
                    WITH u1, u2, s, m, r, COLLECT(DISTINCT g.genre) AS gen
                    WHERE NOT((m)-[:RATED]-(u1)) {Q_GENRE}
                    WITH
                        m.title AS title,
                        SUM(r.grading * s.sim)/SUM(s.sim) AS grade,
                        COUNT(u2) AS num,
                        gen
                    WHERE num >= {users_common}
                    RETURN title, grade, num, gen
                    ORDER BY grade DESC, num DESC
                    LIMIT {m}
                    """)

            print("Recommended movies:")

            result = []
            for r in q:
                result.append([r["title"], r["grade"], r["num"], r["gen"]])
            if len(result) == 0:
                print("No recommendations found")
                print()
                continue
            df = pd.DataFrame(result, columns=["title", "avg grade", "num recommenders", "genres"])
            print()
            print(df.to_string(index=False))
            print()

if __name__ == "__main__":
    if int(input("是否需要重新加载并创建知识图谱?(请选择输入0或1)")):
        load_data()
    queries()

运行效果:
在这里插入图片描述
后注:有疑问的小伙伴请访问公众号“聚财猫猫”

标签:run,title,图谱,2024,session,result,print,neo4j,csv
From: https://blog.csdn.net/hhtt19820919/article/details/139716563

相关文章

  • 【文末附gpt升级秘笈】SDCon 2024全球软件研发技术大会:引领AI 2.0时代的软件开发新篇
    SDCon2024全球软件研发技术大会:引领AI2.0时代的软件开发新篇章一、引言随着人工智能技术的飞速发展,我们迎来了AI2.0时代。在这个时代,人工智能技术不仅深刻影响着我们的日常生活,更在软件研发领域掀起了一场革命。AI原生应用的出现,使得每行代码、每个应用都有可能迎来被智能......
  • 2024年,计算机相关专业还值得选择吗?——一入软件深似海,回首已是秃顶人
    2024年,计算机相关专业还值得选择吗?站在2024年的时间点上,计算机相关专业依然保持着其“万金油”特质,尽管行业内部的竞争确实日益激烈,但其长远发展潜力和就业前景仍然广阔。以下是几个方面的分析:作为今年的高考生判断是否适合计算机相关专业:兴趣与热情:首先,要审视自己是否......
  • 2024 Scrum Day 敏捷大会演讲嘉宾阵容升级,早鸟票预售中...
    ​关于ScrumDay智驭未来,敏捷先行——2024中国Scrum大会启航在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。Scrum中文网携手全球敏捷行业巨擘——Scrum.org联袂呈现年度敏捷盛会ScrumDay,将于今秋盛大启幕!大会聚焦“AI时代下的敏捷(AgileintheAIAge)”,汇集......
  • 2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ 2024)
    2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ2024)2024InternationalConferenceonDesign,DigitalTechnologyandJournalism会议地点:哈尔滨,中国网址:www.icddtj.com邮箱:[email protected]投稿主题请注明:ICDDTJ2024+通讯作者姓名(否则无法确认您的稿件......
  • 2024年城市规划、建设与区域发展国际学术会议(ICUPCRD 2024)
    2024年城市规划、建设与区域发展国际学术会议(ICUPCRD2024)2024InternationalConferenceonUrbanPlanning,ConstructionandRegionalDevelopment会议地点:上海,中国网址:www.icupcrd.com邮箱:[email protected]投稿主题请注明:ICUPCRD2024+通讯作者姓名(否则无法......
  • 如何评价2024年全国大学生数据统计与分析竞赛B题?
    2024年全国大学生数据统计与分析竞赛B题:建立电信银行卡诈骗检测问题的数据分析和机器学习模型本文文章较长,建议先看目录。经过多天的奋战,目前我们已经完成了2024年全国大学生数据统计与分析竞赛B题的40+页完整论文和代码,文章较长,建议可以先看目录,完整版本可见文末参考摘要本......
  • 【ACM独立出版/Fellow大咖云集】 第三届机器人、人工智能与信息工程国际学术会议(RAIIE
    2024年第二届机器人、人工智能与信息工程国际学术会议(RAIIE2024)将于2024年7月5-7日在新加坡举行。本次会议主要围绕“机器人”、“智能仿生”和“信息科学”的最新研究进展展开,会议汇聚了该领域内国际学者、专家、研究人员及相关从业人员,分享研究成果,探讨机器人的最新发展趋势,为......
  • 2024年: 您准备好进行持续绩效管理了吗?
    在过去几年中,”人力资源“这个既最重要又最讨厌的过程受到了关注。每个人都在跃跃欲试,从静态的、以快照为基础的年度回顾转向频繁的双向对话。这是一个正确的时机;在当今复杂的业务和人际关系中,我们需要进行上下左右的沟通,以确保每个人都朝着同一个目标努力。但这并不是简单的“......
  • Character Animator 2024 mac/win版:赋予角色生命,动画更传神
    CharacterAnimator2024是一款强大的角色动画制作软件,以其创新的功能和卓越的性能,为动画师、游戏开发者以及设计师们带来了全新的创作体验。CharacterAnimator2024mac/win版获取 这款软件采用了先进的骨骼绑定技术,使得角色动画的制作变得更为轻松和精准。用户可以轻松地......
  • 2024广东省职业技能大赛云计算赛项实战——容器云平台搭建
    容器云平台搭建前言容器镜像使用的是斗学培训平台提供的镜像包,这东西网上都没有,一堆人要,我是靠自己想的方法获取到了,也不敢给。你们可以通过在这个网站申请环境进行操作https://ncc.douxuedu.com/虚拟机使用的是自行创建的CentOS7,如果你不会,那虚拟机创建的流程可以参考我......