安装配置
用 docker 直接用
docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
neo4j
UI洁面: http://localhost:7474
初始密码:neo4j/neo4j
数据库
create database movies
:use movies
增
增加节点
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
用来创建节点
- node-name 节点名
- label-name 节点标签名
- Property1-name:roperty1-Value 键值对
- title 属性是图形化显示时,默认显示的名字
- CREATE 可以换成 MERGE,效果就是:如果数据库中已经有完全一样的 node,就不新建了
例子:
CREATE (m:Movie{title:'头脑特工队',year:'2020'})
创建多个标签
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
增加关系
CREATE (p1:Profile1)-[r1:Links]->(p2:Profile2)
例如
CREATE (m:Movie{title:'冰雪奇缘',year:'2020'})-[r1:links{maker:'company maker'}]->(c:Campany{name:'迪士尼',location:'USA'})
(实测会同时创建新的node)
查询节点,并创建关系
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)
例子:
MATCH(m1:Movie),(m2:Movie)
WHERE m1.year=m2.year
CREATE (m1)-[r:SAME_YEAR{is_same_year:'yes'}]->(m2)
RETURN r
删
DELETE 用来删除节点和关系
MATCH (e: Employee) DELETE e
例子
MATCH (m:Movie)
WHERE m.name='头脑特工队'
DELETE m
(需要先删除关系,才能删除节点)
MATCH (m1:Movie)-[r:LINKS]-(m2:Movie)
WHERE m1.name='冰雪奇缘'
DELETE r,m1,m2
改
remove
remove 用来删除标签和属性
MATCH(m1:Movie)
WHERE m1.name='冰雪奇缘'
REMOVE m1.year
set
改变标签和属性
MATCH(m1:Movie)
WHERE m1.name='冰雪奇缘'
SET m1.year='2018'
- 不存在的会添加,存在的会替换
查
MATCH (col {name: "Tom Hanks"}) RETURN col
(这里的col是你自定义的列名)
MATCH(m1:Movie)
WHERE m1.name='冰雪奇缘'
RETURN m1.year
LIMIT 10
总结
MATCH (col:<label-name>)
WHERE 条件
RETURN 子句
ORDER BY 条件 【DESC/ASC】
LIMIT 5
ORDER BY
和 sql 的用法一样LIMIT 5
也和 sql 的用法一样。还可以用SKIP 5
获取底部的5条记录- 可以 RETRUN 不存在的属性,这时 RETRUN 一个 null
- RETRUN 后面也可以跟 DISTINCT 来去重
- RETURN 后面的字段可以用 AS 重新命名
- WHERE 条件可以是 IN ,例如
WHERE m.title IN ['头脑特工队','冰雪奇缘']
UNION
两个子句中间放UNION语句,用来合并两个结果
- 与sql一样,union 会自动去重,
union all
不会去重
查询关系
MATCH (cc:CreditCard)-[r]-(c:Customer) RETURN r
MATCH (m1:Movie)-[r]-(m2:Movie) WHERE m1.title=’头脑特工队’ RETURN r
函数
字符串函数
- UPPER
- LOWER
- SUBSTRING
SUBSTRING(<input-string>,<startIndex> ,<endIndex>)
,索引从0开始 - REPLACE
聚合(好像不能搭配 group by,结果就只能是一行)
- COUNT
- MAX
- MIN
- SUM
- AVG
关系的函数
- STARTNODE(r) :返回 r 这个关系的开始 node
- ENDNODE(r): 结束 node
- ID(r):关系的id,也可以输入node返回node的id
- TYPE(r):关系的类型,也就是类似 node-label 的东西
例子:
MATCH (a)-[r:links]->(c) WHERE r.maker='company maker' RETURN STARTNODE(r)
案例与技巧
删库到跑路
# 清除全部带关系的节点、关系
MATCH (a)-[r]->(b) DELETE r,a,b
# 清除节点,如果节点还连着关系,会报错
MATCH (a) DELETE a
如果是一次提交的语句,冒号前面的名字会识别成同一个节点。如果是分两次提交,会识别成不同的节点
CREATE (m:Movie{title:'冰雪奇缘',year:'2020'})
CREATE (m2:Movie{title:'头脑特工队',year:'2018'})
CREATE (c:Campany{name:'迪士尼',location:'USA'})
CREATE (m)-[r1:links{maker:'company maker'}]->(c),
(m2)-[r2:links{maker:'company maker'}]->(c)
- 这里的m和c认为是同一个,如果分开提交就被认为是不同的,然后重复生成节点。
关系
# * 关键字代表一切关系
match (a)-[*]-(b) return a,b
# 还有一种特殊写法
MATCH (a)-[:links]->(c)<-[:links]-(a1) RETURN a,a1