03_Cypher之核心语法

在这里插入图片描述

博文配套视频课程:自然语言处理与知识图谱


Cypher介绍

一种声明式图数据库查询语言,具有丰富的表现力,能够高效的查询和更新图数据。声明式的查询语言,它具有丰富的表现力,能高效的查询和更新图数据。对于初学者而言Cypher相对简单,相比命令式的Java要简单的多,但是由于Cypher目前处于不断的更新和维护中,其本身的语言也会发生变化。

Neo4j模式 (Pattern)

模式和模式匹配是Cypher的核心,使用模式来描述所需数据的形状,通常使用小括号()表示节点,[] 表示关系和关系的类型,箭头表示关系的方向

  1. 标签模式:(u:User:Admin)
  2. 属性模式: (u:User{name:‘tom’})
  3. 关系模式:
-[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);

数据初始化结果如下:

在这里插入图片描述

几个重要的函数

  1. id:返回关系或者节点系统生成的 id (唯一)
  2. labels: 返回一个节点的所有标签(非唯一)
  3. type: 返回关系类型(唯一)
match(n)-[r]-(m) where length(n.name) >2 return n,id(n),type(r),labels(n)

基于Where数据过滤

约束查询者与被查询者

  1. 与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合:IN[]
  2. where不是独立语句,而是match,with的一部分,用于给模式添加约束或者过滤传递给with的中间结果
// 修改 -[]-> 试试
match (u:User)-[:Friend]-(f:User) where u.name in ['李四','张三','王五','孙七','二麻子'] and f.name=~'王.*' return u.name,f.name;

查询结果如下:
在这里插入图片描述

查询二度人脉

  1. 变长关系、| 都不能用于Create语句,因为关系在创建时只能有一个类型
  2. 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中使用路径方向过滤

  1. 模式是返回一个路径表示,模式的局限性只能使用单条路径表达它,不能像MATCH语句中那样使用逗号分隔多条路径。但是可以直接通过AND,
  2. 注意是:and not (u)<–(other) 则代表取反
match (u:User{name:'李四'}),(other) where other.name in ['张三','二麻子'] and (u)<--(other)  return u,other

在这里插入图片描述

属性存在性检查

  1. 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为删除属性

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值