【CQL】总结neo4j



2020年11月20日    Author:Guofei

文章归类: 0x33_图模型    文章编号: 360

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2020/11/20/neo4j.html


安装配置

用 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

您的支持将鼓励我继续创作!