Neo4j介绍

1.Neo4j概述

Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库,它将结构化数据存储在图中而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。程序数据是在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中,但可以享受到具备完全的事务特性、企业级的数据库的所有好处。https://db-engines.com/en/ranking

2.图形数据库优势

优势总结:

  • 性能上,对长程关系的查询速度快
  • 擅于发现隐藏的关系,例如通过判断图上两点之间有没有走的通的路径,就可以发现事物间的关联

3.Neo4j 模块构建

Neo4j 主要构建块

  • 节点
  • 属性
  • 关系
  • 标签
  • 数据浏览器

节点

节点是图表的基本单位。 它包含具有键值对的属性

属性

属性是用于描述图节点和关系的键值对

Key =值

其中Key是一个字符串

值可以通过使用任何Neo4j数据类型来表示

关系

关系是图形数据库的另一个主要构建块。 它连接两个节点,如下所示。

这里Emp和Dept是两个不同的节点。 "WORKS_FOR"是Emp和Dept节点之间的关系。

因为它表示从Emp到Dept的箭头标记,那么这种关系描述的一样

Emp WORKS_FOR Dept

每个关系包含一个起始节点和一个结束节点。

这里"Emp"是一个起始节点。

"Dept"是端节点。

由于该关系箭头标记表示从"Emp"节点到"Dept"节点的关系,该关系被称为"进入关系"到"Dept"节点。并且"外向关系"到"Emp"节点。

像节点一样,关系也可以包含属性作为键值对。

标签

Label将一个公共名称与一组节点或关系相关联。 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签。 我们可以从现有节点或关系中删除现有标签。

从前面的图中,我们可以观察到有两个节点。

左侧节点都有一个标签:"EMP",而右侧节点都有一个标签:"Dept"。

这两个节点之间的关系,也有一个标签:"WORKS_FOR"
注: -Neo4j将数据存储在节点或关系的属性中。

4.Neo4j的主要应用场景

社交媒体和社交网络

当使用图形数据库为社交网络应用程序提供动力时,可以轻松利用社交关系或根据活动推断关系。

查询社区聚类分析,朋友的朋友推荐,影响者分析,共享和协作关系分析等

推荐引擎和产品推荐系统

图形驱动的推荐引擎通过实时利用多种连接,帮助公司个性化产品,内容和服务。

内容和媒体推荐,图形辅助搜索引擎,产品推荐,专业网络,社会推荐。

身份和访问管理

使用图形数据库进行身份和访问管理时,可以快速有效地跟踪用户,资产,关系和授权。

查询访问管理,资产来源,数据所有权,身份管理,互连组织,主数据,资源授权

金融反欺诈多维关联分析场景

通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。

5.Neo4j 环境搭建

Neo4j环境Linux下搭建

(1).切换到Linux下 到安装目录neo4j 上传安装包 或者 下载安装包

使用 ftp 工具上传neo4j-community-3.5.17.tar 到 liunx 下

或者

bash 复制代码
wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz

(2). 解压

bash 复制代码
tar -xvf neo4j-community-3.5.17.tar

(3). 修改配置文件 neo4j.conf

vi conf/neo4j.conf

主要是修改 允许远程访问的地址 把对应的注释打开即可

css 复制代码
dbms.connectors.default_listen_address=0.0.0.0 

(4).开放对应的访问端口 默认要开放7474 和 7687

bash 复制代码
firewall-cmd --zone=public --add-port=7474/tcp --permanent
firewall-cmd --zone=public --add-port=7687/tcp --permanent
systemctl reload firewalld

(5).启动

bash 复制代码
./bin/neo4j start

(6).使用浏览器 访问服务器上的 neo4j

http://localhost:7474

默认的账号是 neo4j 密码 neo4j 这里第一次登录的话会要求修改密码

Windows下的安装

(1).从https://neo4j.com/download-center/#community 下载最新的Neo4j Server安装文件

可以看到 neo4J 软件 exe 或 zip 格式的所有版本

(2).下载 neo4j-community-4.4.29 (zip)

(3).解压

(4).修改配置文件

dbms.connectors.default_listen_address=0.0.0.0

(5) . 通过 neo4j.bat install-service 安装neo4j服务

注意的问题 如果是4.0 以及以上版本需要jdk11

修改文件 bin/neo4j.ps1

Import-Module "neo4j的主目录\bin\Neo4j-Management.psd1"

(6).neo4j.bat启动

neo4j.bat console

(7).使用浏览器 访问服务器上的 neo4j

http://localhost:7474

默认的账号是 neo4j 密码 neo4j 这里第一次登录的话会要求修改密码

6.Neo4j数据浏览器

http:// localhost:7474/browser/

Neo4j数据浏览器用于执行CQL命令并查看输出输出。

这里我们需要在美元提示符处执行所有CQL命令:"$" 如

sql 复制代码
CREATE(cc:CreditCard)

在美元符号后键入命令,然后单击"执行"按钮运行命令。

它与Neo4j数据库服务器交互,检索和显示下面的结果到那个美元提示。

使用"VI视图"按钮以图形格式查看结果。 上图以"UI视图"格式显示结果。

导出 CSV 或者 JSON

单击"导出CSV"按钮以csv文件格式导出结果

7. Neo4j CQL简介

CQL代表Cypher查询语言。 像关系型数据库具有查询语言SQL,Neo4j使用CQL作为查询语言。

Neo4j CQL

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言。
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。

常用的Neo4j CQL命令/条款如下:

CREATE

sql 复制代码
CREATE (
	<node-name>:<label-name>
	[{
		<property1-name>:<property1-Value>
		........
		<propertyn-name>:<propertyn-Value>
	}]
)

语法说明:

举例:

sql 复制代码
CREATE (person:Person)
sql 复制代码
CREATE (person:Person {cid:1,name:"范闲",age:24,gender:0,character:"A",money:1000});
CREATE (person:Person {cid:2,name:"林婉儿",age:20,gender:1,character:"B",money:800});
CREATE (person:Person {cid:3,name:"庆帝",age:49,gender:0,character:"A",money:8900});

MATCH RETURN命令语法

sql 复制代码
MATCH
(
	<node-name>:<label-name>
)
RETURN
	<node-name>.<property1-name>,
	...
	<node-name>.<propertyn-name>

举例:

sql 复制代码
MATCH (person:Person) return person
MATCH (person:Person) return person.name,person.age

关系创建

  • 使用现有节点创建没有属性的关系

    sql 复制代码
    MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)
    CREATE
    (<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-
    name>)
    RETURN 相应的内容

    语法说明:

    sql 复制代码
    创建关系
    match(person:Person {name:"范闲"}) ,(person2:Person {name:"林婉儿"})
    create(person)-[r:Couple]->(person2);
    查询关系
    match p = (person:Person {name:"范闲"})-[r:Couple]->(person2:Person) return p
    match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return p1,p2
    match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return r
  • 使用现有节点创建有属性的关系

    sql 复制代码
    MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
    CREATE
    	(<node1-label-name>)-[<relationship-label-name>:<relationship-name>
    	{<define-properties-list>}]->(<node2-label-name>)
    RETURN <relationship-label-name>
    其中<define-properties-list> 是分配给新创建关系的属性(名称 - 值对)的列表。
    {
    	<property1-name>:<property1-value>,
    	<property2-name>:<property2-value>,
    	...
    	<propertyn-name>:<propertyn-value>
    }
    sql 复制代码
    match(person:Person {name:"范闲"}),(person2:Person {name:"林婉儿"})
    create(person)-[r:Couple{mary_date:"12/12/2014",price:55000}]->(person2)
    return r;
  • 使用新节点创建没有属性的关系

    sql 复制代码
    CREATE
    (<node1-label-name>:<node1-name>)
    -[<relationship-label-name>:<relationship-name>]->
    (<node1-label-name>:<node1-name>)
    sql 复制代码
    create(person1:Person {cid:4,name:"长公主",age:49,gender:1,character:"A",money:5000})
    -[r:Friend]->
    (person2:Person {cid:7,name:"九品射手燕小乙",age:48,gender:0,character:"B",money:1000})
  • 使用新节点创建有属性的关系

    sql 复制代码
    CREATE
    	(<node1-label-name>:<node1-name>{<define-properties-list>})
    	-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
    	->(<node1-label-name>:<node1-name>{<define-properties-list>})
    sql 复制代码
    子",age:23,gender:0,character:"A",money:3000})
    <-[r:Friend {date:"11-02-2000"}]->
    (person2:Person {cid:8,name:"二皇子",age:24,gender:0,character:"B",money:6000})

关系和节点的属性可以使用的类型

CREATE创建多个标签

sql 复制代码
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
如:
CREATE (person:Person:Beauty:Picture {cid:20,name:"小美女"})

WHERE 子句

sql 复制代码
简单的WHERE子句
	WHERE <condition>
复杂的WHERE子句
	WHERE <condition> <boolean-operator> <condition>

where 中的比较运算符 和 之前mysql的相同 如 = != <> > < 等

sql 复制代码
MATCH (person:Person)
WHERE person.name = '范闲' OR person.name = '靖王世子'
RETURN person

DELETE 子句 和 REMOVE子句

DELETE 子句

  • 删除节点。
  • 删除节点及相关节点和关系。
sql 复制代码
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person) delete r

REMOVE子句

  • 删除节点或关系的标签
  • 删除节点或关系的属性
sql 复制代码
MATCH (person:Person {name:"小美女"})
REMOVE person.cid

SET子句

  • 向现有节点或关系添加新属性
  • 更新属性值
sql 复制代码
MATCH (person:Person {cid:1})
SET person.money = 3456,person.age=25

ORDER BY 子句

"ORDER BY"子句,对MATCH查询返回的结果进行排序。

我们可以按升序或降序对行进行排序。

默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。

sql 复制代码
MATCH (person:Person)
RETURN person.name,person.money
ORDER BY person.money DESC

SKIP 和 LIMIT

Neo4j CQL已提供"SKIP"子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。

Neo4j CQL已提供"LIMIT"子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。

sql 复制代码
MATCH (person:Person)
RETURN ID(person),person.name,person.money
ORDER BY person.money DESC skip 4 limit 2

DISTINCT 排重

这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。

sql 复制代码
MATCH (p:Person) RETURN Distinct(p.character)

8. CQL 函数

字符串函数

sql 复制代码
MATCH (p:Person)
RETURN ID(p),LOWER(p.character)
sql 复制代码
match(p:Person) return
p.character,lower(p.character),p.name,substring(p.name,2),replace(p.name,"子","zi")

聚合函数

sql 复制代码
MATCH (p:Person)
RETURN MAX(p.money),SUM(p.money)

关系函数

sql 复制代码
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person)
RETURN STARTNODE(r)

shortestPath 函数返回最短的path

sql 复制代码
MATCH p=shortestPath( (node1)-[*]-(node2) )
RETURN length(p), nodes(p)
sql 复制代码
MATCH p=shortestPath((person:Person {name:"王启年"})-[*]-(person2:Person
{name:"九品射手燕小乙"}) ) RETURN length(p), nodes(p)

CQL多深度关系节点

  1. 使用with关键字

    sql 复制代码
    查询三层级关系节点如下:with可以将前面查询结果作为后面查询条件
    match (na:Person)-[re]->(nb:Person) where na.name="范闲" WITH na,re,nb match (nb:Person)-
    [re2]->(nc:Person) return na,re,nb,re2,nc
    match (na:Person)-[re]->(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-
    [re2]->(nc:Person) return na,re,nb,re2,nc
    match (na:Person)-[re]-(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-
    [re2]->(nc:Person) return na,re,nb,re2,nc
    match (na:Person)-[re]-(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-
    [re2:Friends]->(nc:Person) return na,re,nb,re2,nc
  2. 直接拼接关系节点查询

    sql 复制代码
    match (na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
    为了方便,可以将查询结果赋给变量,然后返回
    match data=(na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return data
  3. 使用深度运算符

    当实现多深度关系节点查询时,显然使用以上方式比较繁琐。

    可变数量的关系->节点可以使用-[:TYPE*minHops...maxHops]-。

    查询:

    sql 复制代码
    match data=(na:Person{name:"范闲"})-[*1..2]-(nb:Person) return data

9.事务

为了保持数据的完整性和保证良好的事务行为,Neo4j也支持ACID特性 。

注意:

(1)所有对Neo4j数据库的数据修改操作都必须封装在事务里。

(2)默认的isolation level是READ_COMMITTED。

(3)死锁保护已经内置到核心事务管理 。 (Neo4j会在死锁发生之前检测死锁并抛出异常。在异常抛出之前,事务会被标志为回滚。当事务结束时,事务会释放它所持有的锁,则该事务的锁所引起的死锁也就是解除,其他事务就可以继续执行。当用户需要时,抛出异常的事务可以尝试重新执行)

(4)除特别说明,Neo4j的API的操作都是线程安全的,Neo4j数据库的操作也就没有必要使用外部的同步方法。

10.索引

简介

Neo4j CQL支持节点或关系属性上的索引,以提高应用程序的性能。

可以为具有相同标签名称的属性上创建索引。

可以在MATCH或WHERE等运算符上使用这些索引列来改进CQL 的执行。

创建单一索引

sql 复制代码
CREATE INDEX ON :Label(property)

例如:

sql 复制代码
CREATE INDEX ON :Person(name)

创建复合索引

sql 复制代码
CREATE INDEX ON :Person(age, gender)

全文模式索引

之前的常规模式索引只能对字符串进行精确匹配或者前后缀索引(startswith,endswith,contains),全文索引将标记化索引字符串值,因此它可以匹配字符串中任何位置的术语。索引字符串如何被标记化并分解为术语,取决于配置全文模式索引的分析器。索引是通过属性来创建,便于快速查找节点或者关系。

创建和配置全文模式索引

使用db.index.fulltext.createNodeIndex和db.index.fulltext.createRelationshipIndex创建全文模式索引。在创建索引时,每个索引必须为每个索引指定一个唯一的名称,用于在查询或删除索引时引用相关的特定索引。然后,全文模式索引分别应用于标签列表或关系类型列表,分别用于节点和关系索引,然后应用于属性名称列表。

sql 复制代码
call db.index.fulltext.createNodeIndex("索引名",[Label,Label],[属性,属性])
call db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name","description"])
call db.index.fulltext.queryNodes("nameAndDescription", "范闲") YIELD node, score
RETURN node.name, node.description, score

查看和删除索引

sql 复制代码
call db.indexes 或者 :schema
DROP INDEX ON :Person(name)
DROP INDEX ON :Person(age, gender)
call db.index.fulltext.drop("nameAndDescription")

11.约束

唯一性约束

作用

  • 避免重复记录。
  • 强制执行数据完整性规则

删除唯一性约束

sql 复制代码
CREATE CONSTRAINT ON (变量:<label_name>) ASSERT 变量.<property_name> IS UNIQUE

具体实例:

sql 复制代码
CREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUE

删除唯一性约束

sql 复制代码
DROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUE

属性存在约束 (企业版中可用)

sql 复制代码
CREATE CONSTRAINT ON (p:Person) ASSERT exists(p.name)

查看约束

sql 复制代码
call db.constraints
:schema

12. Neo4j - 数据库备份和恢复

在对Neo4j数据进行备份、还原、迁移的操作时,首先要关闭neo4j

sql 复制代码
./bin/neo4j stop

数据备份到文件

sql 复制代码
./bin/neo4j-admin dump --database=graph.db --to=/root/qyn.dump

还原、迁移之前 ,关闭neo4j服务。操作同上

sql 复制代码
./bin/neo4j-admin load --from=/root/qyn.dump --database=graph.db --force

重启服务

sql 复制代码
./bin/neo4j start

注意,运行数据备份可能会警告

WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j

manual

1.编辑这个文件

vi /etc/security/limits.conf

在文件最后加入下面这段 修改最大打开文件限制

sql 复制代码
* soft nofile 65535
* hard nofile 65535

2.重启服务器

再次执行上面的步骤 警告就没有了

13.调优思路

1.增加服务器内存 和 调整neo4j配置文件

sql 复制代码
# java heap 初始值
dbms.memory.heap.initial_size=1g
# java heap 最大值,一般不要超过可用物理内存的80%
dbms.memory.heap.max_size=16g
# pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2,
dbms.memory.pagecache.size=2g

2.neo4j刚启动数据是冷的需要预热

sql 复制代码
MATCH (n)
OPTIONAL MATCH (n)-[r]->()
RETURN count(n.name) + count(r);

3.查看执行计划进行索引优化

Cypher查询计划程序将每个查询转换为执行计划。 执行计划告诉Neo4j在执行查询时要执行哪些操作。

对执行计划的生成,Neo4j使用的都是基于成本的优化器(Cost Based Optimizer,CBO),用于制订精确的执行过程。可以采用如下两种不同的方式了解其内部的工作机制:

EXPLAIN :是解释机制,加入该关键字的Cypher语句可以预览执行的过程但并不实际执行,所以也不

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

的执行结果。

sql 复制代码
关注指标:
	estimated rows: 需要被扫描行数的预估值
	dbhits: 实际运行结果的命中绩效
	两个值都是越小越好

使用索引和不使用索引对比

MATCH (p { name : '范闲' }) RETURN p

在之前加上profile来进行查询,可以查看查询计划

相关推荐
盒马盒马2 分钟前
Redis:zset类型
数据库·redis
静听山水16 分钟前
mysql语句执行过程
数据库·mysql
虽千万人 吾往矣34 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
mariokkm1 小时前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite
Wang's Blog2 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO2 小时前
MySQL事务
数据库·mysql
cyt涛4 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油4 小时前
01_SQLite
数据库·sqlite
liuxin334455665 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
少女的迷鹿5 小时前
Paper:NSG(Navigating Spreading-out Graph)
数据库