(一)neo4j 之 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{name:'张三'})  REMOVE a.name RETURN *
  • 删除属性
MATCH (a:student)  REMOVE a.name
  • 删除关系
MATCH (a:student1)-[r:test_graph]-(a:student2)  DELETE r

创建节点语句

  • 创建一个空节点
CREATE (student)
  • 创建一个带有lable节点
CREATE (:student)
  • 创建节点并分配属性
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
MERGE (a:people:student{name:'张三'}) set a.age='18' RETURN *
  • 在已有节点上添加新lable
MATCH (a{name:'张三'}) SET a:person RETURN a  //添加一个标签
MATCH (a{name:'张三'}) SET a:person:student RETURN a //添加一个标签

创建关系语句

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

查询库信息语句

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

查询数据语句

  • 查询(所有节点及其关系
MATCH (a)-[]-(b),(c) RETURN *
  • 查询(孤立节点,及无关系节点
MATCH (n) WHERE NOT (n)--() return n;
  • 查询(匹配结果集中如果有丢的部分,则会用null来补充
OPTIONAL MATCH (n)-[r]->(m) RETURN m
  • 查询(所有标签为 student 的节点
MATCH (a:student) RETURN *
  • 查询(多标签节点
MATCH (a:student{name:'李四'})-[r:test_graph]-(b) where not b:man return *
  • 查询(标签为 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
  • 查询(属性不为空
MATCH (a:student) WHERE a.age IS NOT NULL RETURN *
  • 查询(Coalesce
MATCH (a:student) RETURN coalesce(a.age?,a.name?)
  • 查询(条件 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
  • 查询(排序
MATCH (a:student) RETURN * ORDER BY a.age ASC
  • 查询(分页
MATCH (a:student) RETURN *  SKIP 1 LIMIT 2
  • 查询(计算 最大值、最小值、平均值、和、统计
//注意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

单索引语句

  • 创建单索引
//对name属性创建索引
CREATE INDEX ON :student(name)
//对name属性创建唯一索引
CREATE CONSTRAINT ON (n:student) ASSERT n.name IS UNIQUE
  • 查询单索引
:schema
  • 删除单索引
DROP INDEX ON :student(name)
DROP CONSTRAINT ON (n:student) ASSERT n.name IS UNIQUE

全文索引

请跳转下期博客: 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

你可能感兴趣的:(记录)