完整的Cypher备忘单
#database #memgraph #cypher #graphdatabase

介绍

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):匹配条款指定节点 与两个连接节点的关系模式,标记为CityCountry,通过类型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;

这将从具有标签CountryCity的每个节点中删除标签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 *;

此查询将在节点c1c2之间找到最高10的所有长度路径。

加权最短路径

MATCH (c1:City {name: "London"})-[
        edge_list:ROAD_TO *wShortest 10 (e, n | e.weight) total_weight
    ]-(c2:City {name: "Paris"})
RETURN *;

上面的查询将在节点c1c2之间找到最短的长度路径。长度限制参数是可选的。

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上分享您的问题。

Read more about Cypher query language on memgraph.com