Neo4j 学习笔记
一 . Neo4j概述
1.1Neo4j
Neo4j是由Neo技术使用java语言完全开发的,世界领先的图形数据库。其具有:
1 . 有像SQL一样简单的查询语言Neo4j CQL
2 . 它遵循属性图数据模型
3 . 它通过使用Apache lucence支持索引
4 . 它支持UNIQUE约束
5 . 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
6 . 它支持完成的ACID原则(原子性,一致性,隔离性,持久性)规则
7 . 它采用原生图形库与本地GPE(图形处理引擎)
8 . 它支持查询的数据导出到JSON和XLS格式
9 . 它提供REST API,可以被任何编程语言(如 Java,spring,Scala等)访问
10 . 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
11 . 它支持两种Java API:Cypher AP和Native Java API来开发Java应用程序
等特点。
图数据库主要用于存储更多的连接数据,连接数据及数据节点之间存在关系。
Neo4j是一种非关系型数据库,相信大家在接触Neo4j之前接触或了解过MySQL或SqlServer等关系型数据库,与关系型数据库中采用关系模型(二维表结构,一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织)来组织存储数据的形式不同的是,非关系型数据库以键值对存储,结构不固定,每个元组可以有不一样的字段,并且每个元组都可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
在非关系型的数据库中,用户可以根据自己的需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中没要对多个表进行关联查询。仅需要根据ID取出相应的value值即可,即非关系型数据库多使用key-value形式进行数据的存储,在某些特定的情况下读取效率极高。
同样非关系型数据库的特点也注定其适用面较为狭窄,多用于SNS(social networking service)即社交网络服务中,例如Facebook,微博等。系统的升级,功能的增加,往往意味着数据结构的巨大变动,这一点关系型数据库以为采用了关系型组织方式,难以做出较大的变动。而非关系型数据库的key-value特点恰好可以满足该要求。
由于不可能用一种数据结构化存储应对所有的新的需求,因此,非关系型数据库严格意义上不是一种数据库,而应该是一种数据结构化存储方法的集合。
1.2Neo4j的优点
1 . 作为一种图形数据库,Neo4j很容易表示连接的数据
2 . 由于图形数据库的key-value 特点,Neo4j检索/遍历/导航更多的连接数据库是非常容易和快速的
3 . 它非常容易的表示半结构化数据(半结构化数据具有一定的结构性,是一种适于数据库集成的数据模型。)
4 . Neo4j CQL查询语言命令是人性化的刻度格式,非常容易学习。
5 . 使用简单而强大的数据模型
6 . 它不需要复杂的连接来计算所连接的/相关的数据,因为它很容易检索它的相邻节点或者关系细节没有连接或者索引
1.3Neo4j的缺点及其限制
1 . Neo4j不支持sharding
1.4Neo4j的安装以及环境配置
请参考博客Neo4j新手入门指南
二 . Neo4j属性图数据模型
Neo4j图数据库遵循属性图模型来存储和管理其数据
属性图模型规则:
1 . 表示节点,关系和属性中的数据
2 . 节点和关系都包含属性
3 . 关系连接节点
4 . 属性是键值对
5 . 节点用圆圈表示,关系用方向键表示
6 . 关系具有方向,单向或者双向
7 . 每个关系都包含“开始节点”或“从节点”和“到节点”或“结束节点”,即关系 必须有头有尾。
图形数据库数据模型的主要构件块是:
1 . 节点
节点是图标的基本单位类似于关系型数据库中的一条记录。它包含多个具有键值对的属性和标签 b。
2 . 关系
关系图形数据库的另一个主要的构件模块,它连接两个节点,表示两个节点之间的关系。
图中Emp是起始节点,Dept是结束节点。表示从Empty到Dept节点的关系,Works-For。在上文中层提到,关系和节点相同,具有属性:
3 . 属性
属性是用于描述图节点和关系的键值对
属性是key-value结构,key可以是一个字符串,值可以通过使用任何Neo4j数据类型来表示
4 . 标签
Label将一个公共名称与一组节点或关系相关联。节点或关系可以包含一个或多个标签。我们可以为现有节点或者关系创建标签,我们可以从现有节点或者关系中删除现有标签。
从前的图中,我们可以观察到有两个接单。左侧节点都有一标签“EMP”,而右侧标签都有一个标签“Dept” ,这两个标签之间也有一个标签“WORKS_FOR”
即标签
注:Neo4j将数据存储在节点或关系的属性中
5 . 数据浏览器
在我们安装Neo4j之后,我们可以访问Neo4j数据浏览器,与MySQL我们在命令行执行SQL语句不同的是,Neo4j可以在浏览器中图形化的执行CQL语句,使用URL:http:// localhost:7474 / browser /
Neo4j数据浏览器用于执行CQL命令并查看输出。
这里我们需要在提示符处执行所有的CQL命令:
在“$”后键入命令,然后单击“执行”按钮运行命令。
使用“VI视图”按钮以图形格式查看结果。同样我们也可以使用“网格视图”格式来显示相同的的结果。
在数据浏览器中,我们可以使用“导出CSV”按钮,“JSON”按钮将结果以CSV文件形式和JSON文件形式导出
属性图:
单个节点:
节点具有属性:
节点中的属性为key-value模式。
节点与节点之间的关系模型:
同样,节点与节点之间的关系也具有属性。
复杂关系,具有单向和双向的节点关系:
三 . CQL
3.1 CQL概述
与Oracle的SQL数据库查询语言类似,CQL代表cypher查询语言,Neo4的查询语言也是CQL。
Neo4j CQL的特性:
1 . 它是Neo4j图形数据库的查询语言
2 . 它是一种声明性模式匹配语言
3 . 它遵循SQL语法
4 . 它的语法是非常简单人性化,且可读性非常高
类比于Oracle SQL
1 . Neo4j CQL已命令来执行数据库操作
2 . Neo4j CQL支持多个子句,即支持嵌套查询。
3 . Neo4j CQL支持一些功能,如字符串
3.2 CQL命令:
命令 | 说明 | 用法 |
---|---|---|
CREATE | 创建 | 创建节点,关系和属性 |
MATCH | 匹配 | 检索有关节点,关系和属性数据 |
RETURN | 返回 | 返回查询结果 |
WHERE | 哪里 | 提供条件过滤检索数据 |
DELETE | 删除 | 删除节点和关系 |
REMOVE | 移除 | 删除节点和关系的属性 |
ORDER BY | 以…排序 | 排序检索数据 |
SET | 组 | 添加或更新标签 |
3.2.1 CREATE命令
Neo4j使用CQL中的CREATE命令:
1 . 创建没有属性的节点
CREATE(<node-name>:<label-name>)
使用CREATE命令创建一个没有属性的节点,node-name为节点名称,label-name为节点标签名称。
注意事项 -
1、Neo4j数据库服务器使用此将此节点详细信息存储在Database.As中作为Neo4j DBA或Developer,我们不能使用它来访问节点详细信息。
2、Neo4j数据库服务器创建一个作为内部节点名称的别名。作为Neo4j DBA或Developer,我们应该使用此标签名称来访问节点详细信息。
2 . 使用属性创建节点
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
使用CQL创建了一个有property-name属性的节点。
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })
创建了一个节点名叫dept,标签是Dept的具有deptno,dname,location三个属性的节点。
3 . 在没有属性的节点之间创建关系
4 . 使用属性创建节点之间的关系
5 . 为节点或关系创建单个或多个标签
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
案例:
CREATE (m:Movie:Cinema:Film:Picture)
创建一个具有Movie,Cinema,Film,Picture四个标签的节点名叫m的节点。
3.2.2 MATCH命令
(不能单独使用)
1 . 从数据库获取有关节点和属性的数据
用法:
MATCH
(
<node-name>:<label-name>
)
使用案例:
MATCH (dept:Dept)
与SQL中的select语法相似,MATCH命令是用于查找图形数据库中符合条件的节点,案例即为在图形数据库中查询节点名为dept,标签为Dept的节点。
2 . 从数据库获取有关节点, 关系和属性的数据
MATCH <node1-name>-<relationship-name>-<node2-name>RETURN r
使用案例:
MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r
3.2.3 RETURN命令
(不能单独使用)
1.检索节点的某些属性
2.检索节点的所有属性
3.检索节点和关联关系的某些属性
4.检索节点和关联关系的所有属性
语法格式:
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
使用案例:
RETURN dept.deptno
此语句是在数据库中检索节点名称为dept属性为deptno的节点。
3.2.4 MATCH+RETURN命令
MATCH和RETURN命令都不可以单独使用,所以常见用法是将MATCH和RETRUN命令合起来使用。
1.检索节点的某些属性
2.检索节点的所有属性
3.检索节点和关联关系的某些属性
4.检索节点和关联关系的所有属性
语法格式:
MATCH Command
RETURN Command
使用示例:
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname
MATCH命令在图形数据库中匹配名称为dept,标签为Dept的节点,RETURN命令返回该节点的deptno和dname属性。
MATCH (dept: Dept)
RETURN dept
MATCH命令在图形数据库中匹配名称为dept,标签为Dept的节点,RETURN命令返回该节点。
查询节点之间的关系:
语法格式:
MATCH (node-name1:label-name {property-name-list})-[:relationship-name]->(node-name2:label-name{property-name-list})
RETURN node-name1,node-name2
使用示例:
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies)
RETURN tom,tomHanksMovies
使用MATCH命令匹配到具有ACTED_IN关系的两节点并返回两节点和他们之间的关系。
3.2.5 WHERE命令
与SQL中的WHERE语句一样,Neo4j中的WHERE语句也是用于过滤结果集,在Neo4j中,WHERE命令一般与MATCH命令,RETUEN命令搭配使用,
WHERE <condition> <boolean-operator> <condition>
<condition>语法格式
<property-name> <comparison-operator> <value>
<property-name>节点或关系的属性名,<comparison-operator>比较运算符之一
案例:
MATCH (emp:Employee)
WHERE emp.name = 'Abc'
RETURN emp
在MATCH命令筛选出的结果集中选择节点的name属性为Abc的节点,并且用RETURN语句返回.
同时WHERE命令也支持多个条件与布尔运算符连用,更精确的筛选结果集:
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
在MATCH命令筛选出的结果集中选择节点的name属性为Abc或者Xyz的节点,并且用RETURN语句返回.。
Neo4j中的布尔运算符和比较运算符:
布尔运算符:
布尔运算符 | 描述 |
---|---|
AND | 与,表满足两方才为真 |
OR | 或,满足任意一方即为真 |
NOT | 非,否定 |
XOR | 异或,两方布尔值不同 |
比较运算符:
布尔运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
WHERE的其他使用方式:
使用WHERE字句创建两个现有节点之间的关系:
MATCH (cust:Customer),(cc:CreditCard)
WHERE cust.id = "1001" AND cc.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r
MATCH和WHERE语句查找到节点名为cust,标签为Customer且id为1001的节点和节点名为cc,标签为Creditcard,id为5001的两个节点,用CREATE语句创建cust和cc建立一个名为r的关系,标签为DO_SHOPPING_WITH,拥有shopdate和price两个属性。
3.2.6 DELETE命令
Neo4j使用DELETE命令来删除节点,或删除节点以及相关节点和关系(永久性操作)。
DELETE <node-name-list>
node-name-list:一个要从数据库删除的节点名称列表。
DELETE一般与MATCH连用
删除节点使用案例|:
MATCH (e: Employee) DELETE e
删除名称为e节点
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
使用MATCH命令匹配到两个现有节点和他们之间的关系,用DELETE命令删除两个节点和他们之间的关系。
在特殊情况下,我们可能会建立只有标签名但是无节点名的节点,在这种情况下我们不能根据节点名名称删除当前节点了,我们使用下面方法删除节点。
MATCH (n:Bank) DELETE n
该命令会匹配到所有标签为Bank的节点,并删除所有节点。
3.2.7 REMOVE和SET命令
Neo4j使用DELETE删除节点或者节点之间的关系,而使用REMOVE命令删除节点或关系的现有属性,而使用SET命令向现有的节点或者关系添加新的属性。
REMOVE命令:
1 . 删除节点或关系的标签
2 . 删除节点或关系的属性
REMOVE命令和DELETE命令之间的区别:
1 . DELETE操作用于删除节点和关联关系。
2 . REMOVE操作用于删除标签和属性。
即REMOVE命令比DELETE命令操作的范围更小。
REMOVE命令和DELETE命令的相同点:
1 . 这两个命令不应单独使用。
2 . 两个命令都应该与MATCH命令一起使用。
REMOVE的用法:
1 . 删除节点或关系的属性
REMOVE <property-name-list>
property-name-list:一个要从数据库相关节点删除的属性列表。
使用REMOVE命令删除属性:
MATCH (book { id:122 })
REMOVE book.price
RETURN book
使用MATCH命令找出现有节点,使用REMOVE命令移除该节点的price属性。
2 . 删除节点或关系的标签
语法:
REMOVE <label-name-list>
label-name-list:标签列表,用于永久性的从节点或关系删除它。
案例:
MATCH (m:Movie)
REMOVE m:Picture
MATCH命令筛选出所需要的标签,使用REMOVE命令永久删除该节点的标签。
SET命令:
1 . 向现有节点或关系添加新属性
2 . 添加或更新属性值
SET命令与SQL语句中的insert语句类似,都是用于插入新的值。
SET语法:
SET <property-name-list>
使用案例:
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc
使用MATCH命令查找到dc节点,使用SET命令增加一个新的atm_pin属性。
3.2.8 ORDER BY子句
Neo4j中提供了ORDER BY命令,对于MATCH查询返回的结果进行排序,其默认的按升序进行排列,如果要按照降序进行排列,我们需要使用DESC语句。
语法:
ORDER BY <property-name-list> [DESC]
示例:
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
使用MATCH命令查询节点,ORDER BY字句,对MATCH查询返回的结果进行排序处理,默认为圣墟排列。
降序排列:
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC
3.2.9 UNION 和 UNION ALL子句
UNION子句用于将MATCH命令筛选出的两组结果集中的公共行组合并返回到同一个组结果中,但他不从两个节点返回重复的行。
action:UNION子句结果类型和来自两组结果的名称必须匹配,即列名称应该相同,列的数据类型也应该相同。
语法格式:
<MATCH Command1>
UNION
<MATCH Command2>
错误示例:
MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
命令报错,原因是两条MATCH语句所对应的属性没有一致,这里既有信用卡式和借记卡具有相同的属性名:身份证和号码,但他们有不同的节点名称前缀,为了避免这种错误,Neo4j提供“AS”子句用于给属性一些别名。。
正确案例:
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
UNION ALL子句:
UNION ALL结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
语法格式:
<MATCH Command1>
UNION ALL
<MATCH Command2>
使用示例:
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
3.2.10 LIMIT 和 SKIP 子句
Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。
如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用CQL SKIP子句。
LIMIT子句:
LIMIT <number>
使用示例:
MATCH (emp:Employee)
RETURN emp
MATCH (emp:Employee)
RETURN emp
LIMIT 2
使用LIMIT子句对结果集的尾部进行修剪。
SKIP语句:
SKIP <number>
MATCH (emp:Employee)
RETURN emp
MATCH (emp:Employee)
RETURN emp
SKIP 2
3.2.11 CREATE + MATCH = MERGE
MERGE命令:
1 . Neo4j使用CQL MERGE命令 -
2 . 创建节点,关系和属性
Neo4j CQL MERGE命令在图中搜索给定模式,如果存在,则返回结果
如果它不存在于图中,则它创建新的节点/关系并返回结果。
即与CREATE不同的是,CREATE命令无论数据库中是否存在要创建的节点/关系,都会创建一个新的节点/关系,而MATCH命令则会在创建之前做MATCH操作,如果有则返回当前节点/关系,如果没有,则会创建一个新的节点/关系。
MERGE语法:
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
使用案例:
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
创建了一个新的节点,当我们重新执行一遍这个语句时:
没有创建一个新的节点,这就是MERGE命令和CREATE命令的区别。
3.2.12 IN操作符
Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN操作符语法:
IN[<Collection-of-values>]
使用案例:
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
此查询仅返回在IN运算符中指定的id匹配的两行。
3.3 Neo4j 关系基础:
作为图形数据库,关系是Neo4j中较为重要的是组成部分之一,根据属性图模型,关系应该是定向,否则Neo4j将输出一个错误信息,切Neo4j中的关系只有两种属性,单向关系和双向关系,在Neo4j中,我们使用CREATE命令创建两个节点之间的关系。
1 . 在两个现有节点之间创建无属性的关系
2 . 在两个现有节点之间创建与属性的关系
3 . 在两个新节点之间创建无属性的关系
4 . 在两个新节点之间创建与属性的关系
5 . 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
CREATE (<node1-name>:<label1-name>)-
[(<relationship-name>:<relationship-label-name>)]
->(<node2-name>:<label2-name>)
案例:
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)
为节点名为p1,标签名为Profile1节点和节点名p2,标签名为Profile2的节点之间创建关系名为r1,属性为LIKES的关系。
3.4 neo4j CQL函数:
函数 | 说明 | 用法 |
---|---|---|
String | 字符串 | 它们用于使用String字面量。 |
Aggregation | 聚合 | 它们用于对CQL查询结果执行一些聚合操作。 |
Relationship | 关系 | 他们用于获取关系的细节,如startnode,endnode等。 |
3.4.1 字符串函数:
功能 | 描述 |
---|---|
UPPER | 它用于将所有字母更改为大写字母。 |
LOWER | 它用于将所有字母改为小写字母。 |
SUBSTRING | 它用于获取给定String的子字符串。 |
REPLACE | 它用于替换一个字符串的子字符串 |
1.UPPER:
将所有字母更改为大写
函数语法:
UPPER (<input-string>)
<input-string>可以是来自Neo4J数据库的节点或关系的属性名称。
使用示例:
MATCH (e:Employee)
RETURN e.id,UPPER(e.name),e.sal,e.deptno
2.LOWER
需要一个字符串作为输入并转换为小写字母。 所有CQL函数应使用“()”括号。
函数语法:
LOWER (<input-string>)
使用示例:
MATCH (e:Employee)
RETURN e.id,LOWER(e.name),e.sal,e.deptno
3.SUBSTRING
SUBSTRING接受一个字符串作为输入和两个索引:一个是索引的开始,另一个是索引的结束,并返回从StartInded到EndIndex-1的子字符串。 所有CQL函数应使用“()”括号。
函数语法:
SUBSTRING(<input-string>,<startIndex> ,<endIndex>)
在Neo4J CQL中,如果一个字符串包含n个字母,则它的长度为n,索引从0开始,到n-1结束。
<startIndex>是SUBSTRING函数的索引值。
<endIndex>是可选的。 如果我们省略它,那么它返回给定字符串的子串从startIndex到字符串的结尾。
使用示例:
MATCH (e:Employee)
RETURN e.id,SUBSTRING(e.name,0,2),e.sal,e.deptno
使用SUBSTRING前:
使用SUBSTRING后:
3.4.2 AGGREGATION聚合
聚合函数 | 描述 |
---|---|
COUNT | 它返回由MATCH命令返回的行数。 |
MAX | 它从MATCH命令返回的一组行返回最大值。 |
MIN | 它返回由MATCH命令返回的一组行的最小值。 |
SUM | 它返回由MATCH命令返回的所有行的求和值。 |
AVG | 它返回由MATCH命令返回的所有行的平均值。 |
1 . COUNT
COUNT 计数,从MATCH子句获取结果,并计算结果中出现的行数,并返回该计数值。 所有CQL函数应使用“()”括号。
函数语法:
COUNT(<value>)
<value>可以是*,节点或关系标签名称或属性名称。
MATCH (e:Employee) RETURN COUNT(*)
2 . MAX与MIN
MAX最大值,采用一组行和节点或关系的作为输入,并从给定行的give 列中查找最小值。
MIN最小值,采用一组行和节点或关系的作为输入,并从给定行的give 列中查找最小值。
函数语法:
MIX:
MAX(<property-name> )
MIN:
MIN(<property-name> )
使用示例:
MATCH (e:Employee)
RETURN MAX(e.sal),MIN(e.sal)
3 . AVG和SUM
AVG 平均值:采用一组行和节点或关系的作为输入,并从给定行的give 列中查找平均值。
SUM 和:采用一组行和节点或关系的作为输入,并从给定行的give 列中查找求和值。
函数语法:
AVG:
AVG(<property-name> )
SUM:
SUM(<property-name> )
3.4.3 关系函数:
关系函数 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点。 |
ENDNODE | 它用于知道关系的结束节点。 |
ID | 它返回由MATCH命令返回的一组行的最小值。 |
TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
1.STARTNODE 和 ENDNODE
STARTNODE 开始节点:它需要一个字符串作为输入并转换为大写字母。 所有CQL函数应使用“()”括号。
ENDNODE 结束节点: 它需要一个字符串作为输入并转换为大写字母。 所有CQL函数应使用“()”括号。
函数语法:
STARTNODE:
STARTNODE (<relationship-label-name>)
使用示例:
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN STARTNODE(movie)
ENDNODE:
ENDNODE (<relationship-label-name>)
使用示例:
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN ENDNODE(movie)
2 . ID 和 TYPE 关系函数
ID可以检索关系的的ID,TYPE可以来检索关系的类型。
语法格式:
ID:
ID (<relationship-label-name>)
TYPE:
TYPE (<relationship-label-name>)
使用示例:
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN ID(movie),TYPE(movie)
3.5 Neo4j CQL数据类型:
数据类型 | 用法 |
---|---|
Boolean | 用于表示布尔型数据:true,false |
byte | 用于表示8位整数 |
short | 用于表示16位整数 |
int | 用于表示32位整数 |
long | 用于表示64位整数 |
float | 用于表示32位浮点数 |
double | 用于表示64位浮点数 |
char | 用于表示16位浮点数 |
String | 用于表示字符串 |
3.6 Neo4j 索引:
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
在Neo4j中,我们使用CREATE INDEX语句创建索引。用DROP INDEX丢弃索引。
创建索引语法:
CREATE INDEX ON :<label_name> (<property_name>)
在节点或关系的<label_name>的<property_name>上创建一个新索引。
使用示例:
CREATE INDEX ON :Customer (name)
CreditCard节点的number属性上创建INDEX。
移除索引语法:
DROP INDEX ON :<label_name> (<property_name>)
删除在节点或关系的<label_name>的<property_name>上创建的现有索引。
使用示例:
DROP INDEX ON :Customer (name)
一个索引从Neo4j数据库中删除。
3.7 Neo4j 约束:
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。 然后我们不能直接得到这个。 我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIQUE约束的优点:
1 . 避免重复记录。
2 . 强制执行数据完整性规则。
UNIQUE约束操作
1 . 创建UNIQUE约束
2 . 丢弃UNIQUE约束。
1 . 创建约束:
创建约束的语法:
CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
上述语法描述了它的<PROPERTY_NAME> <LABEL_NAME>节点或关系创造了一个独特的约束。
CREATE CONSTRAINT ON 是一个Neo4j CQL关键字。
<label_name> 节点或关系的标签名称。
ASSERT 一个Neo4j CQL关键字。
<property_name> 节点或关系的属性名称。
IS UNIQUE 一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。
使用示例:
CREATE CONSTRAINT ON (cc:CreditCard)
ASSERT cc.number IS UNIQUE
语句报错,是因为我们的图形数据库中有两个重复的节点,所以该语句会报错,我们可以删掉其中一个语句。然后再执行该语句。
这里我们在CreditCard节点的number属性上创建了一个UNIQUE约束。 因为根据我们的客户要求,CreditCard号码应该是唯一的。
如果应用程序尝试插入重复的CreditCard号码,Neo4j DB服务器将会抛出一个错误,表示数据库中已存在相同的数字。
2 . 删除UNIQUE约束语法:
DROP CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
1 . DROP CONSTRAINT ON 它是一个Neo4j CQL关键字。
2 . <label_name> 它是节点或关系的标签名称。
3 . ASSERT 它是一个Neo4j CQL关键字。
4 . IS UNIQUE 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。
上述语法描述它从节点或关系的<label_name>的<property_name>中删除唯一约束。
DROP CONSTRAINT ON (cc:CreditCard)
ASSERT cc.number IS UNIQUE
当我们删除唯一约束之后,我们即可以在数据库中创建无穷多个同样的节点。