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

    xiaoxiao2024-11-14  75

    说明: 本文是让大家可以快速上手使用图数据库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 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笔记

    最新回复(0)