什么是Neo4j?

Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。

作为图形数据库,Neo4j最让人惊喜的功能就是它可以直观地展示图,也就是节点与节点之间的关系,当然,它还有其它的优势,比如:

很容易表示连接的数据;

检索/遍历/导航更多的连接数据是非常容易和快速的;

能轻松地表示半结构化数据;

Neo4j CQL查询语言命令类似于SQL,可读性好,容易学习;

使用简单而强大的数据模型;

不需要复杂的连接来检索连接的/相关的数据。

在本文中,笔者希望能够通过一个简单的例子来展示Neo4j的使用以及它的强大之处,这无疑更适合于初学者,因为笔者也是刚入门。

以下,笔者并不会过多地介绍Neo4j的操作,只是希望读者能对Neo4j的功能有直观的感受,至于教程之类的,可以参考文章最后的参考文献。

下面,让我们进入本次的Neo4j之旅~

项目展示

由于《流浪地球》的大热以及笔者对此的欣赏,因此,此次的项目为分析中国电影票房排行。我们的数据来自于百度百科,用爬虫得到我们需要的数据,主要是电影的相关信息,如排名,票房,上映日期等,以及电影的主演。将数据储存为CSV文件,并导入至Neo4j,最后得到电影的简单分析及可视化。

整个项目主要是以下三步:

数据获取:利用爬虫实现;

数据导入:利用Py2neo实现;

数据展示:利用Neo4j实现。

其中,Py2neo为Neo4j的Python接口。

整个项目的结构如下图:

接下来,笔者将详细地介绍每一步的操作及代码,let's go ~

数据获取

数据的获取始终是一个重要的问题,好在我们有爬虫这个工具。为了能够展示中国电影票房排行中的电影信息以及演员与电影的关系,首先的重要一步就是获取我们需要的需要。

我们需要两份数据。第一份数据,就是中国电影票房排行数据,网址为:https://baike.baidu.com/item/...,页面如下:

我们制作爬虫,将这个表格爬取下来,并将表格的第一行(字段名称)作为电影的相关信息,然后储存为movies.csv。整个过程的Python代码(movie.py)如下:(因为这是公开数据,这个爬虫是合理的。)

# -*- coding: utf-8 -*-

import requests

import pandas as pd

from bs4 import BeautifulSoup

url = "https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF/4101787"

# 请求头部

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}

r = requests.get(url, headers=headers)

soup = BeautifulSoup(r.text.encode('ISO-8859-1'),'lxml')

table = soup.find('table')('tr')

movies = []

for line in table[1:]:

movie = {'rank': int(line('td')[0].text),

'src': line('td')[1]('a')[0]['href'],

'name': line('td')[1].text,

'box_office': line('td')[2].text,

'avg_price': int(line('td')[3].text),

'avg_people': int(line('td')[4].text),

'begin_date': line('td')[5].text.strip(),

}

# print(movie)

movies.append(movie)

# print(movies)

df = pd.DataFrame({'rank': [movie['rank'] for movie in movies],

'src': [movie['src'] for movie in movies],

'name': [movie['name'] for movie in movies],

'box_office': [movie['box_office'] for movie in movies],

'avg_price': [movie['avg_price'] for movie in movies],

'avg_people': [movie['avg_people'] for movie in movies],

'begin_date': [movie['begin_date'] for movie in movies]

})

# print(df.head())

df.to_csv(r'./movies.csv', index=False)

movies.csv中的数据如下:

OK,第二份数据,每部电影(共20部)的主演,以《流浪地球》为例,网址为:https://baike.baidu.com/item/...,页面如下:

我们只需要爬取每部电影的主演就够了,也就是上图中的红色部分,实现的Python代码(actor.py)如下:

# -*- coding: utf-8 -*-

import requests

import pandas as pd

from bs4 import BeautifulSoup

def get_actors(src):

url = "https://baike.baidu.com"+src

# 请求头部

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}

r = requests.get(url, headers=headers)

soup = BeautifulSoup(r.text.encode('ISO-8859-1'),'lxml')

names = soup.find_all('dt', class_="basicInfo-item name")

values = soup.find_all('dd', class_="basicInfo-item value")

actors = []

for name, value in zip(names, values):

# print(name.text)

if '主' in name.text and '演' in name.text:

# print(name.text.replace('    ', ''), value.text)

actors = value.text.strip().split(',')

actors = [actor.strip().replace('\xa0', '').replace('\n[6]', '') for actor in actors if actor]

# print(actors)

return ','.join(actors)

df = pd.read_csv('./movies.csv')

actors_list = []

for name, src in zip(list(df['name']), list(df['src'])):

actors = get_actors(src)

# print(name, actors)

actors_list.append(actors)

new_df = pd.DataFrame({'actors': actors_list})

new_df['name'] = df['name']

# print(new_df)

new_df.to_csv(r'./actors.csv', index=False)

生成的actor.csv数据如下:

OK,数据收集的任务就到此完成了,有了爬虫,轻松搞定数据难题。

导入数据

接着,我们需要用到刚才储存的movies.csv和actor.csv,利用Py2neo来将数据导入至Neo4j中。

首先,需要确保你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,具体的安装流程可参考网址:https://www.w3cschool.cn/neo4... 。

利用Py2neo,我们就可以用Python轻松地实现将数据导入至Neo4j,实现的功能为:创建电影节点以及演员节点,并创建两者之间的关系,关系名称为“ACT_IN”。实现的Python代码()如下:

# -*- coding: utf-8 -*-

import pandas as pd

from py2neo import Graph, Node, Relationship, NodeMatcher

# 读取csv文件

movies_df = pd.read_csv(r'./movies.csv')

actors_df = pd.read_csv(r'./actors.csv')

# 连接Neo4j服务

graph = Graph(host="localhost://7474", auth=("neo4j", "jc147369"))

# 创建电影节

for i in range(movies_df.shape[0]):

rank = str(movies_df.iloc[i, :]['rank'])

name = movies_df.iloc[i, :]['name']

box_office = movies_df.iloc[i, :]['box_office']

avg_price = str(movies_df.iloc[i, :]['avg_price'])

avg_people = str(movies_df.iloc[i, :]['avg_people'])

begin_date = movies_df.iloc[i, :]['begin_date']

node = Node("Movie",

name=name,

rank=rank,

box_office=box_office,

avg_price=avg_price,

avg_people=avg_people,

begin_date=begin_date

)

# print(movies_df.iloc[i, :]['rank'])

graph.create(node)

print('create movie nodes successfully!')

# 创建演员节点

all_actors = set()

for i in range(actors_df.shape[0]):

actor_list = actors_df.iloc[i, :]['actors'].split(',')

for actor in actor_list:

all_actors.add(actor)

for actor in all_actors:

node = Node("Actor", name=actor)

graph.create(node)

print('create actor nodes successfully!')

# 创建演员——电影关系

for i in range(actors_df.shape[0]):

name = actors_df.iloc[i, :]['name']

matcher = NodeMatcher(graph)

movie_node = matcher.match("Movie", name=name).first()

actors = actors_df.iloc[i, :]['actors'].split(',')

# print(name, actors)

for actor in actors:

actor_node = matcher.match("Actor", name=actor).first()

relationship = Relationship(actor_node, 'ACT_IN', movie_node)

graph.create(relationship)

print('create relationships successfully!')

print('You can check Neo4j now!')

只要你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,不出意外,那么你的Neo4j已经默默地储存了这些数据,而它们将会给出带来巨大的惊喜:天呐,这竟然是个数据库!

在浏览器中输入“localhost:7474”,并点击左上方的数据库图标,就能看到下图:

可以看到,在Neo4j中,我们创建了142个节点,分为两类:Movie和Actor,以及136对关系,关系名称为ACT_IN. 当然,这些都是枯燥的,那么我们来看看数据展示这步吧,它会给我们带来什么惊喜?

数据展示

好不容易到了数据展示这一步,之前的努力都不会白费!

在Neo4j的前端页面(也就是网址:http://localhost:7474)中的命令行中输入命令:

MATCH (Movie)

RETURN (Movie);

运行命令后,很快就能得到整个图(包含电影节点、演员节点以及关系)的可视化展示,由于图像过大,不能看清细节,因此,就局部放大来看,同时得到一些简单的分析。

首先是图一,吴京主演的电影。

在中国电影票房排行榜的前20名中,吴京主演了《战狼2》与《流浪地球》,且两者没有其他更多的相同主演。

接着是图二,沈腾主演的电影。

在中国电影票房排行榜的前20名中,沈腾主演了《西虹市首富》、《疯狂的外星人》以及《羞羞的铁拳》,这显示了沈腾的票房号召力(他也是笔者喜欢的喜剧演员),不过开心麻花团队的其他成员在这三部电影的拍摄中应该见不到面。

接着是图三,《捉妖记》及《捉妖记2》。

捉妖记系列电影无疑是成功的,两部电影都进了票房的前20,他们的共同主演就多了,有曾志伟,吴君如,井柏然,白百何。

接着是图四,主要是看看Neo4j帮我们挖掘了哪些潜在的关系。

从《唐人街探案2》到《捉妖记2》,这个不算长的链条给了我们一些惊喜,原来,刘昊然可以通过尚语贤再通过曾志伟认识李宇春,一个very interesting的分析。当然,这个是笔者的分析,他俩到底认不认识笔者是不知道滴~

分析到此结束,如果读者想看原图,可以参看该项目的github地址:https://github.com/percent4/N... 。

总结

感谢读者不厌其烦地看到了这里,看完了这篇“又臭又长”的文章,好在图比较多,应该能稍微减轻点阅读的压力。

再说说该项目的不足之处:那就是Neo4j的操作语法展示的比较少,约等于没有,这主要是笔者也是初入门,不熟。如果后续对Neo4j的操作语法CQL熟练了,我们就能能到更多有趣的结果,而不是这么一句简单的分析(有敷衍的嫌疑)。

最后,对此项目感兴趣的读者,可以移步该项目的github地址:https://github.com/percent4/N... 。

注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注~

参考文献

JAVA模拟电影票房,Neo4j入门之中国电影票房排行浅析相关推荐

  1. Neo4j入门之中国电影票房排行浅析

    什么是Neo4j?   Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持 ...

  2. neo4j入门实例(电影和演员的例子)

    neo4j入门实例(电影和演员的例子) neo4j安装好后,在http://localhost:7474/browser/界面输入:play movie graph 就可以直接能看到电影的知识图谱例子 ...

  3. VR电影这一新概念在中国电影道路上的探索

    在12月的一个下午,Kevin Geiger正在进行关于VR中的故事讲述的一次再普通不过的演讲.地点是北京电影学院里一个围的水泄不通的场馆,他鼓励大家都来参与电影制作,无论是导演.演员还是电影行业的任 ...

  4. CnOpenData中国电影票房数据简介

    目录 一.数据简介 二.样本时间 三.字段展示 四.样本数据 五.数据更新频率 六.联系我们 一.数据简介 随着社会经济发展,文化产业日益繁荣,根据美国电影协会发布的电影市场数据报告显示:仅在2016 ...

  5. 三大特性看明白中国电影市场

    2014年,前60部电影将稳稳占据85%以上的市场份额.其他电影怎么办? 稍后阅读 中国电影市场近些年随着商业地产的高速发展,吸引了众多的眼球:文化商品本身的特殊属性,又将所有的喧哗放大成了喧闹,继而 ...

  6. 中国电影的网络付费点播发行:现状与展望

    上表为截至2011年10月17日,主要视频网站提供在线播放的电影数量. 写作这篇论文时还是7月份,而这几个月以来,视频网站这一市场又发生了很多新的变化,包括土豆网的上市:乐视网和土豆网成立合资公司,建 ...

  7. 移动电影院创造中国电影市场的新增量

    移动电影院作为"电影+互联网"的创新性产品,因有GPS技术.互联网蜂窝定位技术.IP技术等移动互联网技术加持,移动电影院可以把合适的电影送到合适的地方,实现"分区放映&q ...

  8. 电影分区发行新模式创造“中国电影市场的新增量”

    移动电影院作为"电影+互联网"的创新性产品,因有GPS技术.互联网蜂窝定位技术.IP技术等移动互联网技术加持,移动电影院可以把合适的电影送到合适的地方,实现"分区放映&q ...

  9. 电影分区发行 移动端电影院创造中国电影市场新增量

    移动电影院CEO高群耀介绍移动电影院如何为电影市场创造新增量 5月9日,移动电影院V2.0版本上线,正式官宣其核心功能为"观影社交化".新增"约亲友"" ...

最新文章

  1. 成为表情包大帝,仅需几十行python代码,简单易学
  2. Matlab学习笔记——二进制文件的读写
  3. 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
  4. UNIX重定向--dup(2)函数
  5. 七十三、Python | Leetcode数字系列(上篇)
  6. 【Linux】Linux中vim的使用
  7. 不冲突的端口范围_网络中IP地址发生冲突故障怎么办
  8. java nodefilter类,Java Servlet Filter过滤器概述
  9. Python学习笔记(一) 计算阶乘
  10. 如何使用Python 画笔
  11. 计算机英语教程第6版,计算机英语教程(第6版)
  12. C++windows环境管道通信
  13. 有一个测试微信删除软件叫wool,微信中用发起群聊来测试你有没有被对方删除好友方法图文教程...
  14. 概率论复习笔记(一)随机事件及其概率
  15. 服务器虚拟化实施方案可研报告,服务器虚拟化实施方案可研可行报告报告(2017word资料).doc...
  16. Ubuntu 找不到wifi适配器
  17. 兰燕-杨平平的需求建议
  18. 欧奈尔的RPS指标如何使用到股票预测
  19. 百度Q-T语义一致性比未获奖 (总结)
  20. js项目中常见util方法

热门文章

  1. 电脑显示没有wifi连接到服务器地址,WIFI无ip分配怎么解决
  2. 数据库课程设计----学生信息与选课、成绩评价管理系统
  3. 等待指示器(2) -- 网络等待指示器
  4. 浅谈2019互联网新技术
  5. 大学计算机基础教程excel实验报告,大学计算机基础教程excel实验报告.doc
  6. java 判断简体 繁体字_java判定字符是英文,中文简体,还是繁体
  7. grub2下常见系统初始化错误的分析和解决
  8. Git分布式版本管理工具
  9. TIA博途_基于SCL语言制作模拟量输入输出全局库的具体方法
  10. 一个基于 Vue3 Vite 的相册应用