返回

众星拱“哥哥”—— 明星关系图谱构建的零距离实践

前端

作为一名数据挖掘爱好者,我的热情已经蔓延到了娱乐世界,并准备使用Neo4j快速构建一个明星关系图谱。令人兴奋的是,这个恰到好处的时代背景,让我将文中的几个例子顺势改成了“哥哥”张国荣。万事俱备,只欠一勺好“米”—— 本次爬取娱乐圈下属“明星”页的“更多明星”里所有9141条数据。筛选出个人主页中含“_news_id”的6014条数据,其中包括了“哥哥”等6013名明星的基本信息和主要作品。

一、Neo4j与Python的关系

现在我们就一头扎进任务第一阶段:建立Neo4j与Python的亲密关系。

  1. 行走在Python的世界里

    • 确保系统安装了最新版本的Python(版本不低于3.6)。
    • 进入Python的虚拟世界,构建一个编程环境:
      # 创建一个虚拟环境
      python3 -m venv env
      
      # 激活虚拟环境
      source env/bin/activate
      
  2. 畅游在Neo4j的海洋中

  3. 构建属于你们的“桥梁”

    • 导入必要的库:
      from neo4j import GraphDatabase
      
    • 建立数据库连接:
      driver = GraphDatabase.driver(uri="bolt://localhost:7687", auth=("neo4j", "password"))
      

二、图谱的雏形——节点与关系

就好像亲戚之间有血缘关系一样,我们的关系图谱中也建立了一套亲密的联系。点和边—— 星语星空和星光长河。

  1. 节点的创建

    query = """
    UNWIND $data AS row
    CREATE (a:Celebrity { name: row.name, birth: row.birth, 
                            death: row.death, nationality: row.nationality })
    """
    
    with driver.session() as session:
        session.run(query, data=dict(data=star_data))
    
  2. 关系的建立

    query = """
    UNWIND $relationships AS row
    MATCH (a:Celebrity {name: row.source}), (b:Celebrity {name: row.target})
    CREATE (a)-[r:ACTED_IN {movie: row.movie}]->(b)
    """
    
    with driver.session() as session:
        session.run(query, data=dict(relationships=star_relationships))
    

三、数据可视化——图形的盛宴

将我们的星星图谱投射在可视化的舞台上,让数据更富魅力,直击观众的双眼:

  1. 导入库

    import pandas as pd
    import networkx as nx
    import matplotlib.pyplot as plt
    
  2. 从Neo4j中提取数据

    query = """
    MATCH (n:Celebrity)-[r:ACTED_IN]->(m:Celebrity)
    RETURN n.name AS source, m.name AS target, r.movie AS movie
    """
    
    data = pd.DataFrame([dict(zip(result.keys(), result.values())) 
                         for result in driver.session().run(query)])
    
  3. 构建网络图

    G = nx.from_pandas_edgelist(data, source='source', target='target')
    
  4. 绘图

    plt.figure(figsize=(10, 10))
    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=12)
    plt.show()
    

瞧,整个星辉灿烂的明星关系图谱就在你的眼前展现。

  1. 导出为HTML
    html = nx.generate_html(G, pos)
    with open('star_graph.html', 'w') as f:
        f.write(html)
    

现在,您已经踏上了明星关系图谱之旅的第一步,开始探索数据背后的奥秘。