本文主要是介绍Neo4j使用 实例介绍 快速上手 从入门到熟练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明:
本文是让大家可以快速上手使用图数据库Neo4j ,让大家对图数据库有个整体了解,具体细节大家可参考文章末的其他参考文档
节点用 ()
表示
关系用 []
表示
节点到节点的关系用 ()-[]->()
表示
节点和关系中都可以有属性,用 {}
表示,里面以键值对表示属性名和值
节点:表示一个实体记录,就像关系数据库中的一条记录一样,一个节点可以包含多个属性(property)和多个标签(Label)
例如图片中有两个节点
左边节点Label
为Person
,节点的属性有name
,birth
,gender
等
右边节点Label
为Movie
,节点的属性有title
,mins
,releasedate
等
注:冒号前的p
、m
、r
是变量,指代两个节点和关系
关系:关系用来连接两个节点,其始端和末端都必须有节点,一个关系可以包含多个属性(property),但只能有一个类型(Type),关系是有方向
例如图片中有一个关系:
邓超出演电影《影》
关系Type
为出演
关系property
为roles
,value
为['子虞','境州']
基础操作
创建节点
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_id
、genre
- 电影信息
movie.csv
字段:movie_id
、title
、rating
、releasedate
、introduction
- 演员信息
person.csv
字段:person_id
、name
、gender
、birth
、death
、birthplace
、biography
- 电影与类型关系
movie_to_genre.vsc
字段:movie_id
、genre_id
- 演员与电影关系
person_to_movie.csv
字段:person_id
、movie_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 *
查询两人合作出演电影超过两部的演员,电影,以及合作出演电影名称及数量
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
合作关系查询
查询成龙合作过的明星数量
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 csva = 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笔记
这篇关于Neo4j使用 实例介绍 快速上手 从入门到熟练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!