0. 安装
我是mac直接执行
brew install neo4j
1. 基本语法学习
1.1 CREATE
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
| 语法元素 | 描述 |
|---|---|
<node-name> | 它是我们将要创建的节点名称。 |
<label-name> | 它是一个节点标签名称 |
<Property-name> | 属性是键值对。 定义将分配给创建节点的属性的名称 |
<Property-value> | 属性是键值对。 定义将分配给创建节点的属性的值 |
这个node-name好像并不是很重要,类似于一个占位符,应该是数据库内存自己处理逻辑的时候会用到
示例 创建一个Dept标签节点,它拥有如下属性
- deptno
- dname
- location
CREATE (
dept:Dept {
deptno:10,
dname:"Accounting",
location:"Hyderabad"
}
)
1.2 MATCH
MATCH
(
<node-name>:<label-name>
)
| 语法元素 | 描述 |
|---|---|
<node-name> | 这是我们要创建一个节点名称。 |
<label-name> | 这是一个节点的标签名称 |
示例
# 查询Dept下的内容
MATCH (dept:Dept) return dept
# 查询Employee标签下 id=123,name="Lokesh"的节点
MATCH (p:Employee {id:123,name:"Lokesh"}) RETURN p
## 查询Employee标签下name="Lokesh"的节点,使用(where命令)
MATCH (p:Employee) WHERE p.name = "Lokesh" RETURN p
这个一般是和RETURN连起来用
1.3 RETURN
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
| 语法元素 | 描述 |
|---|---|
<node-name> | 它是我们将要创建的节点名称。 |
<Property-name> | 属性是键值对定义要分配给创建节点的属性的名称 |
1.4 MATCH & RETURN匹配和返回
这里有点类似SQL中的select选择属性返回
示例
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname
1.5 关系
基于方向性,Neo4j关系被分为两种主要类型。
- 单向关系
- 双向关系 在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
- 在两个现有节点之间创建无属性的关系
- 在两个现有节点之间创建有属性的关系
- 在两个新节点之间创建无属性的关系
- 在两个新节点之间创建有属性的关系
- 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
每个关系(→)包含两个节点
- 从节点
- 到节点 分别对应两个关系
- 外向关系
- 传入关系
创建关系
# 先找到这两种节点
MATCH (e:Customer),(cc:CreditCard)
# 创建关系
CREATE (e)-[r:DO_SHOPPING_WITH ]->(cc)
查找关系
# 匹配出关系
MATCH (e)-[r:DO_SHOPPING_WITH ]->(cc)
# 返回关系,当然也可以返回e和cc把节点一起返回
RETURN r
1.6 WHERE
# 简单
WHERE <condition>
# 复杂
WHERE <condition> <boolean-operator> <condition>
<condition>语法:
<property-name> <comparison-operator> <value>
示例
MATCH (emp:Employee)
WHERE emp.name = 'Abc'
RETURN emp
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
和创建关系联系起来
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
1.7 DELETE
DELETE <node-name-list>
注意
我们应该使用逗号(,)运算符来分隔节点名。
示例
MATCH (e: Employee) DELETE e
显然把之前的RETURN关键字改为RETURN就能实现想要的效果,比如我们也能删除关系,如下
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
1.8 REMOVE
DELETE是删除节点和关系的REMOVE是删除标签和属性的
REMOVE <property-name-list>
<property-name-list> 语法
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>
注意
- 我们应该使用逗号(,)运算符来分隔标签名称列表。
- 我们应该使用dot(。)运算符来分隔节点名称和标签名称。
示例
MATCH (book { id:122 })
REMOVE book.price
RETURN book
1.9 SET
- 向现有的节点和关系添加新的属性
- 添加或更改属性值
SET <property-name-list>
<property-name-list>语法
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
示例
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
1.10 ORDER BY
默认DESC 降序
ORDER BY <property-name-list> [DESC]
示例
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
1.11 UNION
它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。
<MATCH Command1>
UNION
<MATCH Command2>
示例
注意 合并的字句应该有相同的列名,如下会报错,因为前缀不一样
MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
为了解决上述问题使用关键字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
1.12 UNION ALL
和UNION不同点:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
<MATCH Command1>
UNION ALL
<MATCH Command2>
1.13 LIMIT 和 SKIP
一个是限制条数,一个是起始行数,显然可以用这个来做分页
LIMIT <number>
SKIP <number>
示例
MATCH (emp:Employee)
RETURN emp
SKIP 2
LIMIT 2
1.14 MERGE
MERGE命令在图中搜索给定模式
- 如果存在,则返回结果
- 如果它不存在于图中,则它创建新的节点/关系并返回结果
MERGE = CREATE + MATCH
示例
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
2.实战
先有如下树形结构数据,将其存储
- 查找算法
- 顺序查找
- 算法原理
- 岗哨、哨兵
- 程序实现
- 折半查找
- 算法原理
- 程序实现
- 递归算法
- 判定树
- 判定树原理
- 判定树与具体数值无关
- 索引顺序查找
- 数据特点:分块有序
- 索引表数据结构
- 性能分析
- 顺序查找
2.1 存储节点
create(a:NODE{name:"查找算法",deep:"1",id:1});
create(a:NODE{name:"顺序查找",deep:"2",id:2,parentid:1});
create(a:NODE{name:"折半查找",deep:"2",id:3,parentid:1});
create(a:NODE{name:"索引顺序查找",deep:"2",id:4,parentid:1});
create(a:NODE{name:"算法原理",deep:"3",id:5,parentid:2});
create(a:NODE{name:"岗哨、哨兵",deep:"3",id:6,parentid:2});
create(a:NODE{name:"程序实现",deep:"3",id:7,parentid:2});
create(a:NODE{name:"算法原理",deep:"3",id:8,parentid:3});
create(a:NODE{name:"程序实现",deep:"3",id:9,parentid:3});
create(a:NODE{name:"递归算法",deep:"3",id:10,parentid:3});
create(a:NODE{name:"判定树",deep:"3",id:11,parentid:3});
create(a:NODE{name:"数据特点:分块有序",deep:"3",id:12,parentid:4});
create(a:NODE{name:"索引表数据结构",deep:"3",id:13,parentid:4});
create(a:NODE{name:"性能分析",deep:"3",id:14,parentid:4});
create(a:NODE{name:"判定树原理",deep:"4",id:15,parentid:11});
create(a:NODE{name:"判定树与具体数值无关",deep:"4",id:16,parentid:11});
2.2建立关系
match(parent:NODE),(child:NODE) where parent.id = child.parentid
create (parent)-[l:LINk{name:"包含"}]->(child)
成图
一些常用操作
删除所有关系和节点
match (e)-[l]->(x) delete e,l,x
match (n) delete n