Neo4j使用 实例介绍 快速上手 从入门到熟练

说明:
本文是让大家可以快速上手使用图数据库Neo4j ,让大家对图数据库有个整体了解,具体细节大家可参考文章末的其他参考文档

在这里插入图片描述
在这里插入图片描述
节点用 () 表示

关系用 [] 表示

节点到节点的关系用 ()-[]->() 表示

节点和关系中都可以有属性,用 {} 表示,里面以键值对表示属性名和值

节点:表示一个实体记录,就像关系数据库中的一条记录一样,一个节点可以包含多个属性(property)和多个标签(Label)

例如图片中有两个节点
左边节点 LabelPerson,节点的属性有 namebirthgender
右边节点 LabelMovie,节点的属性有 titleminsreleasedate
冒号前的 pmr 是变量,指代两个节点和关系

关系:关系用来连接两个节点,其始端和末端都必须有节点,一个关系可以包含多个属性(property),但只能有一个类型(Type),关系是有方向

例如图片中有一个关系: 邓超出演电影《影》
关系 Type出演
关系 propertyrolesvalue['子虞','境州']


基础操作

创建节点

create(:Person{name:"邓超",gender:'M',born:1979})
//merge(:Person{name:"邓超",gender:'M',born:1979})

注意

上面可以再插入一条同样的数据看看有什么结果,
create 即便是重复的数据也会再插入一条,会有两个邓超,用 merge 创建则不会新增节点
后续操作可能更多使用到 merge

create(:Person{name:"孙俪",gender:'F',born:1982}),
(:Person{name:"冯小刚",gender:'M',born:1958}),
(:Person{name:"徐帆",gender:'F',born:1967}), 
(:Person{name:"张艺谋",gender:'M',born:1950}),
(:Movie{title:'影',mins:116,rating:7.2,releasedate:'2018-09-30'})

查询所有人:

match(p:Person) return p
在这里插入图片描述
查询叫邓超的人:

match(p:Person{name:'邓超'}) return p

等价于

match(p:Person) where p.name='邓超' return p

查询性别为F的人

match(p{gender:"F"}) return p```
```sql
match(p{gender:"F"}) return p.name as name,p.born as born

查询born属性小于1980 的节点

match(n) where n.born<1980 return n

在这里插入图片描述

创建关系

match (p:Person{name:"张艺谋"}),(m:Movie{title:"影"})   
create (p)-[r:导演]->(m) return r
match (p1:Person),(p2:Person) 
where p1.name='邓超' and p2.name='孙俪' 
create (p1)-[:夫妻]->(p2),(p1)<-[:夫妻]-(p2)
match (p1:Person{name:"冯小刚"}),(p2:Person{name:"徐帆"})
create (p1)<-[r1:夫妻]-(p2),(p1)-[r2:夫妻]->(p2) 
match (p1:Person{name:"冯小刚"}),(p2:Person{name:"张艺谋"})  
create (p1)-[:朋友]->(p2),(p2)-[:朋友]->(p1)
match (p:Person{name:"邓超"}),(m:Movie{title:"影"})  
create (p)-[r:出演{roles:['境州','子虞']}]->(m),(m)-[r1:演员]->(p) return *
match (p:Person{name:"孙俪"}),(m:Movie{title:"影"})   
create (p)-[r:出演]->(m),(m)-[r1:演员]->(p) return *

查询所有的关系

Match(p1)-[r]->(p2) Return *

查询关系为 夫妻 的人

Match(p1)-[r:夫妻]->(p2) Return *

在这里插入图片描述

增删改

增加 标签/属性 用 set
删除 标签用/属性 用 remove
删除 关系/节点用 delete

节点增加标签 为邓超增加Star标签

match(n) where n.name='邓超' set n:Star return n

在这里插入图片描述
节点删除标签

match(n) where n.name='邓超' remove n:Star return n

节点增加属性 为孙俪增加 other_name 属性

match(n) where n.name='孙俪' set n.other_name='娘娘' return n

在这里插入图片描述
节点删除属性

match(n) where n.name='孙俪' remove  n.other_name return n

关系增加属性 为"孙俪"到"影"之间的关系增加role属性

match (p:Person{name:"孙俪"})-[r]->(m:Movie{title:"影"}) set r.role='小艾' return *

在这里插入图片描述
关系删除属性

match (p:Person{name:"孙俪"})-[r]->(m:Movie{title:"影"}) remove r.roles return *

删除节点

match(n) where n.name="邓超" 
delete n

在这里插入图片描述
注意带关系的节点应该先删除关系后才能删除节点,否则删除时报错
删除关系

match(n)<-[r]->() 
where n.name="邓超"
delete r

全部删除

match(n) detach delete n

数据节点导入及查询

数据集介绍:

电影关系数据集

  • 电影类型
    • genre.csv 字段:genre_idgenre
  • 电影信息
    • movie.csv 字段: movie_idtitleratingreleasedateintroduction
  • 演员信息
    • person.csv 字段: person_idnamegenderbirthdeathbirthplacebiography
  • 电影与类型关系
    • movie_to_genre.vsc 字段: movie_idgenre_id
  • 演员与电影关系
    • person_to_movie.csv 字段: person_idmovie_id

查询导入文件多少行

load csv with headers from "file:///E:/neo4j-3.5.2/import/movie/genre.csv" as line
return count(*)

查看导入文件前5行数据

load csv with headers from "file:///E:/neo4j-3.5.2/import/movie/genre.csv" as line
return line limit 5

注意:

neo4j 默认只能在安装问价下的 import 目录下的文件才能导入,要想导入其他目录下的文件,需要修改配置文件,在 conf 下的 neo4j.conf 文件,把 # dbms.directories.import=import该行注释掉,另外还要注意,在windows 上操作路径应该注意,和我写的类似,linux 上按照正常路径就行。例如:"file:///home/data/genre.csv"

在这里插入图片描述

导入电影类型节点

using periodic commit 500 //当数据较多的时候加上这句,每500条提交一次,默认500

using periodic commit
load csv with headers from "file:///E:/neo4j-3.5.2/import/movie/genre.csv" as line
merge (g:Genre{genre_id:toInteger(line.genre_id),genre:line.genre})

创建索引

create index on:Genre(genre_id)
create index on:Genre(genre)

导入演员节点

load csv with headers from "file:///E:/neo4j-3.5.2/import/movie/person.csv" as line
merge (p:Person{person_id:line.person_id})
set p=line,p.person_id=toInteger(line.person_id)

创建索引

create index on:Person(person_id)
create index on:Person(name)

导入电影节点

LOAD CSV WITH HEADERS  FROM "file:///E:/neo4j-3.5.2/import/movie/movie.csv" AS line  
MERGE (m:Movie{movie_id:line.movie_id})
set m=line,m.rating=toFloat(line.rating),m.movie_id=toInteger(line.movie_id)

创建索引

create index on:Movie(movie_id)
create index on:Movie(title)

在这里插入图片描述

简单查询

查询都有什么电影类型

match(g:Genre) return g.genre

查询所有演员的信息

match(p:Person) return p limit 50

在这里插入图片描述

match(p:Person) 
return p.name,p.birth,p.birthplace,p.biography
limit 20

查询喜欢演员的信息

match(p:Person) where p.name="林青霞" return *

在这里插入图片描述
查询所有电影

MATCH (n:Movie) RETURN n LIMIT 25

查询电影按评分降序排列

match (m:Movie) 
return m.title,m.rating 
order by m.rating desc limit 50

在这里插入图片描述

数据关系导入

导入演员与电影关系

LOAD CSV WITH HEADERS FROM "file:///E:/neo4j-3.5.2/import/movie/person_to_movie.csv" AS line 
match (p:Person{person_id:toInteger(line.person_id)}),(m:Movie{movie_id:toInteger(line.movie_id)})  
merge (p)-[r1:出演]->(m)
merge (m)-[r2:演员]->(p)

导入电影与类型关系

LOAD CSV WITH HEADERS FROM "file:///E:/neo4j-3.5.2/import/movie/movie_to_genre.csv" AS line
match (m:Movie{movie_id:toInteger(line.movie_id)}),(g:Genre{genre_id:toInteger(line.genre_id)})  
merge (m)-[r:is{movie_id:toInteger(line.movie_id),genre_id:toInteger(line.genre_id)}]->(g)
merge (g)-[r1:include{movie_id:toInteger(line.movie_id),genre_id:toInteger(line.genre_id)}]->(m)

查询爱情类电影数量

match(m:Movie)-[is]->(g:Genre{genre:"爱情"})
return count(distinct m)

查询爱情类电影信息

match(m:Movie)-[is]->(g:Genre{genre:"爱情"})
return m.title,m.rating,m.introduction limit 20

查询爱情类电影信息按评分排序

match(m:Movie)-[is]->(g:Genre{genre:"爱情"})
return m.title,m.rating,m.introduction 
order by  m.rating desc limit 20

在这里插入图片描述
查询各种类型的电影数量并降序排列

match(g:Genre)-->(m:Movie)
return g.genre as genre,count(distinct m) as movie_num 
order by movie_num desc

在这里插入图片描述
查询成龙演的电影信息:

match (p:Person{name:"成龙"})-[:出演]->(m)
return m.title as title,m.rating as rating,m.introduction as introduction

查询成龙出演的评分高的电影(对电影评分进行排序)

match (p:Person{name:"成龙"})-[:出演]->(m)
with m.title as title,m.introduction as introduction,m.rating as rating,m.release as release
return title,rating,introduction,release
order by rating desc

查看成龙拍过什么类型的电影

match (p:Person{name:"成龙"})-[:出演]->(m)-[:is]->(g:Genre)
return distinct g.genre

只想看成龙的动作类电影

match (p:Person{name:"成龙"})-[:出演]->(m)-[:is]->(g:Genre{genre:"动作"})
with m.title as title,m.introduction as introduction,m.rating as rating,g.genre as genre
order by rating desc
return title,rating,introduction,genre limit 25

成龙的动作类电影(可视化展示)

match P=(p:Person{name:"成龙"})-[:出演]->(m)-[:is]->(g:Genre{genre:"动作"})
return P limit 25

在这里插入图片描述
查询成龙和洪金宝演出的电影 并按评分降序排序

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"洪金宝"})
with m.title as title,m.introduction as introduction,m.rating as rating,m.releasedate as releasedate 
return title,introduction,rating,releasedate
order by rating desc limit 10

查询成龙和洪金宝演出的电影(可视化展示)

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"洪金宝"})
return *

在这里插入图片描述
想看 成龙、洪金宝、刘德华 一起演的电影

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"洪金宝"})
match (p2:Person{name:"刘德华"})-[:出演]->(m)
with m.title as title,m.introduction as introduction,m.rating as rating
return title,introduction,rating
order by rating desc limit 5

想看 成龙、洪金宝、刘德华 一起演的电影(可视化展示)

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"洪金宝"})
match (p2:Person{name:"刘德华"})-[:出演]->(m)
return *

在这里插入图片描述
查询李连杰 成龙共同出演的动作类电影

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"李连杰"})
match (m)-[:is]->(g:Genre{genre:"动作"})
with m.title as title,m.introduction as introduction,m.rating as rating,g.genre as genre
return title,introduction,rating,genre
order by rating desc

查询李连杰 成龙共同出演的动作电影(可视化展示)

match (p:Person{name:"成龙"})-[:出演]->(m)<-[:出演]-(p1:Person{name:"李连杰"})
match (m)-[]->(G{genre:"动作"})
return *

图片7
查询两人合作出演电影超过两部的演员,电影,以及合作出演电影名称及数量

match (p:Person)-[:出演]->(m)<-[:出演]-(p1:Person)
with p.name as name1,count(distinct m) as sum,p1.name as name2,collect(distinct m.title) as movie_lis
where sum >= 2
return name1,name2,sum,movie_lis order by sum desc

在这里插入图片描述
查询演员出演电影数量降序排列

match (p:Person)-[:出演]->(m:Movie)
with p.name as name,count(distinct m) as movie_num
return name,movie_num order by movie_num desc limit 50

查询电影演员数量降序排列

match (p:Person)-[:出演]->(m:Movie)
with m.title as title,count(p) as person_num
return title,person_num order by person_num desc limit 50

查询电影 “豪门夜宴” 中 女演员的比例

match (p1:Person{gender:"F"})-[:出演]->(m:Movie{title:"豪门夜宴"}),(p2:Person)-[:出演]->(m:Movie{title:"豪门夜宴"})
with count(distinct p1) as person_F_num,count(distinct p2) as person_num
return person_F_num,person_num,tofloat(person_F_num)/person_num as F_rate

查询所有电影中女演员的比例,并按演员总数量进行将序排列

match (p1:Person{gender:"F"})-[:出演]->(m:Movie),(p2:Person)-[:出演]->(m:Movie)
with count(distinct p1) as person_F_num,count(distinct p2) as person_num,m.title as title
return title,person_F_num,person_num,tofloat(person_F_num)/person_num as F_rate 
order by person_num desc limit 10

1549074981_1_

合作关系查询

查询成龙合作过的明星数量

match (p1:Person{name:"成龙"})-[:出演]->(:Movie)<-[:出演]-(p2:Person)
return count(p2)

上面查询包含大量重复信息,直接查询,结果错误,应该去重用 distinct

match (p1:Person{name:"成龙"})-[:出演]->(:Movie)<-[:出演]-(p2:Person)
return count(distinct p2) 

在这里插入图片描述
查询成龙合作过的明星(可视化展示)

match (p1:Person{name:"成龙"})-[r:出演]->(m:Movie)<-[:出演]-(p2:Person)
return * limit 100

在这里插入图片描述
查询成龙合作过的演员名字

match (p1:Person{name:"成龙"})-[:出演]->(:Movie)<-[:出演]-(p2:Person)
with distinct p2,p2.name as name
return name

查询成龙合作过的女演员名字

match (p1:Person{name:"成龙"})-[:出演]->(:Movie)<-[:出演]-(p2:Person{gender:"F"})
with distinct p2,p2.name as name
return name

查询合作明星最多的演员名字及合作数量

match (p1:Person{})-[:出演]->(:Movie)<-[:出演]-(p2:Person)
with p1.name as name,count(distinct p2) as partner_num
order by partner_num desc
return name,partner_num limit 20

查询合作明星最多的女演员名字及合作数量

match (p1:Person)-[:出演]->(:Movie)<-[:出演]-(p2:Person{gender:"F"})
with p1.name as name,count(distinct p2) as partner_num
order by partner_num desc
return name,partner_num limit 20

查询男演员合作女演员数量最多的排序

match (p1:Person{gender:"M"})-[:出演]->(:Movie)<-[:出演]-(p2:Person{gender:"F"})
with p1.name as name,count(distinct p2) as partner_num
order by partner_num desc
return name,partner_num limit 20

在这里插入图片描述

明星关系数据导入

明星关系数据
表不能直接用load csv 的方式导入
可以用以下python程序导入

from py2neo import Graph
import csv

a = open('./relationship.csv', encoding='utf-8',)
relation = csv.reader(a)
graph = Graph('http://localhost:7474/browser/', username='neo4j', password='graph')
for line in relation:
    print(line)
    name1 = line[0]
    name2 = line[2]
    relation = line[1]
    graph.run("merge(p1:Person{name:'%s'}) merge(p2:Person{name:'%s'}) merge (p1)-[r1:%s]->(p2) merge (p2)-[r2:%s]->(p1)"%(name1,name2,relation,relation))
print("Done!")

路径查询

查询 (出演 演员)之外的其他关系

match P=(p1:Person)-[r*1..1]->()
where NONE (x in r where type(x)in['出演','演员'])
return P

在这里插入图片描述
在这里插入图片描述
林青霞3层关系内关系网(排除出演和演员关系)

match P=(p1:Person{name:'林青霞'})-[r*..3]->()
where NONE (x in r where type(x)in['出演','演员'])
return P

在这里插入图片描述
在这里插入图片描述
林青霞3层关系内人数(排除出演和演员关系)

match P=(p1:Person{name:'林青霞'})-[r*..3]->(p:Person)
where NONE (x in r where type(x)in['出演','演员'])
return count(distinct p)

查询周杰伦和赵薇最短路径(排除 “出演”和”演员” 关系)

match (p1:Person{name:'周杰伦'}),(p2:Person{name:"赵薇"}),
P=shortestpath((p1)-[r*..6]->(p2)) 
where NONE (x in r where type(x)in['出演','演员'])
return P

在这里插入图片描述

match (p1:Person{name:'韩红'}),(p2:Person{name:"成龙"}),
P=shortestpath((p1)-[r*..6]->(p2)) 
where NONE (x in r where type(x)in['出演','演员'])
return P

查询 韩红 和 成龙 之间 最短路径的长度

match (p1:Person{name:'韩红'}),(p2:Person{name:"成龙"}),
P=shortestpath((p1)-[r*..6]->(p2)) 
where NONE (x in r where type(x)in['出演','演员'])
return length(P)

正则匹配查询

查询 出生地为 上海 的 人

match(n:Person)
where n.birthplace =~ '.*Shanghai.*'
return n.name,n.birthplace limit 30

在这里插入图片描述
查看所数据库结构

:schema

在这里插入图片描述
本次介绍只是让大家对图数据库 Neo4J 有个整体的认识,细节方面大家可以参考下面文档

相关参考

官方文档
配置及 cypher操作手册
W3Cschool neo4j教程
腾讯云Neo4j使用指南
Neo4j Cypher查询语言详解
基于电影知识图谱的智能问答系统
Neo4j查询节点间最短路径
neo4j 大量数据的批量导入
neo4j笔记

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

viziviuz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值