热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

neo4j筛选出子孙绵延四代的树干_Neo4j:基本的CQL

上一篇:Neo4j:简介与初体验Neo4j,作为一个存储图的数据库,与其他关系型、非关系型数据库一样,提供了很

上一篇:Neo4j:简介与初体验

9bd2be82b7f675a9388ac45a05e866b3.png

Neo4j,作为一个存储图的数据库,与其他关系型、非关系型数据库一样,提供了很简单易用的增删改查语句。

CQL,Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j用CQL作为查询语言。

作为CQL,它有如下特点:

1、它是Neo4j图形数据库查询语言

2、它是一声明性模式匹配语言(个人使用起来的感觉,像lambd表达式)

3、语法非常简单(个人感觉,语法能表现出很清晰的图结构)

我们启动Neo4j并登录Neo4j提供的UI界面(可以参考这个文章启动和登录Neo4j:简介与初体验 )。

本节,教大家如何使用最基本的CQL语言,完成最基本的增删改查。Neo4j常用的命令如下:

命令含义对比MySQL
create创建节点insert插入数据
match查询select
return返回数据
where条件查询where
delete删除关系、节点delete
order by排序order by

set

修改update

另外,由于Neo4j是Java开发的,所以支持Java的8大基本数据类型,再加一个String类型

数据类型说明
boolean 

布尔:true or false

byte用于表示8位整数
short用于表示16位整数
int

用于表示32位整数

long用于表示64位整数
float用于32位浮点数
double用于64位浮点数
char用于表示16位字符串
String用于表示字符串

Neo4j提供的Web UI界面使用起来很简单,界面如下:

0ad4879a08b8c00a66c75a88b2abbd4f.png

HelloWorld走起来~~

为了让大家尽快熟悉使用语法,我在这里分别用CQL和SQL对照着写。

创建节点:

基本语法:create (node:Label {属性1:属性值1,属性2:属性值2})

CQL:

create (u0:User {name:"张三",age:18}) create (u1:User {name:"李四",age:19}) return u0,u1

SQL:

create table user(name varchar(20),age int);insert into user (name,age) values("张三",18);

说明:和关系型数据库不同的是,Neo4j写入数据时,不需要先创建schema。上述CQL的含义是:在Label名是User的标签下创建两个节点,u0和u1,以及他们的属性name和age,并返回。

查询:

CQL:

match (u:User) return u;match (u:User) where u.age=18 return u;match (u:User {name:"张三"}) return u;match (u:User) where u.age = 18 return u.name;

SQL:

select * from User;select * from User where age=18;select * from User where name='张三';select name from user where age=18;

说明:这是最简单的条件查询,使用match、where和return关键字。从标签名为User的Label(从表名为User的表)中查数据。

创建关系:

和关系型数据库不同的是,Neo4j的node和node间是有关系的,我们可以把它理解成MySQL中的外键,但是还是有区别的哦。

match (u0:User {name:"张三"}),(u1:User {name:"李四"}) create (u0)-[r:friend]->(u1) return u0,r,u1

c117ec04a0eaaf0c17eb8e70b7a7f0a3.png

创建节点u0到节点u1的关系friend。如果多次执行上面的语句,两个节点可以创建多个关系

52d5cc45ae18850ff8cf01608d1f2619.png

当然也可以创建反向关系(注意两条CQL语句关系箭头的方向不同)。

match (u0:User {name:"张三"}),(u1:User {name:"李四"}) create (u0)-[r:friend]->(u1)return u0,r,u1match (u0:User {name:"张三"}),(u1:User {name:"李四"}) create (u0)<-[r:friend]-(u1)return u0,r,u1

b239716dac3e78a7b4918b6effff4c88.png

说明&#xff1a;有没有发现&#xff0c;CQL的语法和图的数据结构很类似&#xff0c;基本语法是&#xff1a;

match (node1),(node2) create node1-[r:relation]->node2

可以理解为&#xff0c;查出两个节点node1和node2&#xff0c;创建从node1到node2的关系r。

删除&#xff1a;

基本语法&#xff1a;

match (u:User) delete u;

通过match查询出结果集&#xff0c;然后delete u。

需要注意的是&#xff1a;

Neo4j节点与节点的关系&#xff0c;和MySQL两张表中数据的外键很相似&#xff0c;在MySQL中&#xff0c;如果两张表之间有外键关联&#xff0c;我们不能直接删除主键表的数据&#xff0c;需要先删除外键表的数据后才能删除主键表。所以Neo4j中&#xff0c;我们不能直接删除两个有relationship的节点&#xff0c;需要先删除他们的关系&#xff0c;再删除节点。如果我们直接删除有关系的两个节点&#xff0c;将会报如下的错&#xff1a;

3824415af96d7f08dca074b4d6669e21.png

所以我们需要先删除两个节点之间的关系。

match (u:User {name:"张三"})-[r:friend]->(u1:User {name:"李四"}) delete r

bd12a39879a34995bec8572fad8f2dd3.png

和上图对比&#xff0c;张三和李四有一个双向的关系&#xff0c;删除张三到李四的关系&#xff0c;只剩下李四到张三的关系&#xff0c;我们继续删除李四到张三的关系(注意箭头的指向)&#xff1a;

match (u:User {name:"张三"})<-[r:friend]-(u1:User {name:"李四"}) delete r

de7362c172098f741bf6f573560ec9f9.png

最后&#xff0c;我们才能删除节点

match (u:User) where u.name&#61;&#39;张三&#39; delete u;match (u:User) delete u;

和下面的SQL含义相同

delete from User where name&#61;&#39;张三&#39;delete from User;

排序&#xff1a;

match (u:User) return u.name,u.age order by u.age desc;match (u:User) return u.name,u.age order by u.age asc;

和下面的SQL含义相同&#xff1a;

select name,age from User order by age desc;select name,age from User order by age asc;

Set修改&#xff1a;

match (u:User {name:"张三"}) set u.name &#61; &#39;张三丰&#39; return u;match (u:User {name:"张三丰"}) set u.sex &#61; &#39;男&#39; return u.name,u.age,u.sex;

和下面的SQL含义相同&#xff1a;

update User set name&#61;&#39;张三丰&#39; where name&#61;&#39;张三&#39;;

最后返回的结果是&#xff1a;

88f9072e1ee4d05f0773399a2466cbe5.png

上面所列举的增删改查语句&#xff0c;是比较基本的。并且语法不止一种&#xff0c;CQL的语法比较随意。当然&#xff0c;还有其他的操作&#xff0c;比如remove&#xff0c;union等操作&#xff0c;在此处就不一一举例&#xff0c;大家可以查阅相关资料。

实战

我们以苏轼一大家子举例&#xff0c;首先创建苏轼一大家子节点&#xff1a;

create(suxun:Person_{name:"苏洵",age:80,sex:"男"})create(sushi:Person_{name:"苏轼",age:53,sex:"男"})create(suzhe:Person_{name:"苏辙",age:51,sex:"男"})create(suxiaomei:Person_{name:"苏小妹",age:45,sex:"女"})create(susun:Person_{name:"苏孙",age:29,sex:"男"})create(suxiaosun:Person_{name:"苏重孙",age:6,sex:"女"})

dbdf3abadf00788ffef8886d9e1309c0.png

根据上述排列&#xff0c;我们知道&#xff0c;苏洵是长辈&#xff0c;苏轼苏辙苏小妹属于同一辈份&#xff0c;苏孙是苏轼的儿子&#xff0c;苏重孙是苏轼的孙子。。。

然后我们创建关系&#xff1a;

match(p1:Person_),(p2:Person_)where p1.name&#61;"苏洵" and p2.name &#61; "苏轼"create (p1) -[parent:Parent{relation:"父亲"}]-> (p2); match(p1:Person_),(p2:Person_)where p1.name&#61;"苏洵" and p2.name &#61; "苏辙"create (p1) -[parent:Parent{relation:"父亲"}] -> (p2); match(p1:Person_),(p2:Person_)where p1.name&#61;"苏洵" and p2.name &#61; "苏小妹"create (p1) -[parent:Parent{relation:"父亲"}] -> (p2); match(p1:Person_),(p2:Person_)where p1.name&#61;"苏轼" and p2.name &#61; "苏孙"create (p1) -[parent:Parent{relation:"父亲"}] -> (p2); match(p1:Person_{name:"苏孙"}),(p2:Person_{name:"苏重孙"})create (p1) -[parent:Parent{relation:"父亲"}] -> (p2);

d6d293cef4b4461d30ae9ed825efe173.png

我们根据条件写出CQL语句&#xff1a;

1、筛选出子孙绵延四代的树干&#xff1a;

match(a)-[r1:Parent]->(b)-[r2:Parent]->(c)-[r3:Parent]->(d) return a, b, c, d

2c425aa9f92cf7c432779088b70d44b8.png

2、筛选出存在三代子孙的树干&#xff1a;

match(a)-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c

2c425aa9f92cf7c432779088b70d44b8.png

看起来是一根树干&#xff0c;其实有两组数据

bc8e29550ee561982d02fbfbb6f34f18.png

3、筛选出以某个节点为顶点的三代子孙树干&#xff1a;

match(a:Person_{name:"苏洵"})-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c

c68106644a3c1ef7a732c0334769ac20.png

好了&#xff0c;本次的分享就到这里&#xff0c;谢谢大家。




推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
好孩子_瑾马甲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有