快速掌握 Cypher 查询语言

Cypher是最广泛采用的、开放的、专门用于图数据库查询语言。它提供了一种直观和快速的方式来处理图数据。

本文包含一些常见的Cypher查询及其解释。如果你不确定如何编写Cypher查询时,可以查看此文备忘单。如果你是图形数据库和Cypher的新手,你也可以使用这篇文章来熟悉Cypher提供的功能。

Match

查询特定属性的节点

MATCH (c:City)
WHERE c.name = "London"
RETURN c.population_size;

-- 同等写法
MATCH (c:City {name: "London"})
RETURN c.population_size;
  • MATCH (c:City): MATCH 子句指定特定节点模式,标签为 City 并赋值给变量 c.
  • WHERE c.name = "London": WHERE子句过滤仅name属性为 London 的节点.
  • RETURN c.population_size: RETURN 返回查询结果.

查找节点及关系

MATCH (city:City)-[:IN]-(country:Country)
WHERE city.name = "London"
RETURN country.name;
  • MATCH (city:City)-[:IN]-(country:Country): MATCH 子句指定节点和关系模式,连接两个节点,标签分别为CityCountry, 连接类型为 IN.

匹配标签

仅查询标签为City的节点,两种写法结果一致。

MATCH (c:City)
RETURN c;

-- 同等写法
MATCH (c)
WHERE c:City
RETURN c;

匹配多个标签

查询同时属于多个标签的节点,Neo4j支持节点拥有多个标签,下面两种写法结果一致。

MATCH (c:City:Country)
RETURN c;

-- 同等写法

MATCH (c)
WHERE c:City AND c:Country
RETURN c;

使用属性范围查询节点

MATCH (c:City)
WHERE c.population_size >= 1000000 AND c.population_size <= 2000000
RETURN c;

Create

创建节点

CREATE (c:City {name: "Zagreb", population_size: 1000000});
  • c:City: 创建新的节点,标签为 City 并赋值给变量 c,如果不需要使用该变量,可以忽略。
  • {name: "Zagreb", population_size: 1000000}: 创建的节点包括两个属性,分别为字符串和整数.

创建带关系的节点

CREATE (c1:City {name: "UK"}),
       (c2:City {name: "London", population_size: 9000000})
       (c1)<-[r:IN]-(c2)
RETURN c1, c2, r;

CREATE子句用于创建两个新节点,以及两者之间的有向关系。

在已存在节点创建关系

MATCH (c1), (c2)
WHERE c1.name = "UK" AND c2.name = "London"
CREATE (c2)-[:IN]->(c1);

在两个已存在节点之间创建类型为IN的有向关系。如果关系已存在,则会导致关系重复,为了避免重复可以使用MERGE子句:

MATCH (c1), (c2)
WHERE c1.name = "UK" AND c2.name = "London"
MERGE (c2)-[:IN]->(c1);

Update

增加或更新节点属性

MATCH (c:Country {name: "UK"})
SET c.name = "United Kingdom";

如果使用set子句,属性不存在则创建该属性。

替换节点所有属性

MATCH (c:Country)
WHERE c.name = "United Kingdom"
SET c = {name: "UK", population_size: "66650000"};
  • SET c = {name: "UK" ...}: SET 子句将删除所有已存在属性并按照提供内容创建新属性.

更新多个属性值

MATCH (c:Country)
WHERE c.name = "United Kingdom"
SET c += {name: "UK", population_size: "66650000"};
  • SET c += {name: "UK" ...}: 这个SET 子句将增加新的属性,并更新已存在的属性.

检查属性存在并更新

MATCH (c:Country)
WHERE c.name = "Germany" AND c.language IS NULL
SET c.language = "German";

因为WHERE子句包含语句c.language IS NULL,所以只有当节点没有language属性时才会被匹配。

重命名属性

MATCH (c:Country)
WHERE c.official_language IS null
SET c.official_language = c.language
REMOVE c.language;
  • WHERE c.official_language IS null: 这里WHERE 子句确保仅匹配没有official_language属性的节点.
  • SET n.official_language = n.language: 虽然没有使用重命名命名,这里给新属性赋相同值.
  • REMOVE n.language: REMOVE 删除原来的属性.

Delete

删除节点

MATCH (c)-[r]-()
WHERE c.name = "US"
DELETE r, c;
  • DELETE r, c: 在删除节点之前,必须先删除它们的关系. 该查询也可以使用DETACH子句进行重写:
MATCH (c)
WHERE c.name = "US"
DETACH DELETE c;

删除属性

MATCH (c:Country)
WHERE c.name = "US" AND c.language IS NOT null
DELETE c.language;

该查询将从指定节点删除language属性.

删除节点标签

MATCH (c)
DELETE c:Country;

该查询将删除所有节点的Country的标签。

删除多个标签节点中的一个标签

MATCH (c)
WHERE c:Country:City
REMOVE c:City;

上面查询删除拥有Country、City两个标签节点中的City标签。

删除所有节点和关系

MATCH (n)
DETACH DELETE n;

该查询将删除整个数据库。

Constraint

创建唯一约束

CREATE CONSTRAINT ON (c:City)
ASSERT c.location IS UNIQUE;

该查询确保每个标签为City的节点属性location值唯一。

创建已存在约束

CREATE CONSTRAINT ON (c:City)
ASSERT exists (c.name);

该查询确保每个标签为City的节点有name属性。

查看约束

SHOW CONSTRAINT INFO;

查看数据库中所有激活约束。

删除唯一性约束

DROP CONSTRAINT ON (c:City)
ASSERT c.location IS UNIQUE;

删除指定的唯一性约束。

删除已存在性约束

DROP CONSTRAINT ON (c:City)
ASSERT exists (c.name);

删除只从的已存在性约束。

其他有用的查询

统计所有节点

MATCH (n)
RETURN count(n);

统计所有关系

MATCH ()-->()
RETURN count(*);

指定返回结果数量

MATCH (c:City)
RETURN c
LIMIT 5;
  • LIMIT 5: 限制返回结果为5条。

指定结果的别名

MATCH (c:Country)
WHERE c.name = "US"
RETURN c.population_size AS population

通过在RETURN子句中使用AS,属性population_size将带别名返回。

总结

本文介绍了Cypher查询语言的Match、创建、更新、删除以及约束语句,并分别给出示例进行说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值