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

2024-02-28 11:50

本文主要是介绍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 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使用 实例介绍 快速上手 从入门到熟练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755423

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的