1、基础概念
图数据库是用来存储图结构的,对于一个图来说,最重要的元素当然是点和边。这两者分别对应着图数据库中最重要的两个实体,节点和关系。除此之外,想要学习图数据库,还必须了解图数据库中的一些基本概念:
实体(entity)
每个实体有且仅有一个唯一标识(id)
每个实体可以有零个或多个属性(property)
实体包括节点,对应图结构中的点,每个节点可以有零个或多个标签(label)
实体包括关系,对应图结构中的边,每个关系有且仅有一个关系类型(relationship type)
属性(property)
一个键值对,每个实体可以有零个或多个属性
属性值既可以是标量类型,也可以是组合类型
标记(token)
非空字符串,用于表示属性键、标签、关系类型
属性键:在一个节点或关系中,属性键是唯一的
标签:用于对节点分组,每个节点可以有零个或多个标签,有相同标签的节点属于同一组
关系类型:每个关系有且仅有一个关系类型,不同关系可以有相同的关系类型
路径(path):由开始节点到结束节点之间的实体构成的有序集合
2、基本语法
cypher语句的基本语法。和关系数据库一样,也会有关键字,常用关键字如下:
关键字 | 具体作用 |
---|---|
MATCH | 查询 |
WHERE | 匹配 |
RETURN | 返回 |
CREATE | 创建节点和关系 |
DELETE | 删除节点和关系 |
SET | 修改节点标签,修改节点和关系的属性 |
REMOVE | 删除节点标签,删除节点和关系的属性 |
2.1 变量
变量用于对搜索模式进行命名,以便于在后续查询中进行引用。在一个查询中,变量并不是必须的,如果无需进行引用,那么就不需要有变量。如下面的n就是变量。
MATCH (n)
RETURN n;
2.2 创建节点
现在创建一个Person节点,节点类型是Person,有一个name属性,属性值 Jack
// 创建一个带标签带属性的节点
CREATE (n:Person{name:'Jack'})
RETURN n;
把上面的cypher数据,输入交互界面,然后点击执行,如下:
2.3 查询节点
// 查询所有节点
MATCH (n)
RETURN n;
其他语句,可以一一尝试,如下:
// 查询所有节点的唯一标识
MATCH (n)
RETURN id(n);
// 查询带标签的节点
MATCH (n:Person)
RETURN n;
// 查询带属性的节点
MATCH (n{name:'Jack'})
RETURN n;
// 查询带标签带属性的节点
MATCH (n:Person{name:'Jack'})
RETURN n;
2.4 关系
在 Cypher 中,关系用中括号表示,其中 Variable 是变量,便于后续对关系进行引用
RelationshipType 是关系类型,Key:Value 是关系属性,属性之间用逗号隔开
关系表示两个节点之间的有向连接,其中 StartNode 是开始节点,EndNode 是结束节点。
创建节点,再创建关系
//先创建对应节点
CREATE (n:Person{name:'Alice'})
RETURN n;
CREATE (n:Person{name:'Bob'})
RETURN n;
// 创建不带属性的关系
MATCH (m:Person),(n:Person)
WHERE m.name='Alice' AND n.name='Bob'
CREATE (m)-[r:Friend]->(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;
我们执行第一句,可以看到返回的关系r的各种属性
2.5 删除节点
// 删除所有节点,注意这条语句只能删除没有关系连接的节点
MATCH (n)
DELETE n;
// 删除所有关系
MATCH ()-[r]-()
DELETE r;
//删除特定节点,name为Jack的就节点
MATCH (m:Person{name:'Jack'}) detach delete m;
执行最后一条,可以看到删除节点成功:
2.6 修改节点
// 修改节点属性,有则修改,无则增加
MATCH (n)
WHERE id(n) = 2
SET n.name = "Jack2"
RETURN n;
// 删除节点属性
MATCH (n)
WHERE id(n) = 2
REMOVE n.name
RETURN n;
// 修改节点标签,有则修改,无则增加
MATCH (n)
WHERE id(n) = 2
SET n:Person
RETURN n;
// 删除节点标签
MATCH (n)
WHERE id(n) = 2
REMOVE n:Person
RETURN n;
// 修改关系属性,有则修改,无则增加
MATCH (m)-[r]->(n)
WHERE id(m) = 1 AND id(n) = 2
SET r.year = 10
RETURN r;
// 删除关系属性
MATCH (m)-[r]->(n)
WHERE id(m) = 1 AND id(n) =2
REMOVE r.year
RETURN r;
//根据属性增加其他属性
MATCH (n)
WHERE n.name='Alice'
SET n.age= 28
RETURN n;
执行最后一条,我们可以看到,节点增加了age属性。
2.7 其他高级查询语句
根据路径,或者模糊路径长度,去查询对应节点和属性。
// 匹配任意长度的路径
MATCH (m)-[r*]->(n)
RETURN m, r, n;
// 匹配路径长度等于 3 的路径
MATCH (m)-[r*3]->(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;
如有帮助,请帮忙点赞+关注+收藏,非常感谢
如有任何问题,请私聊。