初识 Neo4j

前置知识

什么是图数据库

图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据

图数据库诞生的背景

随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。

图数据库的应用场景
  • 社交领域:Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐
  • 零售领域:eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验
  • 金融领域:摩根大通,花旗和瑞银等银行在用图数据库做风控处理
  • 汽车制造领域:沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案
  • 电信领域:Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络,控制访问并支持客户
  • 酒店领域:万豪和雅高酒店等顶级酒店公司依使用图数据库来管理复杂且快速变化的库存图数据库并非指存储图片的数据库,而是以图数据结构存储和查询数据。

Neo4j

什么是 Neo4j

Neo4j是一个开源的NoSQL图形数据库,2003 年开始开发,使用 scala和java 语言,2007年开始发布。

  • 是世界上最先进的图数据库之一,提供原生的图数据存储,检索和处理;
  • 采用属性图模型(Property graph model),极大的完善和丰富图数据模型;
  • 专属查询语言 Cypher,直观,高效;

Neo4j 的官网链接:https://neo4j.com/

Neo4j 的安装

Neo4J 官网的下载地址 https://neo4j.com/download-center/#community

1. Linux 的安装
# 首先进入Neo4J 需要安装的目录,然后上传 Neo4J 的压缩包并且解压
cd /usr/local/
# 解压 Neo4J 的压缩包
tar -zxf neo4j-community-3.5.30-unix.tar
# 进入 Neo4J 的目录
cd neo4j-community-3.5.30/
# 修改配置文件
vi conf/neo4j.conf
# =============== 修改注释 ================
# 将下列内容前的注释给去掉,以便其他机器可以建立连接
dbms.connectors.default_listen_address=0.0.0.0
dbms.connector.bolt.tls_level=OPTIONAL
dbms.connector.bolt.listen_address=:7687
dbms.connector.http.listen_address=:7474
dbms.connector.https.listen_address=:7473
#======================================
# 启动 neo4j
bin/neo4j console

随后便可以在浏览器中直接使用 http://{ip_address}:7474/browser/ 便可以进行访问

PS: Neo4j 4.X 版本需要 java 11 以上

2. Docker 的安装
# 拉取docker镜像
docker pull neo4j:3.5.22-community
# 运行镜像
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j \
-e "NEO4J_AUTH=neo4j/123456" \
-v /usr/local/soft/neo4j/data:/data \
-v /usr/local/soft/neo4j/logs:/logs \
-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import \
neo4j:3.5.22-community

Neo4j 的使用 (Cypher QL)

1. Neo4j 的构建元素

标签
标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。标签用冒号表示例如 :label

节点

节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。

节点在 CQL 一般用小括号来表示,例如 (p:Product)

关系

关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。

基于方向性,Neo4j关系被分为两种主要类型:

  • 单向关系 单向关系用 ()-[]->() 来表示
  • 双向关系 双向关系用 ()-[]-() 来表示

属性

属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示。属性用大括号来表示。例如 {key:value}

Cypher QL 的使用
创建节点
# 创建单个节点
create (p)
# 创建多个节点
create (q),(r)
# 创建带有标签的节点
create (a:label_a)
# 创建多标签节点
create (n:label_a:laberl_b)
# 创建带有标签属性的节点
create (n:person {name:'如来'})
# 创建节点还可以使用关键字 MERGE,即以合并的方式来创建。在使用这种方式创建节点时,将会检查节点存在与否,如果节点已经存在,则使用已有的节点;如果节点不存在,则创建一个新节点。
MERGE(n:Test {name:"c"})ON CREATE SET n.created = timestamp()
创建关系
#使用新节点创建关系
CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r)
#使用已知节点创建带属性的关系
match (n:person {name:'沙僧'}),(m:person{name:'唐僧'}) create (n)-[r:`师傅`{relation:'师傅'}]->(m) return r
查询
# 依据标签查询节点
match(n:person) return n
# 依据标签属性进行查询
match(n:person {property:"value"}) return n
# 跳过前几个输出
match(n:person) return n skip 2
# 限制输出个数 
match(n:person) return n limit 2
# 显示查询节点的属性值
match(n:person) return id(n),n.name
# 使用 where 语句进行查询
match(n:person) where n.name='张三' and n.name='李四' return n
# 寻找某属性为空值的节点
match(n:person) where n.level is null return n
# 寻找属性值在某集合中的节点
match(n:person) where n.name in ['张三','李四'] return n
# 对查询结果进行排序
match(n:'person') return id(n),n.name order by id(n) desc
# 对于查询结果进行去重输出
match(n:'person') return distinct(n.name)
# 对查询结果进行统计
match(n:'person') return count(n)
# 对查询结果进行联合
match(n:'person') return n.name as name
union
match(m:'character') return m.name as name
# 检索有关系的相关节点
match (n:person)-[r]-(m:person) return n,r,m
# 使用WITH可以将上一条查询语句的结果链接起来,用于下一条查询语句之中,即起到一种管道的功能。下列查询语句使用WITH引用了MATCH子句的a和b。
MATCH(a)-[:KNOWS]->(b)
WITH a,count(b)AS knows
WHERE knows > 0
RETURN a
设置属性
# 按照条件搜索节点并为节点添加新的属性
MATCH (n:role {name:"fox"}) set n.age=32
# 也可以使用 unwind 语句配合 set 语句向节点中添加多个属性
UNWIND[{age:30},{addr:"sz"}] AS prop
MERGE(n:Test {name:"b"})
SET n += prop
删除操作
# 删除节点
match (n:person {name:'张三'}) delete n
# 删除关系
match (n:person {name:'张三'})<-[r]-(m) delete r
# 删除属性
match (n:person {name:'张三'}) remove n.age
使用索引
# 为某标签的的某属性创建索引
CREATE INDEX ON :Person(name)
# 删除索引
DROP INDEX ON :Person(name)
使用约束

在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。

# 创建约束
CREATE CONSTRAINT ON(p:Person)
ASSERT p.name IS UNIQUE
# 删除约束
DROP CONSTRAINT ON(p:Person)
ASSERT p.name IS UNIQUE
最短路径
# 找到其中一条最短路径
MATCH(p1:Person { name:"观众10" }),(p2:Person { name:"观众15" }),
p = shortestpath((p1)-[*..10]-(p2))
RETURN p
# 显示所有的最短路径
MATCH(p1:Person { name:"观众10" }),(p2:Person { name:"观众15" }),
p =allshortestpaths((p1)-[*..10]-(p2)
RETURN p
Logo

更多推荐