cypher 是neo4j声明式声明式查询语言,简称CQL。它遵循SQL语法,非常简单并且具有可读性的结构化格式。
类型 | 说明 |
---|---|
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)
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
MERGE (a:people:student{name:'张三'}) set a.age='18' RETURN *
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
CALL db.labels()
CALL db.relationshipTypes()
MATCH (n) RETURN count(n)
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') |
:server user add
删除数据 databases/graph.db