文章目录
博文配套视频课程:自然语言处理与知识图谱
Cypher介绍
一种声明式图数据库查询语言,具有丰富的表现力,能够高效的查询和更新图数据。声明式的查询语言,它具有丰富的表现力,能高效的查询和更新图数据。对于初学者而言Cypher相对简单,相比命令式的Java要简单的多,但是由于Cypher目前处于不断的更新和维护中,其本身的语言也会发生变化。
Neo4j模式 (Pattern)
模式和模式匹配是Cypher的核心,使用模式来描述所需数据的形状,通常使用小括号()表示节点,[] 表示关系和关系的类型,箭头表示关系的方向
- 标签模式:(u:User:Admin)
- 属性模式: (u:User{name:‘tom’})
- 关系模式:
-[role]-> // 关系名称
-[:ACTIVE_IN]-> // 关系类型
-[role:ACTIVE_IN]-> // 名称、类型、方向
-[role:ACTIVE_IN{key:value}]-> // 名称、类型、方向、属性
-[role:ACTIVE_IN*start..end]-> // 可变长关系
初始化数据
merge (n:User{name:'李四'});
merge (n:User{name:'王五'});
merge (n:User{name:'二麻子'});
merge (n:User{name:'孙七'});
merge (n:User{name:'张三'});
match(u1:User{name:'张三'}),(u2:User{name:'李四'}) create(u1)-[f:Friend]->(u2);
match(u1:User{name:'张三'}),(u2:User{name:'王五'}) create(u1)-[f:Friend]->(u2);
match(u1:User{name:'孙七'}),(u2:User{name:'王五'}) create(u1)<-[f:Friend]-(u2);
match(u1:User{name:'二麻子'}),(u2:User{name:'李四'}) create(u1)<-[f:Friend]-(u2);
match(u1:User{name:'张三'}),(u2:User{name:'李四'})create(u1)-[c:Colleague]->(u2);
match(u1:User{name:'李四'}),(u2:User{name:'孙七'})create(u1)-[c:Colleague]->(u2);
数据初始化结果如下:
几个重要的函数
- id:返回关系或者节点系统生成的 id (唯一)
- labels: 返回一个节点的所有标签(非唯一)
- type: 返回关系类型(唯一)
match(n)-[r]-(m) where length(n.name) >2 return n,id(n),type(r),labels(n)
基于Where数据过滤
约束查询者与被查询者
- 与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合:IN[]
- where不是独立语句,而是match,with的一部分,用于给模式添加约束或者过滤传递给with的中间结果
// 修改 -[]-> 试试
match (u:User)-[:Friend]-(f:User) where u.name in ['李四','张三','王五','孙七','二麻子'] and f.name=~'王.*' return u.name,f.name;
查询结果如下:
查询二度人脉
- 变长关系、| 都不能用于Create语句,因为关系在创建时只能有一个类型
- extract: 可以从节点或者关系列表中返回单个属性,它将遍历整个列表 (variable in list | expression )
match (u1)-[f:Friend|Colleague*2]->(u2) return u1.name,u2.name,f // f返回的是list不能用type
match (u1)-[f:Friend|Colleague*2]->(u2) return distinct u1.name,u2.name
match (u1)-[f:Friend|Colleague*2]->(u2) return u1.name,u2.name,extract(n in f | type(n))
按关系的类型进行过滤
match (u:User{name:'李四'})-[friend]-(f) where type(friend)=~'Fri.*' return u,type(friend),f
只查询为Friend的类型结果如下:
where中使用路径方向过滤
- 模式是返回一个路径表示,模式的局限性只能使用单条路径表达它,不能像MATCH语句中那样使用逗号分隔多条路径。但是可以直接通过AND,
- 注意是:and not (u)<–(other) 则代表取反
match (u:User{name:'李四'}),(other) where other.name in ['张三','二麻子'] and (u)<--(other) return u,other
属性存在性检查
- DELETE操作用于删除节点和关联关系、REMOVE操作用于删除标签和属性、添加或更新属性值(设置为NULL则为删除属性)
match (n:User) where n.name=~'张.*' set n.age = 23;
match (n) where exists(n.age) return n;
match (u:User) where u.age is not null return u;
match (u1:User{name:'张三'}) set u1.age = null; // set除了新增和更新属性之外还可以赋值null为删除属性