Neo4j 的构建元素
Neo4j图数据库主要有以下构建元素:
-
节点
-
属性
-
关系
-
标签
-
数据浏览器
节点
- 节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。
在Neo4j中节点可以包含多个属性(Property)和多个标签- (Label)。
-
节点是主要的数据元素
-
节点通过关系连接到其他节点
-
节点可以具有一个或多个属性(即,存储为键/值对的属性)
-
节点有一个或多个标签,用于描述其在图表中的作用
属性
-
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何 Neo4j数据类型来表示
-
属性是命名值,其中名称(或键)是字符串
-
属性可以被索引和约束
-
可以从多个属性创建复合索引
关系
关系(Relationship)同样是图数据库的基本元素。
当数据库中已经存在节点后,需要将节点连接起来 构成图。
关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不 能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
-
关系连接两个节点
-
关系是方向性的
-
节点可以有多个甚至递归的关系
-
关系可以有一个或多个属性(即存储为键/值对的属性)
基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系
标签
标签(Label)将一个公共名称与一组节点或关系相关联,节点或关系可以包含一个或多个标签。
我们可以为现有节点或关系创建新标签,我们可以从现有节点或关系中删除标签。
标签用于将节点分组
-
一个节点可以具有多个标签
-
对标签进行索引以加速在图中查找节点
-
本机标签索引针对速度进行了优化
Neo4j - CQL使用
Neo4j - CQL简介
Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。
像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言。
-
它是Neo4j图形数据库的查询语言。
-
它是一种声明性模式匹配语言 它遵循SQL语法。
-
它的语法是非常简单且人性化、可读的格式。
常用命令
官方英文文档:https://neo4j.com/docs/cypher-manual/3.5/clauses/
中文命令文档:https://www.w3cschool.cn/neo4j/neo4j_cql_match_command.html
常用的入门信息
CQL
Neo4j CQL 命令/条款如下:
CQL命令/条 | 用法 |
---|---|
CREATE 创建 | 创建节点,关系和属性 |
MATCH 匹配 | 检索有关节点,关系和属性数据 |
RETURN 返回 | 返回查询结果 |
WHERE 条件 | 提供条件过滤检索数据 |
DELETE 删除 | 删除节点和关系 |
REMOVE 移除 | 删除节点和关系的属性 |
ORDER BY 以…排序 | 排序检索数据 |
SET 设置 | 添加或更新标签 |
CQL 函数
定制列表功能 | 用法 |
---|---|
String 字符串 | 它们用于使用String字面量。 |
Aggregation 聚合 | 它们用于对CQL查询结果执行一些聚合操作。 |
Relationship 关系 | 他们用于获取关系的细节,如startnode,endnode等。。 |
Neo4j CQL数据类型
这些数据类型与Java语言类似。
它们用于定义节点或关系的属性
Neo4j CQL支持以下数据类型:
S.No. | CQL数据类型 | 用法 |
---|---|---|
1. | boolean | 用于表示布尔文字:true,false。 |
2. | byte | 用于表示8位整数。 |
3. | short | 用于表示16位整数。 |
4. | int | 用于表示32位整数。 |
5. | long | 用于表示64位整数。 |
6. | float | I用于表示32位浮点数。 |
7. | double | 用于表示64位浮点数。 |
8. | char | 用于表示16位字符。 |
9. | String | 用于表示字符串。 |
入门例子
CREATE创建
create语句是创建模型语句用来创建数据模型
创建节点
#创建带标签和属性的节点并返回节点
create (n:person {name:'如来'}) return n
创建关系
#使用新节点创建关系
CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r);
#使用已知节点创建带属性的关系
create (n:person {name:'沙僧'}) return n;
create (n:person {name:'唐僧'}) return n;
match (n:person {name:'沙僧'}),(m:person{name:'唐僧'})
create (n)-[r:`师傅`{relation:'师傅'}]->(m)
return r
#检索关系节点的详细信息
match (n:person)-[r]-(m:person) return n,m
创建全路径
create p=(:person{name:'蛟魔王'})-[:义兄]->(:person{name:'牛魔王'})<-[:义兄]- (:person {name:'鹏魔王'}) return p
match 查询
Neo4j CQL MATCH命令用于
从数据库获取有关节点和属性的数据
从数据库获取有关节点,关系和属性的数据
MATCH (n:person) RETURN n LIMIT 25
RETURN返回
Neo4j CQL RETURN子句用于
检索节点的某些属性 检索节点的所有属性 检索节点和关联关系的某些属性 检索节点和关联关系的所有属性
MATCH (n:person) RETURN id(n),n.name,n.tail,n.relation
WHERE子句
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
MATCH (n:person) where n.name='牛魔王' or n.name='唐僧' RETURN n
#创建关系
match (n:person),(m:person)
where n.name='唐僧' and m.name='如来'
create (n)-[r:BOSS]->(m)
return n.name,type(r),m.name
DELETE删除
Neo4j使用CQL DELETE子句
删除节点。 删除节点及相关节点和关系。
# 删除节点 (前提:节点不存在关系)
MATCH (n:person{name:"如来"}) delete n
# 删除关系
MATCH (n:person{name:"如来"})<-[r]- (m) delete r return type(r)
MATCH (n:person{name:"如来"})-[r]->(m) delete r return type(r)
MATCH (n:person{name:"如来"}) delete n
# 删除整个标签内容
match (n:person) detach delete n
REMOVE删除
有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。
我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
删除节点或关系的标签 删除节点或关系的属性
#创建多个节点
create (a:person {name:"test111",age:20,sex:"男"}),
(b:person {name:"test222",age:30,sex:"女"}),
(c:person {name:"test333",age:40,sex:"男"})
return a,b,c
#删除属性
MATCH (n:person {name:"test111"}) remove n.age return n
#删除标签
match (m:person {name:"test222"}) remove m:person return m
SET子句
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。
要做到这一点,Neo4j CQL提 供了一个SET子句。
向现有节点或关系添加新属性 添加或更新属性值
MATCH (n:person {name:"test111"}) set n.age=32 return n
ORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。
我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。
如果我们要按降序对它们 进行排序,我们需要使用DESC子句。
#升序
MATCH (n:person) RETURN id(n),n.name order by id(n) asc
#降序
MATCH (n:person) RETURN id(n),n.name order by id(n) desc
UNION子句
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
UNION:它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。 限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION ALL:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。 限制:结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该 是相同的。
MATCH (n:person) RETURN n.name as name
UNION
MATCH (m:person) RETURN m.name as name
MATCH (n:person) RETURN n.name as name
UNION all
MATCH (m:person) RETURN m.name as name
LIMIT和SKIP子句
Neo4j CQL已提供LIMIT子句和 SKIP 来过滤或限制查询返回的行数。
LIMIT返回前几行,SKIP忽略前几行。
# 前两行
MATCH (n:person) RETURN n.name limit 2
# 忽略前两行
MATCH (n:person) RETURN n.name SKIP 2
NULL值
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。
当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
match (n: person) where n.label is null return id(n),n.name,n.tail,n.label
IN操作符
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
match (n: person) where n.name in['沙僧','唐僧'] return id(n),n.name,n.tail,n.label
INDEX索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
Neo4J索引操作
Create Index 创建索引 Drop Index 丢弃索引
# 创建索引
create index on :person (name)
# 删除索引
drop index on : person (name)
UNIQUE约束
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会 插入一个新行。
根据我们对某些节点或关系的应用需求,我们必须避免这种重复。
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIQUE约束的优点
避免重复记录。 强制执行数据完整性规则
#创建唯一约束
create constraint on (n:person) assert n.name is unique
#删除唯一约束
drop constraint on (n:person) assert n.name is unique
DISTINCT
这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。
match (n:person) return distinct(n.name)
常用函数
字符串函数
与SQL一样,Neo4J CQL提供了一组String函数,用于在CQL查询中获取所需的结果。
功能 描述 | |
---|---|
UPPER | 它用于将所有字母更改为大写字母 |
LOWER | 它用于将所有字母改为小写字母 |
SUBSTRING | 它用于获取给定String的子字符串 |
REPLACE | 它用于替换一个字符串的子字符串 |
MATCH (e) RETURN id(e),e.name,substring(e.name,0,2)
AGGREGATION聚合
和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY 子句。
我们可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。
聚集功能 | 描述 |
---|---|
COUNT | 它返回由MATCH命令返回的行数 |
MAX | 它从MATCH命令返回的一组行返回最大值 |
MIN | 它返回由MATCH命令返回的一组行的最小值 |
SUM | 它返回由MATCH命令返回的所有行的求和值 |
AVG | 它返回由MATCH命令返回的所有行的平均值 |
MATCH (e) RETURN count(e)
关系函数
Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。
功能 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点 |
ENDNODE | 它用于知道关系的结束节点 |
ID | 它用于知道关系的ID |
TYPE | 它用于知道字符串表示中的一个关系的TYPE |
match (a)-[r] ->(b) return id(r),type(r)
neo4j-admin使用
数据库备份
对Neo4j数据进行备份、还原、迁移的操作时,要关闭neo4j
cd %NEO4J_HOME%/bin
#关闭
neo4j neo4j stop
#备份
neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump
数据库恢复
还原、迁移之前 ,要关闭neo4j服务。
#数据导入
neo4j-admin load --from=/neo4j/backup/graph_backup.dump --database=graph.db – force
#重启服务
neo4j start
利用CQL构建西游关系图谱
远程文件地址:(文件放任意位置,配置Nginx之后能访问到就行)
#导入西游人物数据
load csv from 'http://124.223.79.77/neo4j/import/西游人物.csv' as line create (:西游人物 {name:line[0]})
#导入西游关系数据
load csv from 'http://124.223.79.77/neo4j/import/西游关系.csv' as line
create (:西游关系 {from:line[0],to:line[1],relation:line[3]})
#将两者之间的数据进行关联
match (a:`西游人物`),(b:`西游关系`),(c:`西游人物`)
where a.name=b.from and c.name=b.to
create (a)-[:人物关系{relation:b.relation}]->(c)
return a
#清空人物关系数据
match (a:`西游人物`)-[r]->(b) delete r return type(r)
本地文件地址:(文件放Neo4j的import目录下)
#导入西游人物数据
load csv from ''file:///西游人物.csv' as line create (:西游人物 {name:line[0]})
#导入西游关系数据
load csv from ''file:///西游关系.csv' as line
create (:西游关系 {from:line[0],to:line[1],relation:line[3]})
#将两者之间的数据进行关联
match (a:`西游人物`),(b:`西游关系`),(c:`西游人物`)
where a.name=b.from and c.name=b.to
create (a)-[:人物关系{relation:b.relation}]->(c)
return a
#清空人物关系数据
match (a:`西游人物`)-[r]->(b) delete r return type(r)
部分进阶语法
https://www.jianshu.com/p/5022b413ec3a
https://blog.csdn.net/liucy007/article/details/120967186
#shortestPath函数返回最短的Path
match p=shortestPath(
(a:`西游人物` {name:"秦琼"})-[*]-(b:`西游人物` {name:"孙悟空"})
)
return length(p),nodes(p)
#查看节点层级数据
match (a:`西游人物`{name:"唐僧"})<-[r:`人物关系`*1..4]-(b) return a,b,r
match (a:`西游人物`{name:"唐僧"})-[r:`人物关系`*1..4]->(b) return a,b,r
参考资料
https://www.cnblogs.com/liaozk/p/17138133.html
https://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html