天天看点

(一)neo4j 之 cypher常用语法cypher语言说明

neo4j 图数据库之 cypher常用语法

  • cypher语言说明
    • CQL数据类型
    • 删除语句
    • 创建节点语句
    • 创建关系语句
    • 查询库信息语句
    • 查询数据语句
    • 全文索引
    • 配置文件
    • 权限配置
    • 清空数据库

cypher语言说明

cypher 是neo4j声明式声明式查询语言,简称CQL。它遵循SQL语法,非常简单并且具有可读性的结构化格式。

CQL数据类型

类型 说明
boolean 用于表示布尔文字:true,false。
byte 用于表示8位整数。
short 用于表示16位整数。
int 用于表示32位整数。
long 用于表示64位整数。
float 用于表示32位浮点数。
double 用于表示64位浮点数。
char 用于表示16位字符。
String 用于表示字符串。

删除语句

  • 删除所有节点及其关系
MATCH (a) OPTIONAL MATCH (a)-[r]-() DELETE a,r
           
  • 删除某个节点
MATCH (a:student)  DELETE a
           
  • 删除属性
  • 删除属性
MATCH (a:student)  REMOVE a.name
           
  • 删除关系
MATCH (a:student1)-[r:test_graph]-(a:student2)  DELETE r
           

创建节点语句

  • 创建一个空节点
  • 创建一个带有lable节点
  • 创建节点并分配属性
CREATE (a:student{age:18,name:'张三'}) RETURN *  //注意:在已有的节点且属性相同会重复创建
MERGE (a:student{age:18,name:'张三'}) RETURN * //注意:没有此节点会新建立,已有此节点且属性相同会融合,已有此节点且属性值包含创建语句的属性值不会新创建,已有此节点且属性不同会新建立
MERGE (a:student{age:18,name:'张三',nick:['三三','小三']}) RETURN *
           
  • 批量创建节点并且分配属性
UNWIND [{name:"李四"},{name:"张三"}] AS nodes CREATE (student) SET student= nodes
           
  • 新增、更新属性
MERGE (a:student{name:'张三'}) ON CREATE SET a.age='19' RETURN *  //注意:已有节点时属性不会创建和更新,未有节点会创建
MERGE (a:student{name:'张三'}) SET a.age='19' RETURN *  //新增、更新
//合并
MERGE (n:student{name: '张三'}) 
  ON CREATE SET n.age = 20
  ON MATCH SET  n.age = 20
           
  • 创建多lable
  • 在已有节点上添加新lable
MATCH (a{name:'张三'}) SET a:person RETURN a  //添加一个标签
MATCH (a{name:'张三'}) SET a:person:student RETURN a //添加一个标签
           

创建关系语句

  • 创建两个节点同时创建一个关系,给两个节点建立关系,指定关系类型、方向和属性。
  • 在已有两个节点基础上建立关系,指定关系类型、方向和属性。
//注意:多次执行该语句使用 `CREATE` 会重复建立关系, 非重复建立使用 `MERGE` 即可 
MATCH (a:student{name:"李四"}),(b:student{name:"张三"})  CREATE (a)-[r:test_graph]->(b) return * 
           
  • 在已有两个节点基础上建立关系,关系上附加属性。

查询库信息语句

  • 帮助
:help
           
  • 查询所有关系类型、节点标签
call db.propertyKeys
call db.labels
           
  • 查看数据库结构
  • 查看连接信息
  • 查看系统信息
:play sysinfo
           
  • 查看所有lables
  • 查询所有的type
  • 查询库内有多少个节点
  • 查询有多少关系,不带方向的话结果为2倍
MATCH ()-->() RETURN count(*);
MATCH ()-[r]->() RETURN count(r); 
           

查询数据语句

  • 查询(

    所有节点及其关系

  • 查询(

    孤立节点,及无关系节点

  • 查询(

    匹配结果集中如果有丢的部分,则会用null来补充

OPTIONAL MATCH (n)-[r]->(m) RETURN m
           
  • 查询(

    所有标签为 student 的节点

  • 查询(

    多标签节点

  • 查询(

    标签为 student 并且属性为 age=18 的所有节点

MATCH (a:student) WHERE a.age = 18 RETURN * 
//或者 
MATCH (a:student{age:18}) RETURN *
           
  • 查询(

    节点 Id

MATCH (a:student) WHERE id(a)=2 RETURN *
MATCH (a:student) RETURN ID(a)
           
  • 查询(

    匹配属性字符串的开头关键词 STARTS WITH

MATCH (a) WHERE a.name STARTS WITH '张' RETURN a
           
  • 查询(

    匹配属性字符串的结尾关键词 ENDS WITH

MATCH (a) WHERE a.name ENDS WITH '三' RETURN a
           
  • 查询(

    匹配属性字符串的结尾关键词 ENDS WITH

MATCH (a) WHERE a.name ENDS WITH '三' RETURN a
           
  • 查询(

    匹配属性字符串的不包含关键词 CONTAINS

MATCH (a) WHERE NOT a.name CONTAINS '三' RETURN a
           
  • 查询(

    支持正则表达式

MATCH (a) WHERE a.name =~'.*三.*' RETURN a
           
  • 查询(

    属性不为空

  • 查询(

    Coalesce

  • 查询(

    条件 IN、与、或、NOT、NULL

MATCH (a:student) WHERE a.age IN [18,17,20] AND a.name IS NOT NULL OR a.age IS NULL RETURN *
MATCH (a:student) WHERE NOT a.age IN [18,17,20] RETURN *
MATCH (a:student) WHERE NOT (a)-[]-() DELETE a
           
  • 查询(

    排序

  • 查询(

    分页

  • 查询(

    计算 最大值、最小值、平均值、和、统计

//注意age为数值等可计算字段且不为空,如有为空请排除后计算
MATCH (a:student) RETURN max(a.age),min(a.age),avg(a.age),sum(a.age),count(a.age) 
           
  • 查询(

    分组、聚类数量、相异去重

MATCH (a:student) WITH COLLECT(distinct a.name) as c WHERE SIZE(c)<20  RETURN * 
MATCH (a:student) WITH TYPE(a.age) AS t,COLLECT(distinct a.name) as c WHERE SIZE(c)<20  RETURN * 
           
  • 查询(

    关系、过滤

//无指定方向和关系
MATCH (a:student)-[]-(b:student) RETURN * 
//指定方向和关系
MATCH (a:student)-[:test_graph]->(b:student) RETURN * 
//指定方向和关系,并且返回指定属性 name 和关系类型以 t 开头的关系数据
MATCH (a:student)-[]->(b:student) WHERE a.name ='李四' and TYPE(r)=~ 't.*'  RETURN * 
MATCH (a{ name: '张三' }),(b)  WHERE b.name IN ['李四','王五'] AND (a)<--(b)  RETURN b
//返回任意关系为 test_graph 和 belong 的所有节点关系
MATCH p=(a)-[:test_graph|:belong]->(b) RETURN p 
//关系属性范围过滤
MATCH (a)-[r:test_graph]->(b) WHERE r.influence < 2000 RETURN *
           
  • 查询(

    节点之间最短路径

    )
MATCH n=allshortestPaths((a:student{name:"李四"})-[*]-(b:student{name:"张三"})) return n 
           
  • 查询(

    深度关系匹配

    )
//可变长度的关系
START a=node(3), x=node(2, 4) MATCH p1=a-[r:test_graph*1..3]->x RETURN a,x,length(p1)
//匹配从a到b,任意关系,深度1到5的节点
MATCH p=(a)-[*1..5]->(b) RETURN p
//匹配从a到b,任意关系、任意深度的节点
MATCH p=(a)-[*]->(b) RETURN p
           
  • 查询(

    关键词 All、Any、None、Single

    )
//迭代测试集合中所有元素的判断
MATCH p=(a:student) WHERE ALL(x IN nodes(p) WHERE x.name='李四') RETURN a
MATCH (a:student) WHERE ANY(x IN a.array WHERE x.name='李四') RETURN *
//在迭代器中没有元素判断将返回true
MATCH p=(a:student)-[*1..3]-() WHERE NONE(x IN nodes(p) WHERE x.name= '李四') RETURN p
//如果迭代器中仅有一个元素则返回true
MATCH p=(a:student)-[*1..3]-() WHERE SINGLE(x in nodes(p) WHERE x.name= '李四') RETURN p 
           
  • 查询(

    Nodes、Relationships、Extract

    )
//返回一个路径中的所有节点
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN nodes(p)
//返回一条路径中的所有关系
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN relationships(p) 
//返回一个路径中的所有节点
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN extract(n in nodes(p):n.name)  
           
  • 查询(

    UNION 语句

    )
//使用UNION结果去重,求并集
MATCH (a)-[:test_graph]->(b) RETURN b.name UNION MATCH (a)-[:belong]->(b)  RETURN b.name 
//使用UNION ALL结果不去重, 求和集
MATCH (a)-[:test_graph]->(b) RETURN b.name UNION ALL MATCH (a)-[:belong]->(b)  RETURN b.name
           

//执行过程

EXPLAIN MATCH (n:LabelsTree) return *

全文索引

请跳转下期博客: (二)neo4j 之 全文索引

配置文件

请跳转下期博客: (三)neo4j 之 配置文件参数

权限配置

  • 创建新用户及管理角色
功能 语句
管理员账户创建一个用户

CALL dbms.security.createUser('freedom', 'admin123', true)

分配用户一个角色

CALL dbms.security.addRoleToUser('publisher', 'freedom')

改变用户密码

CALL dbms.security.changePassword('admin456')

删除用户的读写权限

CALL dbms.security.removeRoleFromUser('publisher', 'freedom')

给用户分配读数据权限

CALL dbms.security.addRoleToUser('reader', 'freedom')

  • 禁用和重新激活用户
功能 语句
禁用

CALL dbms.security.suspendUser('freedom')

重新激活

CALL dbms.security.activateUser('freedom')

  • 通过控制台添加新用户

    a.控制台输入栏输入

    :server user add

    b.设置username,setPassword,ConfirmPassword,点击AddUser

清空数据库

删除数据 databases/graph.db