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 子句指定节点和关系模式,连接两个节点,标签分别为City
和Country
, 连接类型为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、创建、更新、删除以及约束语句,并分别给出示例进行说明。