当前位置:   article > 正文

03_Cypher之核心语法_自然语言转成cypher

自然语言转成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]->  // 可变长关系
  • 1
  • 2
  • 3
  • 4
  • 5

初始化数据

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

数据初始化结果如下:

在这里插入图片描述

几个重要的函数

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

基于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
  • 2

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

查询二度人脉

  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))
  • 1
  • 2
  • 3

按关系的类型进行过滤

match (u:User{name:'李四'})-[friend]-(f) where type(friend)=~'Fri.*' return u,type(friend),f
  • 1

只查询为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

在这里插入图片描述

属性存在性检查

  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为删除属性
  • 1
  • 2
  • 3
  • 4

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/941705
推荐阅读
相关标签
  

闽ICP备14008679号