介绍
Cypher 是属性图数据库的最广泛采用,完全指定和打开查询语言。它提供了一种与属性图一起使用的直观和快速的方式。
本文包含一些最有用和最常见的Cypher查询及其解释。每当您不确定如何编写Cypher查询时,都可以查看此备忘单,然后重试。如果您是Graph数据库和Cypher的新手,也可以使用此帖子来了解Cypher和Memgraph提供的一些功能。
1.匹配
找到具有特定属性的节点
MATCH (c:City)
WHERE c.name = "London"
RETURN c.population_size;
-
MATCH (c:City)
:匹配子句指定标签的节点模式City
并将匹配分配给变量c
。 -
WHERE c.name = "London"
:Where子句将匹配的结果过滤到 具有价值伦敦的name
属性的人 -
RETURN c.population_size
:返回子句用于请求特定 结果。
可以在没有一个子句的情况下重写此查询以实现相同的结果。
MATCH (c:City {name: "London"})
RETURN c.population_size;
找到具有特定关系的节点
MATCH (city:City)-[:IN]-(country:Country)
WHERE city.name = "London"
RETURN country.name;
-
MATCH (city:City)-[:IN]-(country:Country)
:匹配条款指定节点 与两个连接节点的关系模式,标记为City
和Country
,通过类型IN
的关系连接。
比赛标签
MATCH (c:City)
RETURN c;
可以使用Where子句重写此查询以实现相同的结果。
MATCH (c)
WHERE c:City
RETURN c;
匹配多个标签
MATCH (c:City:Country)
RETURN c;
可以使用Where子句重写此查询以实现相同的结果。
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;
2.创建
创建一个节点
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;
创建子句用于创建两个新节点及其之间的定向关系。
在现有节点之间建立关系
MATCH (c1), (c2)
WHERE c1.name = "UK" AND c2.name = "London"
CREATE (c2)-[:IN]->(c1);
这将在两个现有节点之间建立IN
类型的定向关系。如果已经存在这种关系,则此查询将导致重复。为避免这种情况,您可以使用合并条款:
MATCH (c1), (c2)
WHERE c1.name = "UK" AND c2.name = "London"
MERGE (c2)-[:IN]->(c1);
3.更新
添加或更新节点属性
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" ...}
:此集合子句将删除所有现有属性并创建新指定的属性。
更新多个节点属性
MATCH (c:Country)
WHERE c.name = "United Kingdom"
SET c += {name: "UK", population_size: "66650000"};
-
SET c += {name: "UK" ...}
:此集合子句将添加新属性,并在现有的属性中更新现有属性。
检查属性是否存在并进行更新
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子句确保您仅在没有具有相同名称的属性的节点中创建新属性。 -
SET n.official_language = n.language
:从技术上讲,您不是重命名属性,而是创建具有不同名称和相同价值的新属性。 -
REMOVE n.language
:删除子句用于删除旧属性。
4.删除
删除节点
MATCH (c)-[r]-()
WHERE c.name = "US"
DELETE r, c;
-
DELETE r, c
:在删除节点之前,必须先删除其所有关系。
可以用分离子句重写此查询以达到相同的结果。
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;
此查询将删除整个数据库。
5.约束
创建独特的约束
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);
此查询将删除指定的存在约束。
6.图算法
要了解有关MEMGRAPH中内置算法的更多信息,请查看reference guide。
广度首次搜索
MATCH (c1:City {name: "London"})-[
edge_list:ROAD_TO *bfs..10
]-(c2:City {name: "Paris"})
RETURN *;
此查询将在节点c1
和c2
之间找到最高10的所有长度路径。
加权最短路径
MATCH (c1:City {name: "London"})-[
edge_list:ROAD_TO *wShortest 10 (e, n | e.weight) total_weight
]-(c2:City {name: "Paris"})
RETURN *;
上面的查询将在节点c1
和c2
之间找到最短的长度路径。长度限制参数是可选的。
7. NetworkX
如果您想知道MEMGRAPH中有哪种NetworkX算法,请查看reference guide。
分析整个图
CALL graph_analyzer.analyze() WITH YIELD *;
此查询将返回各种信息,例如节点的数量,边缘数量,平均度等等
查找弱连接的组件(联合发现)
MATCH (n)-[e]->()
WITH collect(n) AS nodes, collect(e) AS edges
CALL wcc.get_components(nodes, edges) YIELD *
RETURN n_components, components;
此查询将搜索整个图的弱连接组件。
计算所有节点的Pagerank
CALL nxalg.pagerank() YIELD *
RETURN node.name AS name, rank
ORDER BY rank DESC
LIMIT 10;
此查询将计算每个节点的等级,从最高到最低点订购它们,然后返回前10个结果。
8.其他有用的Cypher查询
计算所有节点
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
通过将AS
与返回子句一起使用,属性
人口_size`将与别名一起返回。
结论
Cypher是一种具有许多功能的广泛查询语言,此备忘单是掌握它们的绝佳起点。如果您是Cypher的新手,我们建议您服用我们为期十天的Cypher email course。
您也可以在Memgraph Playground上浏览我们的Cypher课程,
一个用于在实时数据上运行Cypher查询的在线平台。
如果您对Cypher有任何疑问,那么本文中未介绍的Cypher,请查看我们的Cypher manual。还可以在我们的Discord server上分享您的问题。