返回
众星拱“哥哥”—— 明星关系图谱构建的零距离实践
前端
2023-10-08 02:33:50
作为一名数据挖掘爱好者,我的热情已经蔓延到了娱乐世界,并准备使用Neo4j快速构建一个明星关系图谱。令人兴奋的是,这个恰到好处的时代背景,让我将文中的几个例子顺势改成了“哥哥”张国荣。万事俱备,只欠一勺好“米”—— 本次爬取娱乐圈下属“明星”页的“更多明星”里所有9141条数据。筛选出个人主页中含“_news_id”的6014条数据,其中包括了“哥哥”等6013名明星的基本信息和主要作品。
一、Neo4j与Python的关系
现在我们就一头扎进任务第一阶段:建立Neo4j与Python的亲密关系。
-
行走在Python的世界里
- 确保系统安装了最新版本的Python(版本不低于3.6)。
- 进入Python的虚拟世界,构建一个编程环境:
# 创建一个虚拟环境 python3 -m venv env # 激活虚拟环境 source env/bin/activate
-
畅游在Neo4j的海洋中
-
下载并安装Neo4j Desktop:https://neo4j.com/download/desktop/
-
下载neo4j-driver:
pip install neo4j-driver
-
-
构建属于你们的“桥梁”
- 导入必要的库:
from neo4j import GraphDatabase
- 建立数据库连接:
driver = GraphDatabase.driver(uri="bolt://localhost:7687", auth=("neo4j", "password"))
- 导入必要的库:
二、图谱的雏形——节点与关系
就好像亲戚之间有血缘关系一样,我们的关系图谱中也建立了一套亲密的联系。点和边—— 星语星空和星光长河。
-
节点的创建
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))
-
关系的建立
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))
三、数据可视化——图形的盛宴
将我们的星星图谱投射在可视化的舞台上,让数据更富魅力,直击观众的双眼:
-
导入库
import pandas as pd import networkx as nx import matplotlib.pyplot as plt
-
从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)])
-
构建网络图
G = nx.from_pandas_edgelist(data, source='source', target='target')
-
绘图
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()
瞧,整个星辉灿烂的明星关系图谱就在你的眼前展现。
- 导出为HTML
html = nx.generate_html(G, pos) with open('star_graph.html', 'w') as f: f.write(html)
现在,您已经踏上了明星关系图谱之旅的第一步,开始探索数据背后的奥秘。