说明: 本文是让大家可以快速上手使用图数据库Neo4j ,让大家对图数据库有个整体了解,具体细节大家可参考文章末的其他参考文档
节点用 () 表示
关系用 [] 表示
节点到节点的关系用 ()-[]->() 表示
节点和关系中都可以有属性,用 {} 表示,里面以键值对表示属性名和值
节点:表示一个实体记录,就像关系数据库中的一条记录一样,一个节点可以包含多个属性(property)和多个标签(Label)
例如图片中有两个节点 左边节点 Label 为 Person,节点的属性有 name ,birth ,gender 等 右边节点 Label 为 Movie,节点的属性有 title ,mins ,releasedate 等 注:冒号前的 p 、 m 、r 是变量,指代两个节点和关系
关系:关系用来连接两个节点,其始端和末端都必须有节点,一个关系可以包含多个属性(property),但只能有一个类型(Type),关系是有方向
例如图片中有一个关系: 邓超出演电影《影》 关系 Type 为 出演 关系 property 为 roles ,value 为 ['子虞','境州']
注意:
上面可以再插入一条同样的数据看看有什么结果, 用 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(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)创建索引
create index on:Person(person_id) create index on:Person(name)创建索引
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 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笔记