Neo4j入门点滴(三):用Cypher完善图

简介:  在上一篇博文中,重点介绍的是Neo4j的读操作,在本文中则将聚焦于Neo4j的写操作,主要包括:创建节点和联系、转移节点和联系以及Cypher查询优化三大问题。一、创建节点和联系  节点和联系是构成Neo4j图数据库的主要元素,熟悉和掌握基本的节点和联系创建操作非常重要。

 在上一篇博文中,重点介绍的是Neo4j的读操作,在本文中则将聚焦于Neo4j的写操作,主要包括:创建节点和联系、转移节点和联系以及Cypher查询优化三大问题。

一、创建节点和联系
 节点和联系是构成Neo4j图数据库的主要元素,熟悉和掌握基本的节点和联系创建操作非常重要。

(一)操作节点
 Node乃Neo4j数据库中最核心的元素,其他元素或者连接于此或者对其进行补充定义或描述。首先,使用下列命令删除当前数据库中的全部已有内容,然后从无到有,一点一滴地学习:
  1. match (n)-[r]-(n1)
  2. delete n,r,n1;
  3. match (n)
  4. delete n;
  好了,现在正式开始。

(1)单节点
 可以使用create (n); 或者create ();或者 create (n) return n;三种方式中的任意一种来创建一个节点。如果仅仅是为了创建一个节点而没有对该节点更进一步的操作,那么就可以省略自定义变量n而使用空括号()。同样,如果不需要返回结果,那么连return从句也是不必要的。
 重要的是,Neo4j为每一个节点都分配了一个唯一的ID用作标识。然而,这些ID实际上是Neo4j内部的,而且可以随Neo4j安装或版本的不同而变化,因此强烈建议不要在构建用户定义逻辑中使用节点ID,通俗而言就是用户的代码实现尽量不要使用ID。但是,话又说回来了,并不是根本不能用,比如:
  1. match (n)
  2. return ID(n)
  不过,和其他属性不同,没有n.id或n.ID的用法,只能使用id()该函数来提取ID。如:


(2)多节点
  多节点的创建,就是多个元素的并列,如:create (n), (n1)或者create (), ()等。那么,有意思的是,如果create (n), (n)连续两个相同的n,会发生什么样的结果呢?答:结果会报错,系统提示因为已经创建了第一个节点n了,不能重复创建。如图所示:


(3)带标签的节点
  Neo4j使用标签实现对相似节点的分组和分类,而且标签还可以用来创建索引(index)从而有助于优化对节点的查询。创建有标签的节点,就是将冒号开始的标签写入即可。学以致用,一口气新建两个带标签而且是多标签的Nodes
  1. create (n:MAEL:BOY:STUDENT), (n1:FEMAEL:TEACHER)
  2. return n, n1
  多说一句,和C语言的命名规则一样:“数字字母下划线,首字母不能为数字 ”,在Neo4j中同样起作用。输入:123这样的标签会报错,而输入:a123或者_123则不会。

(4)带属性的节点
  正如本系列入门点滴的第一篇博文所言,使用属性的实现方式是键值对(key-value pairs),如:
  1. create (n:MALE{name:"haha", age:20})
  2. return n
  更进一步,属性值既可以是某一个值,也可以是一个数组。虽然NULL并不是一个合法的属性值,但却可以在未定义key的情况下被处理。先了解一下Neo4j属性的数据类型吧,很丰富:

  那么,试试创建一个带有字符串数组的属性:

  然后,我又创建了一个:create (x:MALE{city_beento:['北京', '孟菲斯']}) return x。这下有意思了,试着搜索一下:

 结果是这样:
 match (n{city_beento:['北京']}) return n, 命中零个
 match (n{city_beento:['北京','孟菲斯']}) return n, 命中
 match (n{city_beento:['北京','孟菲斯','芝加哥']}) return n, 命中一个
 match (n{city_beento:['北京',*]}) return n, 语句报错
 match (n{city_beento:[]}) return n, 命中零个
 所以,方括号中的属性值实际上是作为一个整体出现的,直接匹配属性只能精确命中。当然,如果需要模糊匹配,那么就可以在where从句中使用in来灵活实现:
  1. match (n)
  2. where '北京' in n.city_beento
  3. return n


(二)操作联系
  联系是Neo4j图中另一个核心的元素,对于任何节点或属性而言,只有与其他节点相连时方能体现其重要性。
1)单联系
  单向联系使用有向箭头->或
  1. create (n:MALE{name:'Kevin'})-[r:FATHER]->(n:MALE{name:'Leo'})
  2. or
  3. create (n:MALE{name:'Kevin'})-[r:FATHER]->(n1:MALE{name:'Leo'}) return n,r,n1
  实际上,上述例子是我从书中改的,但很遗憾, 第一句是错误的,决不能再使用 n,不论是否有return从句 。第二句才是正确的。而且,我要说明一下,例子中的:FATHER其实是一个标签形式,但书上说这是联系的名字。但我比较发现,这就是标签,如下图所示:


2)多联系
  多联系 就是一口气多写点:
  1. create (n1)-[r1:friend]->(n2)-[r2:friend]->(n3),(n2)-[r3:friend]->(n4) return n1,r1,n2,r2,n3,r3,n4
  结果如下图所示:

  
3)带有属性的联系
 没什么特别的 ,只是在联系中添加属性而已,和节点一样,如下图


(三 具有和联系的全路径
  也没什么特别 ,全路径就是把create语句全部保存到一个变量中,上例可以重写为:
  1. create k = (n1)-[r1:friend{location:'China'}]->(n2) return k

(四)创建唯一的节点和联系
  刚才创建的节点和联系或多或少有些盲目,有可能引起和给定图中已存在的节点或其属性相 所幸Neo4j提供了create unique语句,这个语句放在 m a t c h c r e a t e这里 对于match上的东东会新建缺省元素。这个语句使得我们可以没有重复地实现对给定进行 小程度
  1. match (n)
  2. where id(n) = 52
  3. create unique (n)
  4. return n,r,n1,n2
  其实已经存在节点n了,这时候对n做了n3节点的扩充链接,n节点就不会重复创建, 结果如图:

  在这个例子中,我同时对n节点的属性也进行 了更新,代码: create unique (n{name:' n1'})创建就是创建,更新已有的就需要另一个语句了:set!

(五)Create Unique和Merge
  尽管之前的博文已经提到了merge从句,但现如今还是要再来个quick recap。Merge语句出现在Match和Create的组合中,用于搜寻目标节点、属性、标签或联系。如果目标已经存在,那么直接PASS,否则就直接创建目标对象。与Create Unique类似,Match+Merge+Create也避免出现元素重复,然而二者并不是一样的,差别就在于:Create Unique部分匹配就可以,而Merge则只有整个pattern都匹配才创建,否则什么也不做。
 Merge语句实际上后跟on match和on create两个子句,pattern匹配则走on match,不匹配则走on create分支。与Create Unique不同,Merge能够创建索引和标签,甚至被用于创建单节点。上例子,先创建三个节点及其联系:
  1. create (f1:FEMALE{name:"Sheena"}),(m:MALE{name:"Oliver"}),(f2:FEMALE{name:"Sally"}),(f1)-[r:FRIEND]->(m)-[r1:FRIEND]->(f2)
  2. return f1,r,m,r1,f2
  结果如图所示:

  接下来,使用Merge匹配已存在的元素并新建其他元素:
  1. match (f1:FEMALE{name:"Sheena"}),(m:MALE{name:"Oliver"}),(f2:FEMALE{name:"Sally"})
  2. merge (f1)-[r:FRIEND]->(m)-[r1:FRIEND]->(f2)-[r2:FRIEND]->(f1)
  3. return f1,r,m,r1,f2,r2
  结果很震撼,并没有去重,而是将联系全部重建一遍:

  看来,merge本身并不能直接避免重复,起码在当前这个版本下!使用的时候一定要注意。

(六)使用限定条件
  Neo4j在version2后引入了对标签进行限定的概念。截止目前为止,Unique限定能用,但将来会有更多的。
 通过如下方式可以对MALE标签生成一个Unique限定:
  1. create constraint on (n:MALE) assert n.name is unique
  由此,可以确保name属性是唯一的,比如再创建一个相同名字的节点与之相连:
  1. match (n:MALE{name:'Oliver'})
  2. create (n1:MALE{name:'Oliver'})-[r:FREIND]->(n)
  3. return n1,r,n
  便会提示,不能新建因为有标签MALE的一个节点其姓名已经是Oliver了,如图:

  这个安全功能,很实用!若想删除之前加上的限定条件,则需要使用drop:
  1. drop constraint on (n:MALE) assert n.name is unique
  Constraint也可以配合Merge使用,如果发现节点已存在,直接返回而不会重复创建。但是我测试了一下,并没有发现被拒,这个Merge问题仍然有待于后续再次深入探索。

二、修改节点和联系
  主要讨论如何更新标签、属性和联系。

(一)更改节点属性
  具体方式就是借助Match匹配节点,然后通过Set更改值。如:
  1. match (n:FEMALE {name:"Sheena"})
  2. set n.surname = "Foster"
  3. return f
  增加和修改可以使用上述方法,但删除属性就不止一种方法了,一共两种,一是使用set将对应属性设置为NULL,二是使用remove,如下:
  1. match (n{name:'Sheena'}) set n.middlename = NULL return n
  The other way is:
  1. match (n{name:'Sheena'})
  2. remove n.surname
  3. return n

(二)更改标签
  和之前更改属性相似,也是使用set和remove进行操作,但是不同的是没有set :XXX = NULL的写法。看例子就好:
  1. match (n{name:'Sheena'})
  2. set n:GOODMAN:BADMAN
  3. return n
  如下图,当然写几个标签都可以:

  然后把BADMAN标签去掉,然后再加入一个新的标签:
  1. match (n{name:'Sheena'})
  2. remove n:BADMAN
  3. set n:GOODGOODMAN
  4. return n
  最后需要说明一点:对于用相同名字替换已有标签的操作不会有任何实质性的操作发生。

(三)更改联系
  与属性和标签不同,并没有更改联系的语法词。唯一的方法就是首先移除这些联系,然后创建新联系。比如:如果Sheena和Oliver不再是朋友关系,那么匹配二者的联系并且删除这个联系即可。
  1. match (n{name:'Sheena'})-[r:FRIEND]-(n1{name:"Oliver"})
  2. delete r
  3. return n,n1
  结果如下图所示:



                                               五岳之巅
                                   2017年5月25日(孟菲斯时间)
                                                  18:05
                                             终稿于Dorsey



相关文章
|
2月前
|
机器学习/深度学习 算法 数据库
深入浅出:利用Python与机器学习优化数据库性能
本文介绍了一种创新的方法,结合Python编程语言和机器学习技术,来优化数据库性能。传统的数据库性能优化方法往往依赖于数据库管理员(DBA)的经验和直觉,而本文所提出的方法通过自动化的方式,利用机器学习模型对数据库查询进行分析和优化,从而实现更高效、更智能的数据库性能管理。本文首先介绍了使用Python进行数据库操作的基础知识,然后详细阐述了如何应用机器学习算法来预测和改善数据库查询性能,最后通过一个实际案例展示了该方法的有效性。本文旨在为数据库管理员、开发者以及对数据库性能优化感兴趣的读者提供一种全新的视角和工具。
|
2月前
|
算法
【SPSS】列联表分析详细操作教程(附案例实战)
【SPSS】列联表分析详细操作教程(附案例实战)
358 0
|
2月前
|
安全
【SPSS】多选项分析详细操作教程(附案例实战)
【SPSS】多选项分析详细操作教程(附案例实战)
155 0
|
7月前
|
存储 自然语言处理 NoSQL
Text2Cypher:大语言模型驱动的图查询生成
本文的主题是我们认为这个 LLM+ 领域最唾手可得、最容易摘取的果实,Text2Cypher:自然语言生成图查询。输入自然语言,生成相对应的图查询语句,甚至可以直接返回该语句执行结果。
238 0
|
3月前
|
JSON 数据可视化 OLAP
TuGraph Analytics交互式图查询:让图所见即所得
TuGraph Analytics提供了OLAP图分析能力,实现图上的交互式查询,用户在构图并导入数据之后,可以通过输入GQL语句对图查询分析,并以可视化的方式直观地展示点边结果。
TuGraph Analytics交互式图查询:让图所见即所得
|
7月前
|
算法 图计算
TuGraph Analytics图计算快速上手之K-core算法
K-Core算法是一种用来在图中找出符合指定核心度的紧密关联的子图结构,在K-Core的结果子图中,每个顶点至少具有k的度数,且所有顶点都至少与该子图中的 k 个其他节点相连。K-Core通常用来对一个图进行子图划分,通过去除不重要的顶点,将符合逾期的子图暴露出来进行进一步分析。K-Core图算法常用来识别和提取图中的紧密连通群组,因具有较低的时间复杂度(线性)及较好的直观可解释性,广泛应用于金融风控、社交网络和生物学等研究领域。
|
11月前
|
机器学习/深度学习 SQL 数据库
NEO4J的入门和一些简单的操作
> 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 "https://juejin.cn/post/7147654075599978532") # 引言 今天我们继续学习NEO4J. # 创建 创建语句我们一般会使用create指令 我们首先在控制台上输入`neo4j.bat console`启动neo4j 然后打开你的浏览器,然后在浏览器地址栏中输入 `http://localhost:7687 - Neo4j Browser](http:
|
存储 NoSQL
使用Neo4j进行关系挖掘实践
基于企业和老板的关系数据,使用Neo4j进行关系挖掘实践
使用Neo4j进行关系挖掘实践
|
NoSQL Python
Python编程:py2neo操作neo4j图数据库
Python编程:py2neo操作neo4j图数据库
268 0
|
机器学习/深度学习 算法 数据挖掘
初识机器学习_你需要知道的基本概念罗列_以PY为工具
初识机器学习_你需要知道的基本概念罗列_以PY为工具
906 0
初识机器学习_你需要知道的基本概念罗列_以PY为工具