基于Linux系统的Neo4j 4.1社区版本的 Neo4j语法简单使用(二)

上一篇文章我们主要对Neo4j做了简单介绍以及安装部署,这一章主要是讲解Neo4j如何使用。

※ 概念
  Neo4j只要是用CQL作为查询语言,就像Oracle数据库一样使用SQL作为查询语言。CQL有几个关键名词:节点、关系、标签、属性
节点对应图上面一个个的小圈圈,它是一个实体。人名,车名,桌椅,一切都可以做成节点。节点的标签表明它归属于哪个节点类。
关系对应图上的线,它由三元组构成:(节点A,关系,节点B)。关系也有自己的标签,标签表明它归属于哪个关系类。
  标签就相当于SQL中表的概念,如果我们match某个标签,那返回的就是这个标签下所有的节点,跟我们用SQL去查某张表是一个道理。
既然标签就相当于表,如果它是表,就应该有自己的表字段,所以节点或者关系的属性值,就相当于表字段。
当你理解了CQL与SQL的概念对应关系之后,就可以玩起Neo4j了。

不同点:
  概念不一样。CQL一个节点对应到SQL就是一条记录,同样一条关系,对应到SQL也是一条记录。CQL的节点和关系都有标签,相当于是SQL中表的概念。一条记录可能存放在A表,也可能存放在B表。因此在CQL中,一个节点或者关系也都会有多个标签。标签有自己的属性,属性的名相当于SQL中的字段名,属性值相当于SQL中的字段的值
  关键词不一样。CQL中的return对应SQL中的select,关键词不一样都表示返回满足条件的记录。SQL中的关键词from后跟着表名表示查询的数据来源哪个表,到了CQL中变成match,match后跟着要查找的标签。
  语法顺序不一样。CQL的return,create,delete操作都是在最后,而SQL这些操作都是在前面。

相同点:
  语法通俗易懂。我们可以对比发现,不管是CQL还是SQL它们的写法都很简单,且人性化、可读性都很高。

※ 特殊符号说明
  () 表示节点
  {} 表示标签
  -[:]-> 表示关系

※ 特殊关键字说明
  CREATE,用于创建节点、关系、索引
  MATCH语句用指定的模式检索数据库
  WHERE在MATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。
  OPTINAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项用null代替。

※ 应用背景:
  为了能够更好的学习Neo4J语法,我们以电视剧【琅琊榜】的关系图数据为例,先模拟建立实体表(此次只为了方便记忆而已,跟Neo4j无关),再用CQL语法写入到Neo4j中

(一)人员基本信息表:
  姓名   身份证号码   性别
  梅长苏   A       男
   蒙挚    B       男
  蒙浅雪   C       女
  萧庭生   D       男
  萧平章   E       男
  萧景炎   F       男
  萧平旌   G       男
  黎老堂主   H       男
  林溪   I         女
(二)人员关系表:
  从节点   到节点   关系
  A       B     朋友
  A       D     师徒
  A       F     朋友
  B       C     孙女
  C       E     夫妻
  D       E     父子
  D       F     养父子
  D       G     父子
  D       H     朋友
  F       G     兄弟
  G       I     夫妻
(三)常规操作
创建节点

语法:CREATE ( <node-name>:<label-name> {
     <Property1-name>:<Property1-Value><Propertyn-name>:<Propertyn-Value>})
实例: CREATE(p:Person{
     name:'梅长苏',code:'A',sex:'男'}) 
     CREATE(p:Person{
     name:'蒙挚',code:'B',sex:'男'})
其他补充:
现有节点添加/修改 属性:MATCH  (p:Person{
     name:'梅长苏'}) set p.sex='未知 

创建关系

语法:
现有节点新关系:MATCH  (:),(:) CREATE ()-[:]->()
新节点新关系:CREATE(:{})-[:{}]->(:{})
实例: MATCH(p:Person{name:'梅长苏'}),(p1:Person{name:'蒙挚'}) CREATE(p)-[r:朋友]->(p1)

CREATE(p:Person{name:'萧庭生'})-[r:父子]->(p1:Person{name:'萧平章'})

查询

语法:MATCH (<node-name>:<label-name>)RETURN <node-name>.<property1-name>
实例: 
【普通查询】
查询整个图形数据库:match(n) return n;
查询Person类型的所有数据:match (p: Person) return p; 
查询名字等于【梅长苏】的人:
写法一:match (p: Person {
     name:'梅长苏'}) return p;
写法二:match (p:Person) where p.name='梅长苏' return p;
【关系查询】
查询【梅长苏】的朋友的名字:Match ( p1: Person {
     name:'梅长苏'} )-[r:朋友]->(p2) return p2.name 	
查询和【梅长苏】有关系的人:Match ( p1:Person {
     name: '梅长苏'}) -[r:朋友]-(p2:Person ) return p2
【层级查询】
查询第二层的节点:Match (start:Person {
     name:’梅长苏’})-[:gift*2..2]->(end:Person ) return end
查询第一层和第二层的节点:Match (start:Person {
     name:’梅长苏’})-[:gift*1..2]->(end:Person ) return end
按级次查询出所有直接或间接获得过小明的礼物的人:Match (start:Person {
     name:’梅长苏’})-[:gift*]->(end:Person ) return end
【其他查询】
查询标签(Person)中性别为男的一共有多少节点(人):
Match (n:Person) where  n.sex=return  count(n)
Match (n:Person{
     sex:’男’})  return  count(n)  
Match (n:Person)  return  count(n.sex=)
查询标签(Person)中的10个节点(人):Match (n:Person)  return  n  limit  10
查询标签(Person)中所有的不同的name :Match (n:Person)   return  distinct(n.name)
根据标签(Person)中的name 排序: 
Match(n:Person)   return  n  order by name    (默认升序)
	Match(n:Person)   return  n  order by name  asc   (升序)
	Match(n:Person)   return  n  order by name  desc  (降序)
判断节点是否存在 name这个属性:Match  (n)  where  exists(n.name)  return  n 
查询name以‘蒙’开头的节点:Match  (n)   where  n.name  starts  with ‘蒙’  return  n 
查询name以‘萧’结尾的节点:Match  (n)   where  n.name  ends   with ‘萧’  return  n
查询name中含有 ‘萧’的节点:Match  (n)  where  n.name  Contains  ‘萧’  return  n 

删除

语法:match (n) detach delete
实例: 
删除所有 :match (n) detach delete n 
删除指定节点:match (n:Person{
     name:'梅长苏'}) detach delete n
删除指定节点属性:  match (n:Person{
     name:'梅长苏'}) remove n.sex
删除指定关系:  match (a:Person {
     name:"梅长苏"})-[r:朋友]-(b:Person {
     name:"蒙挚"}) delete r

修改

修改关系名:
MATCH (n:Person {
     name:"林溪"})-[r:父子]->(m:Person {
     name:"萧平旌"})
CREATE (n)-[r2:夫妻]->(m)
SET r2 = r
WITH r
DELETE r

效果图:
基于Linux系统的Neo4j 4.1社区版本的 Neo4j语法简单使用(二)_第1张图片

你可能感兴趣的:(Neo4j,neo4j,.net,linux,大数据)