Neo4j图数据库

数据库安装

  1. 下载安装包 https://neo4j.com/artifact.php?name=neo4j-community-4.1.1-windows.zip

  2. 解压

    bin:数据库启动等文件

    neo4j.bat 服务端启动文件

    cypher-shell.bat 不适用浏览器,使用shell输命令执行CQL语言

    neo4j-admin.bat neo4j管理员工具,数据库备份导出这些的

    conf: 数据库配置文件

    data: 数据库持久化默认文件夹,可以在配置文件修改默认目录

    logs: 数据库日志文件

  3. cmd进入bin目录,输入neo4j.bat console

    可以看出,可以在本机的7474端口可以访问

  4. 浏览器输入 http://localhost:7474/

    这里用户名和密码默认都是neo4j,进去就会修改默认密码,修改成功就可

  5. 进入neo4j控制台

数据库案例初识

图的基本理念

一个图数据库使用以下理念能存储任何数据

  1. 节点 - 图的数据记录

  2. 关系 - 连接节点

  3. 属性 - 标识数据值

图数据库节点和属性

  1. 节点就是记录在图中的数据

  2. 数据以Properties的方式储存

  3. Properties就是简单的键值对

图数据库的标签

标签是用来关联一组节点的,也就说说节点使用标签分类,标签就是类,而节点就是这个类的实例

  1. 一个节点可以有>=0个标签

  2. 标签不能有属性

约束自由

节点可以有不同的属性

  1. 同一类节点可以有不同的标签,这里的类表示拥有相同的标签

  2. 属性可以是字符串、数字、布尔型

  3. Neo4j可以储存数十亿个节点

图的关系

连接图中节点的

  1. 关系有方向性

  2. 关系有类型

  3. 关系不是任意定义的,它也有数据模型

关系属性

关系属性用来储存两个节点之间的共享信息

数据库查询语言CQL

Cypher : Neo4j的图查询语言

概述

  1. 使用模式描述图形数据

  2. 熟悉的类似SQL的查询语句

  3. 说明性的,描述要查找的内容,而不是如何查找

Cypher

创建节点CREATE

使用create创建一个节点

CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })

解释:创建一个标签为Person的节点ee,他的属性有name是Emil、from是Sweden和klout是99

查询节点MATCH

使用match语句查找节点

MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;

解释: 查找标签为Person,节点的name属性为Emil的,节点定义为ee,然后把这个节点ee返回,这里的ee不一定是数据库创建时的那个名字

创建多个节点和多个关系

MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

解释:

  1. MATCH (ee:Person) WHERE ee.name = "Emil" 将第一次创建的那个节点引入,因为要和其他节点建立关系

  2. (ee)-[:KNOWS {since: 2001}]->(js) 给ee节点和js节点建立一个关系,从ee指向js的,关系上共享数据是since 2001,也就是说ee自从2001年了解到js的

查看劳动成果

MATCH (abc:Person) RETURN abc

关系查询

MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends

解释: 查询name属性为Emil的Person,和他有KNOWS关系的人,然后返回这个人和所有符合的朋友

执行结果:

注意:如果不返回ee的话,只返回他的朋友

MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN friends

思考:

MATCH (ee:Person)-[:KNOWS]-(friends) RETURN friends
MATCH (ee:Person) RETURN ee

这两句的返回结果一样?

推荐节点

MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

解释: 找到和Johan有相同爱好surfing的人

执行的任务可视化

使用关键字:EXPLAINPROFILE

  • EXPLAIN:是解释机制,加入该关键字的Cypher语句可以预览执行的过程但并不实际执行,所以也不会产生任何结果。

  • PROFILE:则是画像机制,查询中使用该关键字,不仅能够看到执行计划的详细内容,也可以看到查询的执行结果。

例子

PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

注意:可以根据执行分析对CQL进行

电影案例

  1. 返回姓名为Tom Hanks的演员

    match (aa:Person) where aa.name="Tom Hanks" return aa;
    match (aa {name:"Tom Hanks"}) return aa;
  2. 查找演员名字最多10个(使用limit关键字)

    match (p:Person) return p.name limit 10
  3. 查找电影在20世纪90年代发布的电影

    match (m:Movie) where m.released >= 1900 and m.released < 2000 return m.title;
  4. 查找Tom Hanks参与过的电影

    match (p:Person)-[:ACTED_IN]->(m:Movie) where p.name="Tom Hanks" return p,m;
    MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
  5. 谁参与表演了电影Cloud Atlas

    match (m:Movie)<-[:DIRECTED]-(p:Person) where m.title="Cloud Atlas" return p.name;
    MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name
  6. 查找和Tom Hanks一起演出的人

    match (p:Person) -[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(co:Person) where p.name="Tom Hanks" return co.name;
    MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name
  7. 和电影Cloud Atlas有关系的人和关系类型

    match (p:Person) -[rel]-(m:Movie) where m.title="Cloud Atlas" return p.name,Type(rel),rel;
    MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo
  8. 能通过最大4个节点找到的节点

    MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood)
    RETURN DISTINCT hollywood

    这里[*1..4] 表示1到4 ,[*3] 表示3

  9. 查找Kevin Bacon和Meg Ryan能关联到的关系的最短路径

    MATCH p=shortestPath(
    (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
    )
    RETURN p

    这里*表示任何关系

  10. 查找没和Tom Hanks一起演出的人,但是他们之间有联系

    MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
    (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
    WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
    RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC

    分析:

    1. (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)这句话coActors表示和Tom Hanks一起表演过的人

    2. (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors) 这句话cocoActors表示和coActors一起表演过的人,这里意味着找到了朋友的朋友

    3. NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) 这句话排除了既是朋友的朋友,又是朋友的人

    4. tom <> cocoActors 这句话保证了所得的朋友的朋友不是自己

    5. count(*) AS Strength这里统计了Tom Hanks到朋友的朋友能到达的路径条数,可以用这个表达推荐的优先级

    6. ORDER BY Strength DESC按照Strength 降序排序

  11. 查找既参演过Tom Hanks演过的电影,又参演了Tom Cruise演过的电影的

    MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
    (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
    RETURN tom, m, coActors, m2, cruise

    一张图看懂这句话

技巧

查看图中所有节点和关系

MATCH (n) RETURN n

删除所有节点

MATCH (n) DETACH DELETE n

判断属性是否存在

is null

SpringBoot整合Neo4j

构建图

依赖导入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

配置文件

spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=860820

编写实体类

import lombok.Data;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;@NodeEntity(label = "USER")
@Data
public class User {@Idprivate Long id;private Integer userId;private String userName;private Integer age;private String password;
}
@RelationshipEntity(type = "FRIEND_WITH")
@Data
public class FriendRelation {@Idprivate Long id;@StartNodeprivate User startNode;@EndNodeprivate User endNode;private Date since;
}

编写DAO层接口

import com.example.neo4jdemo.pojo.User;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface UserDao extends Neo4jRepository<User,Long> {/*** 查询所有用户* @return*/@Query("MATCH (user:USER) RETURN user")List<User> getUserList();/*** 按照姓名查询* @param name* @return*/@Query("MATCH (user:USER) WHERE user.userName=$userName RETURN user")List<User> getUserByName(@Param("userName") String name);}
import com.example.neo4jdemo.pojo.FriendRelation;
import com.example.neo4jdemo.pojo.User;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface FriendRelationDao extends Neo4jRepository<FriendRelation,Long> {/*** 查找指定姓名的朋友* @param name* @return*/@Query("MATCH (u:USER)-[:FRIEND_WITH]->(rl) WHERE u.userName=$name RETURN rl")List<User> getFriend(@Param("name") String name);/*** 按照姓名查找朋友的朋友* @param name* @return*/@Query("MATCH (u:USER{userName:$name})-[:FRIEND_WITH]->(rl:USER),(rl)-[:FRIEND_WITH]->(newf:USER) WHERE NOT (u)-[:FRIEND_WITH]->(newf)  AND u<> newf RETURN newf")List<User> getMayBeFriend(@Param("name") String name);
}
import com.example.neo4jdemo.pojo.FriendRelation;
import com.example.neo4jdemo.pojo.User;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface FriendRelationDao extends Neo4jRepository<FriendRelation,Long> {@Query("MATCH (u:USER)-[:FRIEND_WITH]->(rl) WHERE u.userName=$name RETURN rl")List<User> getFriend(@Param("name") String name);@Query("MATCH (u:USER{userName:$name})-[:FRIEND_WITH]->(rl:USER),(rl)-[:FRIEND_WITH]->(newf:USER) WHERE NOT (u)-[:FRIEND_WITH]->(newf)  AND u<> newf RETURN newf")List<User> getMayBeFriend(@Param("name") String name);
}

编写服务接口和实现类

(这里懒,没有写接口)

import com.example.neo4jdemo.dao.FriendRelationDao;
import com.example.neo4jdemo.dao.UserDao;
import com.example.neo4jdemo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate FriendRelationDao friendRelationDao;public List<User> findByName(String name){return userDao.getUserByName(name);}public List<User> findAll(){return userDao.getUserList();}public List<User> getFriend(String name){return friendRelationDao.getFriend(name);}public List<User> recommend(String name){return friendRelationDao.getMayBeFriend(name);}
}

编写Controller

import com.example.neo4jdemo.pojo.User;
import com.example.neo4jdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;@Controller
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/get")@ResponseBodypublic List<User> get(){return userService.findAll();}@GetMapping("/get/{name}")@ResponseBodypublic List<User> get(@PathVariable String name){return userService.findByName(name);}@GetMapping("/friend/{name}")@ResponseBodypublic List<User> getFriend(@PathVariable String name){return userService.getFriend(name);}@GetMapping("/recommend/{name}")@ResponseBodypublic List<User> getMeyBeFriend(@PathVariable String name){return userService.recommend(name);}
}

浏览器查看结果

Neo4j图数据库学习笔记相关推荐

  1. 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))

    数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...

  2. Ubuntu14.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu 14.04.4 LTS ...

  3. Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu 16.04.1 LTS ...

  4. Neo4j图数据库从入门到精通

    add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...

  5. Python操作Neo4j图数据库的两种方式

    Python操作Neo4j图数据库的两种方式 前言 1. 用neo4j模块执行CQL ( cypher ) 语句 2. 用py2neo模块通过操作python变量,达到操作neo4j的目的 3. 用p ...

  6. Task 5 Cypher 介绍及Neo4j 图数据库查询

    Datawhale 知识图谱组队学习 Task 5 Neo4j 图数据库查询 一. Neo4介绍 二. Neo4j 介绍 3.1 Cypher 介绍 3.2 Neo4j 图数据库 查询 四. 基于知识 ...

  7. 聊聊Neo4j图数据库的那些明显优势

    摘要: Neo4j是一个NoSQL的图数据库管理系统,像其他NoSQL数据库一样具有高效的查询性能.同时,Neo4j还具有完全事务管理特性,完全支持ACID事务管理.Neo4j与其他数据库相比,具有哪 ...

  8. 数据库学习笔记(一) | 数据(Data)的定义

    数据库学习笔记(一) | 数据(Data)的定义和种类 什么是数据(Data) 结构化数据(Structured Data) 半结构化数据(Semi-structured Data) 非结构化数据(U ...

  9. neo4j图数据库:结构化数据流水线、非结构化数据流水线

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 智能对话系统:Unit对话API 在线聊天的总体架构与工具介绍 ...

最新文章

  1. KDD Cup 2021 时序异常检测总结!
  2. tensorflow 使用CPU而不使用GPU的问题解决
  3. 源码包部署tomcat
  4. MPD2011 深圳站 徐锋《手机(及互联网产品)可以做得更好》要点纪要
  5. mybatis 级联查询兑现_MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)...
  6. 程序设计基础-c#和java的区别
  7. SharpGL中Finish和Flush的区别
  8. 微星主板节能模式怎么关闭_技嘉小雕、微星迫击炮、华硕电竞特工三款主板对比...
  9. 企业信息化战略规划方法
  10. k2p路由器搭建php,K2P新手教程之openwrt cc 基础设置
  11. Matlab学习10-图像处理之傅里叶变换
  12. 浙江大学计算机系自主招生题目,浙江大学自主招生试题
  13. 传智播客mysql 下载_传智播客mysqlppt
  14. Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
  15. 如何使用PTGUI全景合成软件进行照片拼接
  16. js判断字符串是不是一个纯数字
  17. uni-app+iconfont 实现星级评分(vue)
  18. c# 新中新二代身份证阅读,包含头像,支持华视
  19. 【经验】知乎、科学网的经典帖子分享
  20. RTKPLOT导出卫星数据并进行Python天空图绘制

热门文章

  1. SDL Trados 2019 和 2021 十月更新
  2. 大数据学习阶段,每天2小时学习,成就不一样的自己
  3. win10自带邮箱发件箱为空
  4. 计算机pdf转换word,电脑pdf改成word格式,值得收藏的方法!
  5. Chrome浏览器批量离线下载迅雷快传资源
  6. 论文解读:Answering while Summarizing: Multi-task Learning for Multi-hop QA with Evidence Extraction
  7. 样品制备丨G-Biosciences Tube-O-CONCENTRATOR 方案
  8. 简明Pyhton教程余下基础内容
  9. 万能文件加密授权工具可以加密iso吗_超时代视频加密软件下载_超时代视频加密软件免费下载...
  10. CRYPTOHACK [RSA]Crossed Wires wp