Neo4j学习笔记(二) 查询语言

大家好,我是半虹

这篇文章主要讲解 Neo4j 查询语言 Cypher


0、连接终端

正如关系型数据库使用 SQL 管理数据,图数据库 Neo4j 使用 Cypher 完成对数据的增删改查操作

对于 Neo4j 而言,既可以在图形化交互界面执行 Cypher,又可以在命令行交互终端执行 Cypher


两者的不同仅仅在于交互方式的不同,执行 Cypher 的方式和效果是完全一样的

打开图形化交互界面的方法非常简单,只需在浏览器打开预先设置好的地址即可

打开命令行交互终端的方法也很简单,只需运行 bin 目录下的 cypher-shell 工具即可


1、基本概念

图数据库是用来存储图结构的,对于一个图来说,最重要的元素当然是点和边

这两者分别对应着图数据库中最重要的两个实体,节点和关系

除此之外,想要学习图数据库,还必须了解图数据库中的一些基本概念

  • 实体(entity)
    • 每个实体有且仅有一个唯一标识(id)
    • 每个实体可以有零个或多个属性(property)
    • 实体包括节点,对应图结构中的点,每个节点可以有零个或多个标签(label)
    • 实体包括关系,对应图结构中的边,每个关系有且仅有一个关系类型(relationship type)
  • 属性(property)
    • 一个键值对,每个实体可以有零个或多个属性
    • 属性值既可以是标量类型,也可以是组合类型
  • 标记(token)
    • 非空字符串,用于表示属性键、标签、关系类型
    • 属性键:在一个节点或关系中,属性键是唯一的
    • 标签:用于对节点分组,每个节点可以有零个或多个标签,有相同标签的节点属于同一组
    • 关系类型:每个关系有且仅有一个关系类型,不同关系可以有相同的关系类型
  • 路径(path)
    • 由开始节点到结束节点之间的实体构成的有序集合

2、基本语法

正如 SQL 定义关键字表示不同的操作,Cypher 也有定义关键字,这些关键字不区分大小写

由于篇幅原因,这里只介绍比较常用的几个,更高级的操作可以等后面需要的时候再去了解

关键字作用
MATCH查询
WHERE匹配
RETURN返回
CREATE创建节点和关系
DELETE删除节点和关系
SET修改节点标签,修改节点和关系的属性
REMOVE删除节点标签,删除节点和关系的属性

此外 Cypher 也有定义函数,这些函数作用多样,比如用于获取节点或关系的属性等等

这里介绍一些常用的函数,如果需要了解其它的函数,可以在官网上找到更详细的文档

查询函数作用
id()返回节点或关系的唯一标识
labels()返回节点标签
type()返回关系类型
keys()返回节点或关系的属性键
properties()返回节点或关系的属性

好了,介绍完基本语法后,下面开始进入实战


(0)变量(variable)

变量用于对搜索模式进行命名,以便于在后续查询中进行引用

在一个查询中,变量并不是必须的,如果无需进行引用,那么就不需要有变量

MATCH (n)
RETURN n;

这是最简单的一条语句,其作用是查询图数据库中的所有节点并返回


(1)节点(node)

在 Cypher 中,节点用小括号表示,其中 Variable 是变量,便于后续对节点进行引用

Label 是节点标签,标签之间用冒号隔开,Key:Value 是节点属性,属性之间用逗号隔开

(Variable:Label1:Label2:...{Key1:Value1,Key2:Value2,...})

创建节点

// 创建一个普通节点
CREATE (n)
RETURN n;
// 创建一个带标签的节点
CREATE (n:Person)
RETURN n;
// 创建一个带属性的节点
CREATE (n{name:'Alice'})
RETURN n;
// 创建一个带标签带属性的节点
CREATE (n:Person{name:'Alice'})
RETURN n;

查询节点

// 查询所有节点
MATCH (n)
RETURN n;

// 查询所有节点的唯一标识
MATCH (n)
RETURN id(n);
// 查询带标签的节点
MATCH (n:Person)
RETURN n;

// 等价于
MATCH (n)
WHERE n:Person
RETURN n;
// 查询带属性的节点
MATCH (n{name:'Alice'})
RETURN n;

// 等价于
MATCH (n)
WHERE n.name = 'Alice'
RETURN n;
// 查询带标签带属性的节点
MATCH (n:Person{name:'Alice'})
RETURN n;

// 等价于
MATCH (n)
WHERE n:Person AND n.name = 'Alice'
RETURN n;

(2)关系(relationship)

在 Cypher 中,关系用中括号表示,其中 Variable 是变量,便于后续对关系进行引用

RelationshipType 是关系类型,Key:Value 是关系属性,属性之间用逗号隔开

关系表示两个节点之间的有向连接,其中 StartNode 是开始节点,EndNode 是结束节点

StartNode-[Variable:RelationshipType{Key1:Value1,Key2:Value2,...}]->EndNode

创建关系

// 创建不带属性的关系
MATCH (m:Person),(n:Person)
WHERE m.name='Alice' AND n.name='Bob'
CREATE (m)-[r:Friend]->(n)
RETURN r;
// 创建带有属性的关系
MATCH (m:Person),(n:Person)
WHERE m.name='Alice' AND n.name='Bob'
CREATE (m)-[r:Friend{year:100}]->(n)
RETURN r;

查询关系,分为三种,-- 表示无向关系,--><-- 表示有向关系

// 查询不带类型不带属性的无向关系
MATCH (m:Person{name:'Alice'})-[r]-(n:Person{name:'Bob'})
RETURN r;

// 查询带有类型不带属性的无向关系
MATCH (m:Person{name:'Alice'})-[r:Friend]-(n:Person{name:'Bob'})
RETURN properties(r);

// 查询不带类型带有属性的无向关系
MATCH (m:Person{name:'Alice'})-[r{year:100}]-(n:Person{name:'Bob'})
RETURN type(r);

// 查询带有类型带有属性的无向关系
MATCH (m:Person{name:'Alice'})-[r:Friend{year:100}]-(n:Person{name:'Bob'})
RETURN m, r, n;
// 查询不带类型不带属性的有向关系
MATCH (m:Person{name:'Alice'})-[r]->(n:Person{name:'Bob'})
RETURN r;

// 等价于
MATCH (n:Person{name:'Bob'})<-[r]-(m:Person{name:'Alice'})
RETURN r;
// 查询特定关系类型的关联节点
MATCH (m:Person{name:'Alice'})-[r:Friend]->(n)
RETURN n;

// 查询多种关系类型的关联节点,只需匹配一个就算匹配成功
MATCH (m:Person{name:'Alice'})-[r:Friend|:Know]->(n)
RETURN n;

// 查询匹配多种关系的关联节点
MATCH (m:Person{name:'Alice'})-[:Friend]->(x)<-[:Friend]-(n:Person{name:'Bob'})
RETURN x;

(3)路径(path)

变长路径

// 匹配任意长度的路径
MATCH (m)-[r*]->(n)
RETURN m, r, n;
// 匹配路径长度等于 3 的路径
MATCH (m)-[r*3]->(n)
RETURN m, r, n;
// 匹配路径长度大于等于 2 的路径
MATCH (m)-[r*2..]->(n)
RETURN m, r, n;
// 匹配路径长度小于等于 5 的路径
MATCH (m)-[r*..5]->(n)
RETURN m, r, n;
// 匹配路径长度大于等于 2 且小于等于 5 的路径
MATCH (m)-[r*2..5]->(n)
RETURN m, r, n;

路径变量

// 用路径变量进行引用
MATCH p=(m)-[r*]->(n)
RETURN p;

(4)删除节点和关系

// 删除所有节点,注意这条语句只能删除没有关系连接的节点
MATCH (n)
DELETE n;
// 删除所有关系
MATCH ()-[r]-()
DELETE r;

(5)修改节点和关系

// 修改节点属性,有则修改,无则增加
MATCH (n)
WHERE id(n) = 7
SET n.name = "Jack"
RETURN n;

// 删除节点属性
MATCH (n)
WHERE id(n) = 7
REMOVE n.name
RETURN n;
// 修改节点标签,有则修改,无则增加
MATCH (n)
WHERE id(n) = 7
SET n:Person
RETURN n;

// 删除节点标签
MATCH (n)
WHERE id(n) = 7
REMOVE n:Person
RETURN n;
// 修改关系属性,有则修改,无则增加
MATCH (m)-[r]->(n)
WHERE id(m) = 13 AND id(n) = 14
SET r.year = 10
RETURN r;

// 删除关系属性
MATCH (m)-[r]->(n)
WHERE id(m) = 13 AND id(n) = 14
REMOVE r.year
RETURN r;
  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值