前言
图数据库,存储的是节点和关系,而不是表。在Neo4j中,节点和关系都由属性和标签描述。
在 Cypher 查询语句中,节点和关系的表述一般为:
- 节点:
(Variable:Label1:Label2{properties})
- 关系:
-[Variable:Label1:Label2{properties}]->
其中,箭头可以向左(<-[]-
),向右(-[]->
),或没有(-[]-
),分别表示不同的关系方向和无方向的关系。
其中,Variable 表示当前 cql 语句中,代表该节点(或边)的变量名称。Label 表示标签,可以理解为一个类型。properties 是多个键值对(类似json格式,只是key不能加引号,并且其值类型只能为日期类型和简单类型)。
如下图:
其中:
- (:Person{name:“Dan”}) 表示一个节点,Person 是他的标签。{name:“Dan”} 是他的属性。
- -[:LOVES]-> 代表一个关系,LOVES 是关系的标签。
安装:
1、docker:
docker run -d --name neo4j\ //-d表示容器后台运行 --name指定容器名字
-p 7474:7474 -p 7687:7687 \ //映射容器的端口号到宿主机的端口号
-v /home/neo4j/data:/data \ //把容器内的数据目录挂载到宿主机的对应目录下
-v /home/neo4j/logs:/logs \ //挂载日志目录
-v /home/neo4j/conf:/var/lib/neo4j/conf //挂载配置目录
-v /home/neo4j/import:/var/lib/neo4j/import \ //挂载数据导入目录
neo4j //指定使用的镜像
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -v /home/develop/neo4j/data:/data -v /home/develop/neo4j/logs:/logs -v /home/develop/neo4j/conf:/var/lib/neo4j/conf -v /home/develop/neo4j/import:/var/lib/neo4j/import neo4j
2、直接下载解压
默认用户密码为:neo4j/neo4j
1、创建
1.1 创建节点
语法:
CREATE <nodeDes>
nodeDes:即上文提到的 (Variable:Label1:Label2{properties})
比如:
CREATE (:Person)
CREATE (:Person{name:'罗辑'})
也可以在语句后添加 RETURN 子句返回创建的节点(在游览器操作时,能直接查看创建的节点):
CREATE (p:Civilization{name:'三体'}) RETURN p
注:属性格式的内容限制:
1.2 创建关系
在两个新节点之间创建关系
语法:
CREATE <NodeDes_1> <RelationDes> <NodeDes_2>
其中:
- NodeDes:
(Variable:Label1:Label2{properties})
- RelationDes:
-[Variable:Label1:Label2{properties}]->
向右关系详细版:
CREATE
(<from-name>:<from-label>)-
[<relationship-name>:<relationship-label>{{<properties>}}]->
(<to-name>:<to-label>)
RETURN <from-name>,<relationship-label-name>,<to-name>
例如:
没有properties属性:
CREATE (p:Person{name:'罗辑'})-[r:THREATEN]->(c:Civilization{name:'三体'})
RETURN p,r,c
有properties属性:
CREATE (p:Person{name:'罗辑'})-[r:THREATEN{des:'利用雪地工程'}]->(c:Civilization{name:'三体'})
RETURN p,r,c
在已有节点上创建属性
语法:
MATCH <NodeDes_1>, <NodeDes_2>
CREATE <NodeDes_1_Variable> <RelationDes> <NodeDes_2_Variable>
向右关系完整版本:
MATCH (<from-name>:<from-label>{properties}),(<to-name>:<to-label>{properties})
CREATE
(<from-name>)-[<relationship-name>:<relationship-label>{<properties>}]->(<to-name>)
RETURN <relationship-label-name>
其中 CREATE 可以替换为 MERGE 指令
例如:
1、创建节点
CREATE (p:Person{name:'叶文洁'}) RETURN p;
CREATE (p:Person{name:'杨卫宁'}) RETURN p;
2、创建关系
MATCH (from:Person {name:'叶文洁'}),(to:Person {name:'杨卫宁'})
CREATE (from)-[kill:KILL{address:'第一红岸'}]->(to)
RETURN from,kill,to
或者:
MATCH (from:Person),(to:Person)
WHERE from.name = '叶文洁' AND to.name = '杨卫宁'
CREATE (from)-[kill:KILL{address:'第一红岸'}]->(to)
RETURN from,kill,to
或者:
MATCH (from:Person {name:'叶文洁'}),(to:Person {name:'杨卫宁'})
MERGE (from)-[kill:KILL{address:'第一红岸'}]->(to)
RETURN from,kill,to
2、查询
MATCH
语法:
MATCH command
[WHERE condition]
RETURN x
[ORDER BY xxx]
[LIMIT num]
说明:
- WHERE 子句和 sql 类似。
- 在语句中可以使用一些方法:
- exists() 判断属性是否存在
- count() 计数
- collect() 将值聚合到列表中
- size() 计算列表大小
- UNWIND collect() 遍历列表值
- …
查询所有节点:
MATCH (n) RETURN n
MATCH (p:Person{name:'罗辑'}) RETURN p
上句也等价于:
MATCH (p:Person)
WHERE p.name = '罗辑'
RETURN p
3、删除
语法:
MATCH command
WHERE condition
(DETACH) DELETE x
删除边:
MATCH (from:Person{name:'罗辑'})-[r]-(to:Civilization{name:'三体')
DELETE r
删除节点(必须相关的边都被删除了):
MATCH (p:Person{name:'罗辑'})
DELETE p
强制删除节点和边:
MATCH (p:Person{name:'罗辑'})
DETACH DELETE p
同时删除节点和边:
MATCH (from:Person{name:'叶文洁'})-[r]-(to:Person{name:'杨卫宁'})
DELETE from,r,to
清空节点和边:
MATCH (n) DETACH DELETE n
4、修改属性
SET语法:
SET <property-key>=<property-value>
例如:
MATCH (p:Person{name:'罗辑'})
SET p.description='混吃等死清华教授'
REMOVE语法:
REMOVE <property-name-list>
例如:
MATCH (p:Person{name:'罗辑'})
REMOVE p.description