知识存储:neo4j图数据库
基本概念
节点,关系,属性(对节点的补充),标签(实体类型)
节点:
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一 样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
-
节点是主要的数据元素
-
节点通过关系连接到其他节点
-
节点可以具有一个或多个属性(即,存储为键/值对的属性)
-
节点有一个或多个标签,用于描述其在图表中的作用
属性
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何 Neo4j数据类型来表示
-
属性是命名值,其中名称(或键)是字符串
-
属性可以被索引和约束
-
可以从多个属性创建复合索引
关系
关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来 构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不 能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
-
关系连接两个节点
-
关系是方向性的
-
节点可以有多个甚至递归的关系
-
关系可以有一个或多个属性(即存储为键/值对的属性)
-
内置函数type(r),用于读取关系r的值

基于方向性,Neo4j关系被分为两种主要类型:
-
单向关系
-
双向关系
标签
标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们 可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。
-
标签用于将节点分组
-
一个节点可以具有多个标签
-
对标签进行索引以加速在图中查找节点
-
标签索引针对速度进行了优化
下载和环境安装

Cypher查询语言(类似sql,CQL)
https://we-yun.com/doc/neo4j-chs-doc/#_%E6%99%BA%E8%83%BD%E6%9F%A5%E8%AF%A2_2 命令:https://neo4j.com/docs/cypher-manual/3.5/clauses/match/
LOAD CSV
#将csv文件拷贝到 %NEO4J_HOME%\import目录
load csv from 'file:///西游记,csv' as line
create (:西游{name:line[0],tail:line[1],label:line[3]})
CREATE
创建节点
#创建简单节点
create (n)
#创建多个节点
create (n),(m)
#创建带标签和属性的节点并返回节点
create (n:person {name:'如来'}) return n
创建关系
#创建了两个新节点 杨戬和玉鼎真人,并指定关系是 师傅,注意这里的关系是单向关系,并返回关系类型“师傅”
CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r)
CREATE (n:person {name:'杨戬'})<-[r:徒弟]-(m:person {name:'玉鼎真人'}) return type(r)
#双向
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
#检索关系节点的详细信息
#检索所有person节点间的任意无向关系,返回成对节点
match (n:person)-[r]-(m:person) return n,m
创建全路径
# 创建三个实体person,定义好关系,同时将这一整套 “节点 + 关系” 的完整关联结构封装为路径变量p,
最终返回这个完整路径。“蛟魔王” 和 “鹏魔王”,均以 “牛魔王” 为义兄
create p=
(:person{name:'蛟魔王'})-[:义兄]->
(:person{name:'牛魔王'})
<-[:义兄]-(:person {name:'鹏魔王'})
return p
MATCH
#匹配所有人物节点,无属性限制
MATCH (n:person) RETURN n LIMIT 10
#匹配所有标签为西游的节点,返回其中最多 25 个节点
MATCH (n:`西游`) RETURN n LIMIT 25
#精准匹配name为 “牛魔王” 的、标签为person节点
MATCH (n:person {name:'牛魔王'}) RETURN n
#返回标签person的节点中,名字属性中含有“魔”字的节点
MATCH (n:person) WHERE n.name CONTAINS '魔' RETURN n
#匹配人与人之间的所有关系,返回成对节点
MATCH (n:person)-[r]-(m:person) RETURN n, m LIMIT 20
#匹配“义兄”类型的有向关系,返回节点和关系详情
MATCH (n:person)-[r:义兄]->(m:person) RETURN n, r, m
# 匹配连续的两层义兄关系,构建完整路径
MATCH (n:person {name:'蛟魔王'})-[r1:义兄]->(m:person)-[r2:义兄]->(p:person)
RETURN n, m, p, r1, r2
# 匹配1到3层的任意有向关系,*1..3表示路径长度为1、2、3
MATCH (n:person)-[r*1..3]->(m:person) RETURN n, m LIMIT 30
# *表示任意长度(0到无限大),这里*1..表示1到无限大(排除自身)
MATCH (n:person {name:'牛魔王'})-[r:义兄*1..]-(m:person) RETURN n, m
# 使用orderby
MATCH (n:person)
RETURN n
ORDER BY n.name ASC // ASC升序(默认),DESC降序
LIMIT 15
# WITH将中间结果(n和关系数count(r))传递给后续WHERE子句
MATCH (n:person)-[r]-(m:person)
WITH n, COUNT(r) AS relationCount
WHERE relationCount ≥ 1
RETURN n, relationCount
SET
向现有节点或关系添加新属性
添加或更新属性值
MATCH (n:role {name:"fox"}) set n.age=32 return n
DELETE
# 删除节点 (前提:节点不存在关系)
MATCH (n:person{name:"白龙马"}) delete n
# 删除关系
MATCH (n:person{name:"沙僧"})<-[r]-(m) delete r return type(r)
REMOVE
有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE子句 来删除节点或关系的现有属性。
- 删除节点或关系的标签
- 删除节点或关系的属性
#删除属性
MATCH (n:role {name:"fox"}) remove n.age return n
#创建节点
CREATE (m:role:person {name:"fox666"}) #m:role:person 可以给“fox666”既创建role节点又创建person节点
#删除标签
match (m:role:person {name:"fox666"}) remove m:person return m